java - Android AudioManager,静音后无法取消静音

标签 java android android-resources android-audiomanager

我在我的应用程序中构建了一个简单的视频播放器。

我只想通过耳机而不是扬声器播放音频。

所以,我执行以下操作

创建时

AudioManager audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

...

@SuppressWarnings("deprecation")
private void checkJack() {
    if(Constants.HEADSET_ONLY && !musicReceiverStarted) {
        Log.v(TAG + " | AudioManager checkJack", "Running checkJack()");
        audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        try 
         {

            if(!audio.isWiredHeadsetOn()) {
                Log.v(TAG + " | AudioManager checkJack", "Headset is unplugged");
                audio.setStreamMute(AudioManager.STREAM_MUSIC, true); // Mute
                Toast.makeText(DuplicatedPlayerActivity.this, "Please plug in your headset to enjoy the sound.", Toast.LENGTH_SHORT).show();
            }
            else {
                Log.v(TAG + " | AudioManager checkJack", "Headset is plugged");
                audio.setStreamMute(AudioManager.STREAM_MUSIC, false); // UnMute
            }
        } 
        catch (Exception e) { e.printStackTrace(); }
    }
}//end checkJack

然后我就有了一个接收器:

private class MusicIntentReceiver extends BroadcastReceiver {
    @Override 
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {

            musicReceiverStarted = true;
            audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
            int state = intent.getIntExtra("state", -1);
            switch (state) {

                case 0:
                    Log.d(TAG + " | AudioManager", "Headset is unplugged");
                    audio.setStreamMute(AudioManager.STREAM_MUSIC, true); // Mute
                    Toast.makeText(DuplicatedPlayerActivity.this, "Please plug in your headset to enjoy the sound.", Toast.LENGTH_SHORT).show();
                    break;

                case 1:
                    Log.d(TAG + " | AudioManager", "Headset is plugged");
                    audio.setStreamMute(AudioManager.STREAM_MUSIC, false); // UnMute
                    break;

                default:
                    Log.d(TAG + " | AudioManager", "I have no idea what the headset state is");
                    audio.setStreamMute(AudioManager.STREAM_MUSIC, true); // Mute
                    Toast.makeText(DuplicatedPlayerActivity.this, "Please plug in your headset to enjoy the sound.", Toast.LENGTH_SHORT).show();
            }
        }//end if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG))
    }//end onReceive
}//end MusicIntentReceiver

现在的问题是:两个函数都运行正确。但是在 checkJack() 中音频被静音之后;它不会在 MusicIntentReceiver() 中取消静音;

此外,MusicIntentReceiver() 仅在插孔状态发生更改时才会执行。所以我第一次不能用它来静音,因为它永远不会被执行。

任何建议。

最佳答案

使您的音频管理器全局化,然后创建一个 boolean 值以确保您只静音一次。

另请参阅 Mute the global sound in Android

private void muteAudio() {      
    audio = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
    audio.setStreamMute(AudioManager.STREAM_NOTIFICATION,   true);
    audio.setStreamMute(AudioManager.STREAM_ALARM,          true);
    audio.setStreamMute(AudioManager.STREAM_MUSIC,          true);
    audio.setStreamMute(AudioManager.STREAM_RING,           true);
    audio.setStreamMute(AudioManager.STREAM_SYSTEM,         true);

    isAudioMuted = true;
}

private void unmuteAudio() {
    audio = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
    audio.setStreamMute(AudioManager.STREAM_NOTIFICATION,   false);
    audio.setStreamMute(AudioManager.STREAM_ALARM,          false);
    audio.setStreamMute(AudioManager.STREAM_MUSIC,          false);
    audio.setStreamMute(AudioManager.STREAM_RING,           false);
    audio.setStreamMute(AudioManager.STREAM_SYSTEM,         false);

    isAudioMuted = false;
}

关于java - Android AudioManager,静音后无法取消静音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29555190/

相关文章:

android - 在eclipse中导出Android应用程序时无法输入 keystore 第二个密码

android - 以编程方式更改按钮图像 drawableLeft 无法在 android 中工作

android - Android 上的 res/values/public.xml 文件有什么用?

java - 在 Gradle 构建中替换文件

java - 如何混合来自 DatagramPackets 的多个实时语音音频流?

java - (Java) 包组织是否有最佳实践?

android - 如何从库项目中的项目获取资源

java - 如何通过@ManagedProperty 注解注入(inject)整个托管bean?

java - 发卡时能唤醒设备吗?

android - EditText 高度-长度