MediaPlayer(或铃声)在屏幕关闭时不开始播放(phone 已锁定)
MediaPlayer (or Ringtone) doesn't start playing when the screen is off (phone is locked)
我正在创建一个提醒应用程序(它就像一个闹钟),您可以在其中设置任务。
接收之前设置的告警意图的代码(带setExactAndAllowWhileIdle):
@Override
public void onReceive(Context context, Intent intent) {
int alarmId = intent.getIntExtra(Constants.REMINDER_ALARM_ID, 0);
Intent goingOffIntent = new Intent(context, GoingOffActivity.class);
goingOffIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
goingOffIntent.putExtra(Constants.REMINDER_ALARM_ID, alarmId);
context.startActivity(goingOffIntent);
}
即使屏幕关闭(键盘锁打开)也能正常工作,GoingOffActivity 会出现两个选项:暂停、关闭。
GoingOffActivity 的 onCreate:
getWindow().setFlags(
flags: WindowManager.LayoutParams.FLAG_FULLSCREEN |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
mask: WindowManager.LayoutParams.FLAG_FULLSCREEN |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
...
// Play ringtone
if (ringingEnabled) {
Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
ringtone = RingtoneManager.getRingtone(getApplicationContext(), uri);
ringtone.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ALARM)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build());
ringtone.play();
//mediaPlayer = MediaPlayer.create(context, uri); //Settings.System.DEFAULT_RINGTONE_URI
//mediaPlayer.setLooping(true);
//mediaPlayer.start();
}
问题是 phone 打开时(在主屏幕或应用程序中)播放音乐(以 Ringtone 或 MediaPlayer 开头),但在 [=39= 】 从睡梦中醒来。只有声音是问题,其他一切都很好。
我在互联网上做了一些研究,我猜这与打瞌睡模式有关(也许不是,因为我认为当 activity 启动时 phone 不再处于打瞌睡模式), 尝试了一些解决方案但没有任何效果。
Api 等级信息:
- 应用的最低 SDK 级别:23
- 联想P2的等级:24(测试机)
- 三星A40的等级:28(测试机)
换个方式应该怎么办?谢谢。
我想也许你可以通过在你的接收器中实现一个唤醒锁来解决你的问题,在触发警报之前获取它,然后在用户停止警报声音后释放它。
看看:,看看如何实现唤醒锁来打开屏幕。
我知道问题出在哪里。我在 onPause 中停止了 MediaPlayer,它在 activity 可见之前被调用(我不知道为什么)。
2019-10-19 02:38:00.365 LOG:onReceive
2019-10-19 02:38:00.428 LOG:onCreate
2019-10-19 02:38:00.529 LOG:onResume
2019-10-19 02:38:00.542 LOG:onPause
2019-10-19 02:38:00.592 LOG:onStop
2019-10-19 02:38:00.716 LOG:onResume
我正在创建一个提醒应用程序(它就像一个闹钟),您可以在其中设置任务。
接收之前设置的告警意图的代码(带setExactAndAllowWhileIdle):
@Override
public void onReceive(Context context, Intent intent) {
int alarmId = intent.getIntExtra(Constants.REMINDER_ALARM_ID, 0);
Intent goingOffIntent = new Intent(context, GoingOffActivity.class);
goingOffIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
goingOffIntent.putExtra(Constants.REMINDER_ALARM_ID, alarmId);
context.startActivity(goingOffIntent);
}
即使屏幕关闭(键盘锁打开)也能正常工作,GoingOffActivity 会出现两个选项:暂停、关闭。
GoingOffActivity 的 onCreate:
getWindow().setFlags(
flags: WindowManager.LayoutParams.FLAG_FULLSCREEN |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
mask: WindowManager.LayoutParams.FLAG_FULLSCREEN |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
...
// Play ringtone
if (ringingEnabled) {
Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
ringtone = RingtoneManager.getRingtone(getApplicationContext(), uri);
ringtone.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ALARM)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build());
ringtone.play();
//mediaPlayer = MediaPlayer.create(context, uri); //Settings.System.DEFAULT_RINGTONE_URI
//mediaPlayer.setLooping(true);
//mediaPlayer.start();
}
问题是 phone 打开时(在主屏幕或应用程序中)播放音乐(以 Ringtone 或 MediaPlayer 开头),但在 [=39= 】 从睡梦中醒来。只有声音是问题,其他一切都很好。
我在互联网上做了一些研究,我猜这与打瞌睡模式有关(也许不是,因为我认为当 activity 启动时 phone 不再处于打瞌睡模式), 尝试了一些解决方案但没有任何效果。
Api 等级信息:
- 应用的最低 SDK 级别:23
- 联想P2的等级:24(测试机)
- 三星A40的等级:28(测试机)
换个方式应该怎么办?谢谢。
我想也许你可以通过在你的接收器中实现一个唤醒锁来解决你的问题,在触发警报之前获取它,然后在用户停止警报声音后释放它。 看看:,看看如何实现唤醒锁来打开屏幕。
我知道问题出在哪里。我在 onPause 中停止了 MediaPlayer,它在 activity 可见之前被调用(我不知道为什么)。
2019-10-19 02:38:00.365 LOG:onReceive
2019-10-19 02:38:00.428 LOG:onCreate
2019-10-19 02:38:00.529 LOG:onResume
2019-10-19 02:38:00.542 LOG:onPause
2019-10-19 02:38:00.592 LOG:onStop
2019-10-19 02:38:00.716 LOG:onResume