我正在编写一个Android报警应用程序。当闹钟响起时,我可以让活动正常启动(它会唤醒手机,关闭键盘并显示闹钟视图),但如果闹钟响起时设备处于睡眠模式,我一辈子都无法让闹钟响起。我尝试过使用MediaPlayer和SoundPool,但没有成功。我是不是缺少某种许可?(我已经拥有WAKE_LOCK、DISABLE_KEYGUARD和RECEIVE_BOOT_COMPLETED权限。)
当使用SoundPool进行调试时,我执行加载,该加载返回一个有效的声音ID整数(1),但onLoadComplete侦听器(这是播放声音的地方)从未启动。当设备处于清醒状态时,它会正常工作。
有没有人有任何想法或遇到过同样的问题?
找到了解决方案!我调用了该类的onCreate()方法来播放音频。我把它移到了onResume(),因为这是当你知道设备是完全清醒的,活动是可见的,在顶部和焦点上。
我最近遇到了同样的问题。我解决这个问题的方法是阅读你的答案,但也通过记录发生的事情来检查活动流程。基本上,onCreate
、onStart
、onResume
、onPause
、onStop
、onStart
、onResume
按该顺序发射。这是一个作为警报屏幕启动的活动。
我将初始化代码保留在onStart
方法中,确保使用.prepare()
而不是prepareAsync()
,因为我使用的是本地声音。
try {
Log.d(LOG_TAG, "Setting media player URI: " + alarmTone.toString());
//mMediaPlayer = MediaPlayer.create(this, );
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(getApplicationContext(), alarmTone);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
mMediaPlayer.setLooping(true);
mMediaPlayer.setVolume(100, 100);
mMediaPlayer.prepare();
} catch (Exception ex) {
Log.d(LOG_TAG, "Exception from media player: " + ex.getMessage());
}
然后在onPause
和onStop
方法中,我添加了:
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
}
在onResume
方法中,我添加了媒体播放代码:
if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
Log.d(LOG_TAG, "Playing alarm through Media Player");
mMediaPlayer.start();
}
哈,行了!