2012-04-10 18 views
9

我正在編寫一個Android報警應用程序,使用服務來播放鬧鐘鈴聲。目前,我可以播放音頻,但播放的格式可以通過關閉設備的音量來消除。因此,我正在嘗試添加一個致電setAudioStreamType(AudioManager.STREAM_ALARM);以防止發生此情況。(Android MediaPlayer)如果MediaPlayer.create()隱式調用prepare(),我該如何調用setAudioStreamType()?

我有我的onStartCommand()功能的服務如下:

MediaPlayer mMP;  
@Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     try 
     { 
      mMP = MediaPlayer.create(this, R.raw.alarm); 
      mMP.setAudioStreamType(AudioManager.STREAM_ALARM); 
      mMP.setLooping(true); 
      //mMP.prepare(); commented out since prepare() is called in create 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     if (mMP != null) mMP.start(); 

     return START_STICKY; 
    } 

我的問題是與調用setAudioStreamType(),在MediaPlayer從未播放音頻。如果我評論這條線,音頻播放。

隨着時,得到下面的運行時錯誤(S)的行:

04-10 19:32:03.115:E/MediaPlayer的(3411):setAudioStream稱爲在狀態8

04-10 19:32:03.115:E/MediaPlayer的(3411):錯誤(-38,0)

04-10 19:32:03.115:E/MediaPlayer的(3411):開始稱爲狀態0

04-10 19:32:03.115:E/MediaPlayer(3411):錯誤(-38,0)

04-10 19:32:03.115:E/MediaPlayer的(3411):錯誤(-38,0)

04-10 19:32:03.115:E/MediaPlayer的(3411):錯誤( - 38,0)

一些研究(我找不到現在的鏈接)告訴我,prepare()被稱爲後setAudioStreamType()不能叫,那create()隱式調用prepare()

在任何方面,我怎麼會setAudioStreamType()沒有這樣的錯誤?

回答

12

您可以調用mp.reset()然後設置流類型,數據源,然後進行準備。或者只是使用默認構造函數並自己處理初始化。

編輯:

Resources res = getResources(); 
AssetFileDescriptor afd = res.openRawResourceFd(R.raw.alarm); 

mp.reset(); 
mp.setAudioStreamType(AudioManager.STREAM_ALARM); 
mp.setLooping(true); 
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
mp.prepare(); 
mp.start(); 
+0

這聽起來像你的建議沿着這些線路的東西(在調用'創建()'後開始):;''setAudioStreamType();''setLooping();'復位()' 'prepare();' 我是否正確?如果是這樣,我在準備的電話上出現以下錯誤:'04-10 20:06:25.515:E/MediaPlayer(845):在狀態1開始呼叫' '04-10 20:06:25.515:E/MediaPlayer(845):error(-38,0) ' – finiteloop 2012-04-11 00:07:25

+0

好像你在調用'start()'實際上,而不是'prepare()'時會出錯。你可以添加你的更新代碼的問題? – kcoppock 2012-04-11 00:40:22

+0

你是對的,那個特殊的錯誤出現在電話開始後,還有一個錯誤的電話來準備我在發佈我的評論時錯過了日誌。 '04-10 21:42:11.896:E/MediaPlayer(593):在狀態1'中調用prepareAsync。 – finiteloop 2012-04-11 01:43:34

2

接受的答案被拋出IllegalStateException異常。這是工作

MediaPlayer mediaPlayer = new MediaPlayer(); 

try { 
    mediaPlayer.setDataSource(
      this, 
      getCustomToneUri() 
); 

    mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); 

    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
     mp.start(); 
    } 
    }); 

    mediaPlayer.prepareAsync(); 
} catch (IOException e) { 
    e.printStackTrace(); 
}