2012-12-19 156 views
16

我想使用android MediaPlayer將文件中的音頻播放到手機的聽筒(或連接的耳機)中。我嘗試使用MODE_IN_CALL黑客攻擊 - Android - Getting audio to play through earpiece,但這並沒有幫助。該應用程序還具有android.permission.MODIFY_AUDIO_SETTINGS權限,但忽略對m_amAudioManager.setSpeakerphoneOn(false);的任何調用。Android - 從聽筒播放音頻

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

MediaPlayersetMode(AudioManager.STREAM_VOICE_CALL);調用沒有幫助。

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

自從android 2.3破解了這段代碼後,有什麼改變了嗎?我嘗試了Android ICS上的代碼,但沒有取得任何成功。有人能指引我朝着正確的方向嗎?音頻始終從揚聲器電話播放到目前爲止。

+0

請點擊這裏查看我的回答: http://stackoverflow.com/a/29881184/672773 希望它幫助:) – Machete

回答

27

事實證明,正確的做法是通過以下代碼。

播放通過耳件

mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 

播放,通過揚聲器電話

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

這就是它。任何其他解決方案(包括此處發佈的解決方案 - >Android - Getting audio to play through earpiece)都不能在各個設備上始終如一地運行。實際上,使用MODE_IN_CALL可確保您的音頻永不在某些設備上播放。

注意:您將需要重新準備媒體播放器以更改流。

+0

我必須嘗試一下。我一直在使用您引用多年的帖子中的解決方案,而沒有真正的問題。我已經對其他應用程序中的音頻奇怪更改進行了一些隨機投訴,但他們無法得到證實。我會檢查一下,這聽起來像是一個更好的解決方案。我從不喜歡我的解決方案,即使通過它的工作。 – Piwaf

+0

具體而言,Samsung Galaxy S2和Micromax上運行的某些固件版本會在其他帖子中遇到問題。如果你仍然在使用它,我建議移動到這個代碼片段。到目前爲止,它並沒有讓我失望。 –

+0

這種方法似乎需要在切換模式時重新「準備」MedialPlayer。那也是你的經歷嗎? – Piwaf

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實現中有些東西搞砸了。

+0

的手機能夠從其他應用聽筒播放。我無法單獨使用我的應用程序。 –

+0

@Gaffi:聽起來像是你得到編譯時錯誤而不是運行時錯誤。也許你還沒有導入反射包?如果您使用Eclipse,它應該自動提供有關如何解決這些問題的建議。 – Michael

3

我只是想爲Deepak Bala的答案添加一個完整的示例。

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(); 
    } 
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); 
0

This method是爲我工作的罰款:它不使用MediaPlayer.create()方法時的作品。

您還需要設置音頻管理器模式。然後使用audiomgr.setSpeakerphoneOn(false)api你可以切換。

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

下面的代碼工作正常,我和我已經測試在多臺設備上:

1-創建實例:

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

2 - 如果你想音量設置爲max(可選)

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,當我嘗試其他模式,在許多情況下,我無法打開和關閉揚聲器!