我一直在寻找几天,但却找不到合适的解决方案。
我正在尝试检查后台的任何应用是否正在使用麦克风,因此我的应用可以使用它,否则我只想显示消息"另一个应用使用的麦克风"。
我尝试检查后台中的所有应用程序及其权限,但这并没有解决我的问题,因为有wearable.app包请求权限,但它不会影响音频,或者它没有使用它。
我尝试了其他可以在这里或谷歌上找到的解决方案,但这似乎都不是正确的方法。
我只想检查麦克风是否未被使用,因此我的应用可以使用它。
任何建议我都会感激。
答案 0 :(得分:12)
在搜索更多后,我找到了解决方案,我在这里为任何需要它的人添加它更容易找到它。
private boolean validateMicAvailability(){
Boolean available = true;
AudioRecord recorder =
new AudioRecord(MediaRecorder.AudioSource.MIC, 44100,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_DEFAULT, 44100);
try{
if(recorder.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED ){
available = false;
}
recorder.startRecording();
if(recorder.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING){
recorder.stop();
available = false;
}
recorder.stop();
} finally{
recorder.release();
recorder = null;
}
return available;
}
答案 1 :(得分:2)
你可以反过来做。
在您的应用中获取麦克风。
获取已获得RECORD权限的已安装应用的列表。
然后检查这些应用程序中的一个是否在前台,是否有一个释放麦克风,以便其他应用程序可以使用它(例如,当发生电话呼叫时)。
有点肮脏的练习,但我认为这正是你要找的。 p>
干杯!
答案 2 :(得分:1)
这是怎么做的
AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
if(am.getMode()==AudioManager.MODE_IN_COMMUNICATION){
//Mic is in use
}
MODE_NORMAL -> You good to go. Mic not in use
MODE_RINGTONE -> Incoming call. The phone is ringing
MODE_IN_CALL -> A phone call is in progress
MODE_IN_COMMUNICATION -> The Mic is being used by another application
答案 3 :(得分:1)
AudioManager.AudioRecordingCallback()
am.registerAudioRecordingCallback(new AudioManager.AudioRecordingCallback() {
@Override
public void onRecordingConfigChanged(List<AudioRecordingConfiguration> configs) {
super.onRecordingConfigChanged(configs);
try {
isMicOn = configs.get(0) != null;
}catch (Exception e)
{
isMicOn = false;
}
if (isMicOn) {
//microphone is on
} else {
// microphone is off
}
Toast.makeText(context, isMicOn ? "Mic on" : "Mic off", Toast.LENGTH_SHORT).show();
}
}, null);
答案 4 :(得分:0)
我知道这可能听起来有点乏味或漫长的道路......但你有没有考虑过录制logcat?记录内核和应用程序的日志。重新创建问题,然后比较两个日志以查看内核使用麦克风时占用的程序。