Android 12:使用 SCHEDULE_EXACT_ALARM 权限在特定时间获取/显示数据在 Google Play 政策中是否安全?

Dzu*_*gPV 36 android scheduler alarmmanager android-alarms android-workmanager

我在 Play 商店里有一个 Android 应用程序已经有 8 年了。最近Google发布Android S或12引入了一些前台服务启动限制

https://developer.android.com/about/versions/12/behavior-changes-12#foreground-service-launch-restrictions

确切的警报权限

https://developer.android.com/about/versions/12/behavior-changes-12#exact-alarm-permission

在应用程序中,我使用前台服务和闹钟来安排来自云和设备传感器的天气数据更新,并向用户发送通知,更新小部件。但他们说:确切的警报应该只用于面向用户的功能,所以如果我继续使用这些 API,它是安全的(根据 Google Play 政策)?

我问这个问题是因为其他解决方案(例如带有前台服务和工作管理器的粘性通知)无法满足我的要求。

صلي*_*ouk 53

如果您正在测试 android 12 那么不要忘记将此行添加到清单中

<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
Run Code Online (Sandbox Code Playgroud)

更新:

Android 13 生成了安全异常,解决方案是在清单中添加以下两行:

<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />
Run Code Online (Sandbox Code Playgroud)

Android 14 更新:

Android 14 上的用户会崩溃,因为默认情况下不再授予该权限。这意味着应该进行运行时检查,如果未授予,则应以编程方式授予它

  • 您是说在 Android 13(+) 上除了 `...SCHEDULE_EXACT_ALARM` 之外还需要添加 `&lt;uses-permission android:name="android.permission.USE_EXACT_ALARM" /&gt;` 吗? (3认同)
  • 只是为了澄清这不是正确的答案。是的,USE_EXACT_ALARM 有效,但前提是您的应用程序可以归类为“日历和闹钟应用程序”,因此,如果您的应用程序不是“日历和闹钟应用程序”,并且您在清单中声明了此权限,则它不会在 Google Play 中获得批准,这也不是一个好的解决方案。好的开发人员不能以这种方式做到这一点。正确答案来自@Adelino。此致。 (3认同)

Ade*_*ino 27

是的,android.permission.SCHEDULE_EXACT_ALARM可以安全使用,在 Android 12 上此权限由 Android 系统自动授予,但在 Android 13 上您需要检查用户是否已授予此权限。

所以需要在manifest中添加权限

<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
Run Code Online (Sandbox Code Playgroud)

然后您需要检查是否授予了权限,如果未授予则需要将用户重定向到警报和提醒页面

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    val alarmManager = ContextCompat.getSystemService(context, AlarmManager::class.java)
    if (alarmManager?.canScheduleExactAlarms() == false) {
        Intent().also { intent ->
            intent.action = Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM
            context.startActivity(intent)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Google 还建议您需要通过注册广播接收器来检查此权限的任何更改,并检查ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED上的更改