2011-03-07 92 views
8

我找不到這裏的任何相關職位(但在互聯網上的其他小帖),所以在這裏它是:setMicrophoneMute(布爾)不能在某些設備上工作

AudioManager.setMicrophoneMute(布爾)沒有按」在我測試的某些特定設備上做任何事情:Google Nexus S,Samsung Galaxy S和Motorola Milestone。 在其他任何設備上都可以正常工作。

它甚至保持它的「狀態」並返回一個布爾值,就好像它已被靜音\非靜音,但它不靜音 - 麥克風繼續記錄 - 無論是在GSM呼叫還是在AudioRecord編程錄音中。 沒有指示性日誌消息。

我也搞砸了權限(android.permission.MODIFY_AUDIO_SETTINGS,android.permission.RECORD_AUDIO),這裏沒有什麼新東西。

其他人遇到過嗎?有沒有人有解決方法或魔術解決方案? 如果我使用AudioRecord,我只是爲這些設備實現我自己的「靜音」 - 我不傳遞記錄的緩衝區。但它無法幫助我在需要的GSM呼叫中將麥克風靜音。

感謝

----------------更新----------------

見下文。

+0

你有沒有遇到過這種情況? – Bear 2011-06-22 13:58:19

回答

5

嗨,我有同樣的問題,我想模擬來電屏幕。 ,並在該屏幕中執行靜音的按鈕,以及AudioManager.setMicrophoneMute(布爾值)在大多數手機上都可以使用,但不是全部使用。我找到了解決方法。我在免提套件上模擬按靜音按鈕。它的工作對我希望它會幫助你太 這裏是代碼:

Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON); 
buttonUp.putExtra(Intent.EXTRA_KEY_EVENT,new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_HEADSETHOOK)); 
getBaseContext().sendOrderedBroadcast(buttonUp,"android.permission.CALL_PRIVILEGED"); 
3

未找到解決方案。如果錄製的音頻用作數據緩衝區,請使用靜音PCM數據(用零填充)。如果您需要以編程方式將常規電話靜音,請通知用戶此設備需要從呼叫屏幕進行手動靜音。

我認爲這是最終答案,但請讓我感到驚訝。

2

你可以用這個嘗試:

AudioManager audioManager = ((AudioManager)context.getSystemService(Context.AUDIO_SERVICE)); 
    audioManager.setMode(AudioManager.MODE_NORMAL); 
    if(state) //state-boolean 
    { 
     audioManager.setMicrophoneMute(false); 
     audioManager.setMode(AudioManager.MODE_IN_CALL); 
     state= false; 
    } 
    else 
    { 
     audioManager.setMicrophoneMute(true); 
     state = true; 
    } 
5

,因爲我想編輯包含AAC音頻M4A文件,我有這個問題數據。我想能夠合併它們並添加沉默作爲填充。由於不同設備的每幀毫秒數不同,我決定靜音麥克風並記錄一聲沉默,然後每當我需要填充沉默時反覆重複。 (M4A + AAC靜音比原始PCM更復雜)。

不幸的是,我在Android設備上遇到了很多靜音差異。以下是我所學到的:

  • 除非使用MODIFY_AUDIO_SETTINGS權限,否則靜音將自動失敗。沒有錯誤信息,它只是不會靜音
  • 三星Galaxy Tab 10.1和摩托羅拉Xoom按照您的預期工作。調用audioManager.setMicrophoneMute(true)靜音並將audioManager.setMicrophoneMute(false)取消靜音
  • HTC Inspire(含CyanogenMod 7)和Motorola Droid X將錯誤地返回至audioManager。isMicrophoneMute,但實際上不會被靜音。要解決這個問題,請在您靜音之前調用audioManager.setMode(AudioManager.MODE_IN_CALL)。確保一旦完成屏蔽後,確保將模式改回原來的模式 - 我不確定,但看起來好像在其他應用程序中可能存在問題,如果將其設置爲不正確的模式。
  • 惠普觸摸板,雙向啓動到CyanogenMod 7,不喜歡靜音。它產生無用的錄音文件,並且調用audioManager.setMode()需要五秒鐘才能返回。
  • HTC MyTouch 4G聲稱它是靜音的,但不會在任何我可以找到的條件下自行靜音。
  • HTC Flyer將靜音,但只要您調用mediaRecorder.start()或mediaRecorder.stop(),它將自行取消靜音。您可以再次將其靜音,但可能會首先捕捉到一小部分的聲音。
  • 薑餅設備,無論您是否希望它們,在任何MediaRecorder錄音開始時,都會有半秒鐘和一秒鐘的靜音。整體錄音是正確的長度,第一部分只是沉默,而不是捕捉麥克風當時正在接收的內容。

在我的情況,以產生具有每幀米利斯的適當數目的靜默文件中給定的設備的用途(因此它與其它音頻文件合併時是兼容),我使用類似的代碼這樣:

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
int oldAudioMode = audioManager.getMode(); 
audioManager.setMode(AudioManager.MODE_IN_CALL); 
audioManager.setMicrophoneMute(true); 
MediaRecorder mediaRecorder = new MediaRecorder(); 
int bitRate = 1000 * 160; 
mediaRecorder.setAudioEncodingBitRate(bitRate); 
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
mediaRecorder.setOutputFile(silenceFile.getAbsolutePath()); 
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
mediaRecorder.setAudioSamplingRate(44100); 
try { 
    mediaRecorder.prepare(); 
} catch (IOException ioe) { 
    throw new RuntimeException("could not prepare mediarecorder to create silence file",ioe); 
} 
mediaRecorder.start(); 
audioManager.setMicrophoneMute(true); //re-mute for devices like HTC Flyer that unmute 
try { 
    Thread.sleep(SILENCE_LENGTH_MILLIS); 
} catch (InterruptedException ie) { 
    throw new RuntimeException("could not record silence file", ie); 
} 
mediaRecorder.stop(); 
audioManager.setMicrophoneMute(false); 
audioManager.setMode(oldAudioMode); 
int currentVersion = android.os.Build.VERSION.SDK_INT; 
if (currentVersion <= android.os.Build.VERSION_CODES.GINGERBREAD_MR1) { 
    //cut out beginning half second and use that, since it's always silent on Gingerbread 
} else { 
    //Honeycomb and up 
    //Take end of audio and use that--if the device unmuted itself there may be a little noise at the beginning 
} 

這是一個完整的解決方案嗎?不,有些設備不會靜音。其他設備,如前面提到的HP觸摸板,如果您嘗試靜音,則會導致所有新問題。希望這些提示至少可以幫助大多數Android設備上的用戶靜音。

相關問題