我想使用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上尝试了代码而没有任何成功。有人能指出我正确的方向吗?到目前为止,音频总是从扬声器电话播放。
答案 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);