21

我想使用 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);对on the的调用MediaPlayer也无济于事。

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

自 android 2.3 以来有什么改变来破坏这个代码吗?我在 Android ICS 上尝试了代码,但没有成功。有人能指出我正确的方向吗?到目前为止,音频始终从免提电话播放。

4

8 回答 8

39

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

通过耳机播放

mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);

通过免提电话播放

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

这就对了。任何其他解决方案(包括此处发布的解决方案 -> Android - Getting audio to play through earpiece)在不同设备上都无法始终如一地工作。事实上,使用 MODE_IN_CALL 可确保您的音频永远不会在某些设备上播放。

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

于 2013-03-06T18:46:00.850 回答
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();
    }
于 2016-05-11T08:58:34.550 回答
4

好的,在我的情况下,问题已通过使用以下代码解决

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

    mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
    mAudioManager.setSpeakerphoneOn(false);
于 2018-12-24T12:11:13.947 回答
3

以下代码对我来说很好,我已经在多个设备上进行了测试:

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(),则音量不会设置为最大!

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

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

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

于 2017-12-31T08:05:07.697 回答
1

这种方法对我来说效果很好。

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

AudioManager audiomgr = (AudioManager) 
    context.getSystemService(Context.AUDIO_SERVICE);
audiomgr.setMode(AudioManager.MODE_IN_COMMUNICATION);
audiomgr.setSpeakerphoneOn(false);
于 2017-05-20T21:41:14.063 回答
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 实现中出现了一些问题。

于 2012-12-19T21:38:00.887 回答
0

Audio Manager 免提电话问题只能通过这种方式解决:

AudioManager audiomgr = (AudioManager) 
    context.getSystemService(Context.AUDIO_SERVICE);
audiomgr.setMode(AudioManager.MODE_IN_COMMUNICATION);
audiomgr.setSpeakerphoneOn(false);
于 2021-02-15T17:47:44.180 回答
0

我发现我需要同时设置媒体播放器和音频管理器

private MediaPlayer mp = new MediaPlayer();
AudioManager mAudioManager = (AudioManager) v.getContext()
                                .getSystemService(Context.AUDIO_SERVICE);
                        mAudioManager.setSpeakerphoneOn(false);
                        mp.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
于 2017-05-18T09:50:18.290 回答