【问题标题】:Android 5.0+ AudioManager setMode not workingAndroid 5.0+ AudioManager setMode 不工作
【发布时间】:2015-08-07 06:47:54
【问题描述】:

我正在开发 Android SystemService 的 AudioManager。 使用 Android System 5.0+ 时,我遇到了 AudioManager 的 setMode 方法不起作用的问题。

我通过测试, Android M, Lollipop.. 5.0+ 版本,AudioManager setMode 不工作。 示例:

public void initAudioImageIcon(boolean initLoad) {
    boolean isAudioHeaderMode = IMSharedPreferences.getBooleanExtra(this, IMSPConstant.SP_NAME_MESSAGE,
            IMSPConstant.SP_KEY_AUDIO_HEADER_MODE);


    if (isAudioHeaderMode) {
        mAudioHanderMode.setVisibility(View.VISIBLE);
        // audioManager.setMode(AudioManager.MODE_IN_CALL) , but android system 5.0+ no any change, getMode() == AudioManager.MODE_NORMAL
        setAudioMode(AudioManager.MODE_IN_CALL);
        audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);
        if (!initLoad) {
            showAudioModePrompt(this.getText(R.string.im_audio_in_call), 1000);
        }
    } else {
        mAudioHanderMode.setVisibility(View.GONE);
        setAudioMode(AudioManager.MODE_NORMAL);
        if (!initLoad) {
            showAudioModePrompt(this.getText(R.string.im_audio_in_speeker), 1000);
        }
    }
}

但是Android 3.0+,4.0+ 还可以,只有5.0+。 所以,我不知道哪里会出错。

【问题讨论】:

    标签: android android-audiomanager


    【解决方案1】:

    音频模式设置为:

    setMode(AudioManager.MODE_IN_COMMUNICATION);
    setSpeakerphoneOn(false);
    

    当我的音频流设置为 STREAM_MUSIC 时,我可以轻松地将音频路由到听筒。我自己在 AOSP Lollipop 代码中测试过。

    在您从未提到过您的流类型的问题中。请将您的流设置为 STREAM_MUSIC 或 STREAM_VOICE_CALL,代码应该也适合您。

    【讨论】:

    • 我听从你的建议,我的流类型是://audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL); audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 我测试的耳机代码是:setAudioMode(AudioManager.MODE_IN_COMMUNICATION); audioManager.setSpeakerphoneOn(false); ,扬声器代码是:setAudioMode(AudioManager.MODE_NORMAL); audioManager.setSpeakerphoneOn(true);。该代码无法在听筒中使用,与您的建议有什么不同吗?我尝试了测试我的 Lollipop 和 M 的 STREAM_MUSICSTREAM_VOICE_CALL 流类型,它无法工作。
    • getStreamMaxVolume 不是设置流的方法。请在您尝试播放的音频源中设置流。阅读 Android 文档并尝试一下。此代码在棒棒糖中 100% 有效。
    • 非常抱歉,我犯了一个大错误,什么 getStreamMaxVolume as setStreamType 。谢谢。
    • @Saurav 我们可以为 webview 设置流类型吗?
    • 因为这是 audiomanager api,如果你有 audiomanager 实例,你可以从任何地方调用它。
    【解决方案2】:

    在 android Lollipop setAudioMode(AudioManager.MODE_IN_CALL) 中受到限制。它只能由具有MODIFY_PHONE_STATE 权限的系统应用程序使用。但是,您可以在普通应用程序中使用MODE_IN_COMMUNICATIONMODE_NORMAL

    【讨论】:

    • 谢谢,原来如此。但MODE_IN_COMMUNICATIONMODE_NORMAL 是说话者的声音。如果我想使用手机模式将我的应用程序放在/system/app 文件夹中以提高应用程序级别?还有其他方法吗?
    • 我不太理解您的查询,但我猜您正在尝试在听筒中播放音频。为此,您可以将模式设置为 MODE_IN_COMMUNICATION 并将扬声器设置为 false。如果对您有帮助,请对我的回答进行投票。
    • 对不起,我试试。 audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL); setAudioMode(AudioManager.MODE_IN_COMMUNICATION); audioManager.setSpeakerphoneOn(false); 但它总是在扬声器中播放音频。我想在听筒中播放音频。我的 Android 设备是 Android M。
    • 我尝试setMode( AudioManager.MODE_IN_COMMUNICATION ),但getMode() 为0(AudioManager.MODE_NORMAL)。我猜是音频总是在扬声器中的原因。因为模式是0。没有变化!
    • 请问您可以发布您的音频源初始化代码吗?像 AudioTrack 或 Soundpool ??在该初始化中,您必须设置流。对于 SoundPool : SoundPool(int maxStreams, int streamType, int srcQuality) 对于音轨,代码如下所示: AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes, int mode, int sessionId)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 2015-04-06
    • 2016-12-22
    相关资源
    最近更新 更多