按下按钮,在耳机和扬声器之间切换

BC2*_*BC2 9 android button toggle speakerphone

我试图通过按钮在两者之间切换来播放扬声器和耳机的音频.问题是我试图默认音频从耳机播放,但没有任何结果.然后当我按下按钮切换到扬声器时,仍然没有音频播放.我正在播放本地原始文件.

我在Manifest中也有android.permission.MODIFY_AUDIO_SETTINGS.

这是我的代码:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    context = getActivity().getBaseContext();

    am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

    am.setMode(AudioManager.MODE_IN_CALL);
    am.setSpeakerphoneOn(false);
    am.setBluetoothScoOn(true);
    speakerON = false;
}

@Override
public void onClick(View v)
{               
    switch (v.getId())
    {

        case R.id.buttonSpeaker:
            if(!speakerON)//speaker off
            {
                speakerON = true;
                am.setMode(AudioManager.MODE_NORMAL);
                am.setSpeakerphoneOn(true);
                am.setBluetoothScoOn(false); 
                speaker.setCompoundDrawablesWithIntrinsicBounds(android.R.drawable.ic_lock_silent_mode_off, 0, 0, 0);
            }
            else
            {
                speakerON = false;
                am.setMode(AudioManager.MODE_IN_CALL);
                am.setSpeakerphoneOn(false);
                am.setBluetoothScoOn(true);
                speaker.setCompoundDrawablesWithIntrinsicBounds(android.R.drawable.ic_lock_silent_mode, 0, 0, 0);
            }

            break;

    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我设置MediaPlayer的方法:

mediaPlayer = MediaPlayer.create(getActivity().getBaseContext(), R.raw.test_message);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
mediaPlayer.start();
Run Code Online (Sandbox Code Playgroud)

BC2*_*BC2 10

事实证明我设置了错误的模式.

这是更新的媒体播放器:

mediaPlayer = MediaPlayer.create(getActivity().getBaseContext(), R.raw.test_message);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.start();
Run Code Online (Sandbox Code Playgroud)

然后我将音频管理器的模式设置为:

context = getActivity().getBaseContext();

am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);        
am.setMode(AudioManager.MODE_IN_CALL);
am.setSpeakerphoneOn(false);
Run Code Online (Sandbox Code Playgroud)

然后它奏效了.因此,请确保媒体播放器和音频管理器处于相同模式.

  • 基本上,AudioManager.STREAM_MUSIC和MODE_IN_CALL是相同的值.应该是MODE_IN_CALL.它适用于上述情况,因为我认为它们都具有值"3".但是,正如Ivan指出的那样,应该使用MODE_IN_CALL. (3认同)