onReceive() 被所有其他 API 级别调用,但由于某种原因未被 API 33 调用。
据我所知,从 API 31 开始,需要 SCHEDULE_EXACT_ALARM 权限并允许自动,但是在 API 33 之后不再自动设置为真。
然而,从 API 33 开始,USE_ALARM 是可用的,安装允许,在这种情况下不再需要 SCHEDULE_EXACT_ALARM。
我的权限:
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"
android:maxSdkVersion="32"/>
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />
报警管理器:
fun schedule(context: Context) {
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(context, AlarmReceiver::class.java)
intent.putExtra("once", once)
intent.putExtra("vibrate", vibrate)
intent.putExtra("shake", shake)
intent.putExtra("snooze", snooze)
val alarmPendingIntent = PendingIntent.getBroadcast(
context,
alarmId, intent,
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)
val calendar: Calendar = Calendar.getInstance()
calendar.timeInMillis = System.currentTimeMillis()
calendar.set(Calendar.HOUR_OF_DAY, hour)
calendar.set(Calendar.MINUTE, minute)
//if alarm time has already passed, increment day by 1
if (calendar.timeInMillis <= System.currentTimeMillis()) {
calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1)
}
val alarmInfo = AlarmClockInfo(calendar.timeInMillis, alarmPendingIntent)
}
如上所述,这个问题是 android 13 特有的。如果我应该在这里发布更具体的内容,请在评论中让我知道,我可以更新。
根据 Android Developers Documentation to AlarmManager 有一个方法canScheduleExactAlarms
您是否尝试调用该方法并检查是否可以安排准确的警报?
此外,文档还说了两件事:
以 Build.VERSION_CODES#S 或更高版本为目标的应用只有在具有 Manifest.permission#SCHEDULE_EXACT_ALARM 权限或在设备的省电豁免列表中时才能安排准确的警报。
所以这意味着你应该在你的清单中有
SCHEDULE_EXACT_ALARM
,你似乎声明了。
这些应用程序也可以启动 Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM 来向用户请求此权限。
注意:应用程序在收到广播后,在使用上述API之前仍然需要检查canScheduleExactAlarms(),因为应用程序收到广播时,权限可能已经被再次撤销。
您还应该请求用户的许可来安排确切的警报。你这样做了吗?