2011-03-07 101 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设备上的用户静音。

相关问题