2011-08-14 113 views
11

我試過在我的應用程序中使用下面的代碼設置媒體播放器的音頻流,但是當我這樣做時,我聽不到模擬器中的聲音。如果我沒有爲播放器設置流,那麼音頻播放正常。我確定我使用這個錯誤,但不能鍛鍊如何,有什麼幫助?Android MediaPlayer - 如何在STREAM_ALARM中播放?

MediaPlayer player = MediaPlayer.create(getApplicationContext(), R.raw.test_audio); 

AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE); 
audioManager.getStreamVolume(AudioManager.STREAM_ALARM); 
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM), AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); 
player.setAudioStreamType(AudioManager.STREAM_ALARM); 
player.start(); 

注意:我已經將MODIFY_AUDIO_SETTINGS權限添加到我的清單中了。

謝謝!

回答

0

嘗試以下操作:

player.setAudioStreamType(AudioManager.STREAM_ALARM); 
player.prepare(); 
player.start(); 

爲什麼你叫 「audioManager.getStreamVolume(AudioManager.STREAM_ALARM);」?該值不存儲在一個變量,所以它是沒有用處;)

我希望幫助

+0

我用player.prepare()試過了,但沒有任何區別。仍然沒有音頻播放。我將流量存儲到稍後在我的應用中使用的變量中,我暫時拿出作業來幫助調試。 – James

19

我不知道爲什麼會發生這種事,但是下面的作品的代碼。您應該使用setDataSource()而不是create()來設置數據源。

此代碼:

MediaPlayer mp = new MediaPlayer(); 
mp.setAudioStreamType(AudioManager.STREAM_ALARM); 
mp.setDataSource(this,Uri.parse("android.resource://PACKAGE_NAME/"+R.raw.soundfile)); 
mp.prepare(); 
mp.start(); 

此代碼工作:

MediaPlayer mp = MediaPlayer.create(this, R.raw.soundfile); 
mp.setAudioStreamType(AudioManager.STREAM_ALARM); 
mp.prepare(); 
mp.start(); 
+1

更好地寫出這樣的uri:'Uri.parse(「android.resource://」+ mContext.getPackageName()+「/」+ R.raw.sound)' –

2

1. setAudioStreamType(INT流類型)

必須調用此方法前準備( );

2. MediaPlayer.create(上下文的背景下,INT渣油)

成功時,準備()將已經被稱爲,不得再次調用。

3

問題是您正在使用MediaPlayer.create()來創建MediaPlayer。 Create函數調用prepare()函數來完成您的媒體,並且不允許您更改AudioStreamType

該溶液是用setDataSource代替create

MediaPlayer mp = new MediaPlayer(); 
mp.setAudioStreamType(AudioManager.STREAM_ALARM); 
mp.setLooping(true); 
try { 
    mp.setDataSource(getApplicationContext(), yourAudioUri); 
    mp.prepare(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
mp.start(); 

更多信息參見this link