Android12、SCHEDULE_EXACT_ALARM 権限チェック値は常に true を返します

Android12 のアップグレードにより、正確な目覚まし時計メソッドを呼び出す際には、SCHEDULE_EXACT_ALARM 権限をチェックする必要があります。具体的な操作については、 Android 12 に適応した動作変更-----正確な目覚まし時計のアクセス許可_Yuan Meil​​i.. のブログ-CSDN ブログ_Android の目覚まし時計のアクセス許可を参照してください。

しかし、最近新しいモデルに取り組んでいたとき、S プラットフォーム上で、クロックが精密アラーム メソッドを呼び出したにもかかわらず、SCHEDULE_EXACT_ALARM 権限をチェックせず、影響がありませんでした (通常、処理されない場合、精密アラーム メソッドはが呼び出されます。確実にクラッシュします)


調査の結果、フレームワークがクロック プロセスにドーズ モード ホワイトリストを追加していることが判明しました。

<!-- Whitelist of what components are permitted to run in the background -->
<allow-in-power-save package="com.android.deskclock" />

結果として、canScheduleExactAlarms の値は常に true を返します。

AlarmManagerService$mService#canScheduleExactAlarms
@Override
public boolean canScheduleExactAlarms(String packageName) {
    ......
    if (!isExactAlarmChangeEnabled(packageName, userId)) { // Check the feature flag is on or off
        return true;
    }
    return isExemptFromExactAlarmPermission(packageUid) // ★ Will check DozeMode white list here
            || hasScheduleExactAlarmInternal(packageName, packageUid);
}

AlarmManagerService#isExemptFromExactAlarmPermission
boolean isExemptFromExactAlarmPermission(int uid) {
    return (UserHandle.isSameApp(mSystemUiUid, uid)
            || UserHandle.isCore(uid)
            || mLocalDeviceIdleController == null
            || mLocalDeviceIdleController.isAppOnWhitelist(UserHandle.getAppId(uid))); // ★ Check DozeMode white list
}

クロックにこの問題があるだけでなく、他のアプリケーションもドーズ モード ホワイトリストを追加し、このロジックを備えている場合にも、この現象が発生します。参考にしていただけます。

おすすめ

転載: blog.csdn.net/m0_50408097/article/details/124457451