Android - 从耳机播放音频

Dee*_*ala 20 audio android

我想使用android将文件中的音频播放到手机的耳机(或已连接的耳机)中MediaPlayer.我尝试使用此线程中建议的MODE_IN_CALL黑客 - 安卓 - 通过耳机播放音频, 但这没有帮助.该应用程序还具有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); 
Run Code Online (Sandbox Code Playgroud)

要在通话setMode(AudioManager.STREAM_VOICE_CALL);MediaPlayer没有帮助.

mediaPlayer.reset();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
mediaPlayer.setDataSource(path);
mediaPlayer.prepare();
Run Code Online (Sandbox Code Playgroud)

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

Dee*_*ala 36

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

通过耳机播放

mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
Run Code Online (Sandbox Code Playgroud)

通过扬声器电话播放

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
Run Code Online (Sandbox Code Playgroud)

这就对了.任何其他解决方案(包括此处发布的解决方案 - > Android - 通过耳机播放音频)在各种设备上都不能始终如一地工作.事实上,使用MODE_IN_CALL可确保您的音频永远不会在某些设备上播放.

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


wut*_*aer 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();
    }
Run Code Online (Sandbox Code Playgroud)