0

我正在寫一個鬧鐘(有點)應用程序,它使用RTC_WAKEUP標誌向AlarmManager註冊廣播意圖,以在指定的時間關閉。 Works ...當使用AlarmManager開始活動時,MediaPlayer無法播放

接收到廣播時,接收器啓動一個活動,使用STREAM_ALARM流與MediaPlayer一起播放鈴聲,並執行其他一些操作。所有的工作,但如果在屏幕關閉時收到廣播,活動啓動正確,但鈴聲不播放。如果在屏幕打開和解鎖時收到鈴聲,則可正常播放鈴聲。

被編輯爲添加播放鈴聲的活動中的代碼。

public void onCreate(Bundle bundle) { 
    super.onCreate(bundle) 
    ... 
    Window window = getWindow(); 
    window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
    window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
    window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
    ringtonePlayer = new MediaPlayer(); 
    ... 
    playRingtone(); 
} 

private void playRingtone() throws IllegalArgumentException, SecurityException,  IllegalStateException, IOException { 
    ringtonePlayer.setDataSource(prefs.getString(getRingTone(), RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE).toString())); 

    ringtonePlayer.setAudioStreamType(AudioManager.STREAM_ALARM); 
    ringtonePlayer.setWakeMode(this, PowerManager.PARTIAL_WAKE_LOCK); 
    ringtonePlayer.setLooping(true); 
    ringtonePlayer.prepare(); 
    ringtonePlayer.start(); 
    Log.i(LOG_TAG, "Ringtone started"); 
} 
+0

嘿夥計,你有辦法解決嗎?我問,因爲我有同樣的問題,也許我有一個解決方案。你想在你的活動中做什麼?你有沒有設置自定義視圖setContentView或其他一些UI的東西? – Opiatefuchs

回答

0

嘗試增加

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 

到啓動MediaPlayer

您需要使用這個功能在屏幕上,並解開它,如果你想,以前Activity將啓動Activity

+0

問題不在於活動開始。該活動啓動並顯示正確,只是不播放鈴聲。 – Inn0vative1

+0

好的,只有當屏幕關閉?也許發佈的代碼,當屏幕打開,但不是當它關閉 – codeMagic

4

這是一個較舊的帖子,但我有同樣的問題,並認爲我知道這裏缺少什麼。這只是一個假設,不會看到更多的代碼,但通常,如果使用mediaPlayer,最好在onStop()和onPause()中停止它(或在onPause()中暫停它)。如果你已經這樣做了,那麼可能會有一個解決方案。在onPause或onStop,不要撥打:

mMediaPlayer.stop(); 

(以及所有需要的東西,如發佈等)。因爲當您調用WakeLock並設置Flags以使屏幕保持打開等狀態時,在onCreate完成後,onStop()和onPause()會針對您的活動多次調用。這是有我的設備的三星Galaxy S3採用Android 4.1.2相反,在檢測到我,讓不確定它是否完成的MediaPlayer停止,這樣做:

if(this.isFinishing()){ 

     mMediaPlayer.stop(); 

    } 

有了這個,你得確保它是隻叫當你的活動真的完成了。這應該工作。在的onResume

+0

這個答案拯救了我的生活。謝謝 – Asu

1

調用play - 這個工作對我來說

public class AlarmActivity extends Activity { 
    private Uri uri = null; 
    private int volume; 
    private MediaPlayer mp = null; 

    private void play() { 
     if (uri == null) { 
      return; 
     } 
     mp = new MediaPlayer(); 
     AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
     audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC) * volume/100, 0); 
     mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mp.setOnPreparedListener(mpOnPrepared); 
     mp.setOnCompletionListener(mpOnCompletion); 
     try { 
      mp.setDataSource(this, uri); 
      mp.prepare(); 
     } catch (IOException e) { 
      mp.release(); 
      mp = null; 
      return; 
     } 
    } 

    private OnPreparedListener mpOnPrepared = new OnPreparedListener() 
    { 
     @Override 
     public void onPrepared(MediaPlayer mp) 
     { 
      mp.start(); 
     } 
    }; 

    private OnCompletionListener mpOnCompletion = new OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mp) { 
      mp.release(); 
      mp = null; 
     } 
    }; 

    private void stop() { 
     if (mp != null) { 
      mp.release(); 
      mp = null; 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     setContentView(R.layout.activity_alarm); 

     getWindow().addFlags(
      WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | 
      WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | 
      WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
      WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 

     SharedPreferences sp = getSharedPreferences("settings", MODE_PRIVATE); 
     uri = Uri.parse(sp.getString("uri", "")); 
     volume = sp.getInt("volume", 100); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     play(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     stop(); 

     finish(); 
    } 
} 
相關問題