来自 BroadCastReceiver 的 OnRecieve() 未被调用 - 仅限 android 13 (API 33)

问题描述 投票:0回答:1

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 alarmmanager android-permissions android-pendingintent android-13
1个回答
0
投票

根据 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(),因为应用程序收到广播时,权限可能已经被再次撤销。

您还应该请求用户的许可来安排确切的警报。你这样做了吗?

© www.soinside.com 2019 - 2024. All rights reserved.