Android - 从耳机播放音频

时间:2012-12-19 20:05:44

标签: android audio

我想使用android MediaPlayer将文件中的音频播放到手机的耳机(或已连接的耳机)中。我尝试使用此线程中建议的MODE_IN_CALL hack - Android - Getting audio to play through earpiece,但这没有帮助。该应用还具有 android.permission.MODIFY_AUDIO_SETTINGS 权限,但忽略对m_amAudioManager.setSpeakerphoneOn(false);的任何调用。

private AudioManager m_amAudioManager;  
m_amAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);  
m_amAudioManager.setMode(AudioManager.MODE_IN_CALL); 
m_amAudioManager.setSpeakerphoneOn(false); 

setMode(AudioManager.STREAM_VOICE_CALL);MediaPlayer的来电也没有帮助。

mediaPlayer.reset();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
mediaPlayer.setDataSource(path);
mediaPlayer.prepare();

自从android 2.3打破这段代码后有什么变化吗?我在Android ICS上尝试了代码而没有任何成功。有人能指出我正确的方向吗?到目前为止,音频总是从扬声器电话播放。

8 个答案:

答案 0 :(得分:34)

事实证明,正确的方法是通过以下代码。

通过耳机播放

mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);

通过扬声器电话播放

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

就是这样。任何其他解决方案(包括此处发布的解决方案 - > Android - Getting audio to play through earpiece)在各种设备上都不能保持一致。事实上,使用MODE_IN_CALL可以确保您的音频从不在某些设备上播放。

注意:您需要重新准备媒体播放器以更改流。

答案 1 :(得分:5)

我只是想为Deepak Bala的答案添加一个完整的例子。它在不使用MediaPlayer.create()方法时有效:

    this.player = new MediaPlayer(); 
    this.player.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);

    try {
        this.player.setDataSource(getContext(), Uri.fromFile(new File(m.localFileUrl)));
        this.player.prepare();
    } catch (IllegalStateException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

答案 2 :(得分:2)

以下代码适用于我,我已经在多个设备上进行了测试:

1-创建实例:

MediaPlayer mPlayer = MediaPlayer.create(MainActivity.this, R.raw.skype_call_dialing);
AudioManager mAudioManager = ((AudioManager).getSystemService(Context.AUDIO_SERVICE));

2-如果要将音量设置为最大值(可选)

 int maxVolumeMusic = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
 mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolumeMusic, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
 mAudioManager.setMode(AudioManager.STREAM_MUSIC);

从听筒中播放3组音频:

mAudioManager.setSpeakerphoneOn(false);

4-玩:

mPlayer.setLooping(true);
mPlayer.start();

完成!!!!但是我要与你分享一些提示:

1-在步骤2中,如果在AudioManager.setStreamVolume()之前设置Audiomanager.setMode(),则音量不会设置为max!

2-如果你在mPlayer.setLooping(true)之前添加mPlayer.prepare();它会导致崩溃!你不应该使用mPlayer.prepare()而mPlayer正在这样初始化:

MediaPlayer mPlayer = MediaPlayer.create(MainActivity.this, R.raw.skype_call_dialing);

3-在步骤2中,mAudioManager.setMode()我使用AudioManager.STREAM_MUSIC,当我尝试其他模式时,在很多情况下我无法打开和关闭扬声器!

答案 3 :(得分:1)

好吧,我的问题是通过使用以下代码解决的

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

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

答案 4 :(得分:0)

那么:

// Make sure that streams following the PHONE routing strategy aren't forced
// to play in the speaker.
Class audioSystemClass = Class.forName("android.media.AudioSystem");
Method setForceUse = audioSystemClass.getMethod("setForceUse",
    int.class,
    int.class);
// First 0 == FOR_COMMUNICATION, second 0 == FORCE_NONE.
setForceUse.invoke(null, 0, 0);

然后使用STREAM_VOICE_CALL作为您的MediaPlayer。

如果setForceUse呼叫成功并且来自MediaPlayer的音频仍在扬声器中播放,那么我会说在您正在测试它的手机/平板电脑上的AudioPolicyManager实施中搞砸了一些内容。

答案 5 :(得分:0)

我发现我需要设置媒体播放器和Audiomanager

private MediaPlayer mp = new MediaPlayer();
AudioManager mAudioManager = (AudioManager) v.getContext()
                                .getSystemService(Context.AUDIO_SERVICE);
                        mAudioManager.setSpeakerphoneOn(false);
                        mp.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);

答案 6 :(得分:0)

This method对我来说很好。

  

您还需要设置音频管理器模式。然后使用audiomgr.setSpeakerphoneOn(false)api,你可以切换。

AudioManager audiomgr = (AudioManager) 
    context.getSystemService(Context.AUDIO_SERVICE);
audiomgr.setMode(AudioManager.STREAM_MUSIC);
audiomgr.setSpeakerphoneOn(false);

答案 7 :(得分:0)

Audio Manager 扬声器电话问题仅通过这种方式解决:

AudioManager audiomgr = (AudioManager) 
    context.getSystemService(Context.AUDIO_SERVICE);
audiomgr.setMode(AudioManager.MODE_IN_COMMUNICATION);
audiomgr.setSpeakerphoneOn(false);