android sdk错误-AudioManager.isMicrophoneMute()始终为false

android sdk错误-AudioManager.isMicrophoneMute()始终为false,android,audio,mute,Android,Audio,Mute,正如标题所述,AudioManager.isMicrophoneMute()无论发生什么情况,总是返回false 设置: 清单包含此权限,因为可能与此相关的旧错误。老问题是检查是否使用了耳机。没有帮助,但也没有伤害 从telnet发起对模拟器的调用 接电话 检查app-statusaudioManager.getMode()==audioManager.MODE\u调用中的是否为true。好的,我们很好 状态检查audioManager.isMicrophoneMute()为false-好的,

正如标题所述,
AudioManager.isMicrophoneMute()
无论发生什么情况,总是返回false

设置:

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

  • 从telnet发起对模拟器的调用
  • 接电话
  • 检查app-status
    audioManager.getMode()==audioManager.MODE\u调用中的
    是否为
    true
    。好的,我们很好
  • 状态检查
    audioManager.isMicrophoneMute()
    false
    -好的,我们仍然很好
  • 切换回手机并按下静音按钮
  • 切换到应用程序,检查audioManager.isMicrophoneMute(),它仍然是
    false
    -不好。应该是真的
  • 那么这是一个坏的API吗?或者我需要其他权限吗?或者这在Emulator上不起作用


    谢谢。

    我做了一个小调查,检查了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
    (我在源代码中进行了检查)。因此,在这种情况下,状态是tophone,这是GSMPhone类的一个实例。此类与RIL套接字通信,并将相应的请求发送到setMute(
    RIL\u request\u SET\u MUTE
    )。因此,在命令路径上,AudioManager的状态不会更新。同样,我没有看到AudioManager在更改麦克风状态时通知RIL


    因此,如果您向AudioManager询问麦克风的状态,它将返回默认值(为false)。我不知道这种行为是预期的还是一个bug。你可以在android平台组中提问,并链接到这个问题和bug

    这现在在5.x棒棒糖中有效。在4.x中仍然不起作用。也许谷歌不会为旧的操作系统修复它

    与android SDK交叉发布为bug。谢谢,那是些很巧妙的侦探工作。你知道我是否可以强行覆盖
    R.bool。在配置文件中将\u mic\u mute\u发送到\u AudioManager
    ,或者将代码设置为
    true
    ?如果你想构建自己的Android映像并使用它,你只需将此值更改为false即可。如果你问我如何在一个真正的设备上改变这个,那么我不知道。谢谢。是的,不是想树立自己的形象。这将被用于一个应用程序中。奖励奖金,但不按回答进行标记,因为它指出了问题,但无法解决问题。感谢所有审阅我的问题的人和@Yury提供的攻击角度。