我进行了一项小型研究并检查了 Android 的来源。实际上,问题出在文件中的默认电话应用程序中packages/apps/Phone/src/com/android/phone/PhoneUtils.java
。这是功能:
/**
* Internally used muting function.
*/
private static void setMuteInternal(Phone phone, boolean muted) {
final PhoneGlobals app = PhoneGlobals.getInstance();
Context context = phone.getContext();
boolean routeToAudioManager =
context.getResources().getBoolean(R.bool.send_mic_mute_to_AudioManager);
if (routeToAudioManager) {
AudioManager audioManager =
(AudioManager) phone.getContext().getSystemService(Context.AUDIO_SERVICE);
if (DBG) log("setMuteInternal: using setMicrophoneMute(" + muted + ")...");
audioManager.setMicrophoneMute(muted);
} else {
if (DBG) log("setMuteInternal: using phone.setMute(" + muted + ")...");
phone.setMute(muted);
}
app.notificationMgr.updateMuteNotification();
}
您可以看到,如果您单击静音按钮,电话应用程序会检查R.bool.send_mic_mute_to_AudioManager
安装到的参数false
(我检查了源代码)。因此,在这种情况下,状态是电话,它是 GSMPhone 类的一个实例。此类与 RIL 套接字通信并在那里向 setMute ( RIL_REQUEST_SET_MUTE
) 发送适当的请求。因此,AudioManager 的状态在命令路径上没有任何地方更新。同样,我没有看到 AudioManager 在更改麦克风状态时通知 RIL。
因此,如果您向 AudioManager 询问麦克风的状态,它会返回默认值(即为 false)。我不知道这种行为是预期的还是这是一个错误。您可以在 android-platform 组中提问并链接到此问题和错误。