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)
这是一篇较旧的帖子,但我遇到了同样的问题,并认为我知道这里缺少什么.这只是一个没有看到更多代码的假设,但通常,如果你使用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)
有了这个你确定它只在你的活动真正完成时被调用.这应该工作.
| 归档时间: |
|
| 查看次数: |
804 次 |
| 最近记录: |