使用AlarmManager启动活动时,MediaPlayer不会播放

Inn*_*ve1 1 android broadcastreceiver alarmmanager android-mediaplayer

我正在编写一个警报(kinda)应用程序,它使用带有RTC_WAKEUP标志的AlarmManager注册广播意图,以便在指定时间关闭.作品...

当接收到广播时,接收器使用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");
}
Run Code Online (Sandbox Code Playgroud)

Opi*_*chs 5

这是一篇较旧的帖子,但我遇到了同样的问题,并认为我知道这里缺少什么.这只是一个没有看到更多代码的假设,但通常,如果你使用mediaPlayer,最好在onStop()和onPause()中停止它(或者在onPause()中暂停它).如果你已经这样做了,这里有一个可能的解决方案.在onPause或onStop中,请勿致电:

 mMediaPlayer.stop();
Run Code Online (Sandbox Code Playgroud)

(以及所有需要的东西,比如释放等).因为当您调用WakeLock并设置Flags以保持屏幕等时,onCreate完成后,onStop()和onPause()会多次调用您的活动.这是我在设备上使用Android 4.1.2检测到的三星Galaxy s3而不是为了确保MediaPlayer在完成时停止,请执行以下操作:

   if(this.isFinishing()){

        mMediaPlayer.stop();

   }
Run Code Online (Sandbox Code Playgroud)

有了这个你确定它只在你的活动真正完成时被调用.这应该工作.