4

正如标题所述AudioManager.isMicrophoneMute(),无论如何总是返回错误。

设置:

清单包含此权限,因为可能与此相关的较旧错误。旧错误是关于检查是否使用耳机。没有帮助,但也没有伤害。

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

  1. 从 telnet 发起对模拟器的调用。
  2. 拿起电话
  3. 检查应用程序状态audioManager.getMode() == audioManager.MODE_IN_CALLtrue。好的,我们很好
  4. 状态检查audioManager.isMicrophoneMute()false- 好的,我们仍然很好
  5. 切换回手机并按下静音按钮
  6. 切换到应用程序,检查audioManager.isMicrophoneMute()仍然 false- 不好。应该是真的。

那么这是一个损坏的 API 吗?还是我需要一些其他权限?或者这在模拟器上不起作用?

谢谢你。

4

2 回答 2

5

我进行了一项小型研究并检查了 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 组中提问并链接到此问题和错误。

于 2013-02-08T16:03:41.747 回答
0

这现在适用于 5.x Lollipop。在 4.x 中仍然不起作用。也许谷歌只是不会为旧操作系统修复它。

于 2015-03-25T15:46:36.700 回答