Android12 のアップグレードにより、正確な目覚まし時計メソッドを呼び出す際には、SCHEDULE_EXACT_ALARM 権限をチェックする必要があります。具体的な操作については、 Android 12 に適応した動作変更-----正確な目覚まし時計のアクセス許可_Yuan Meili.. のブログ-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
}
クロックにこの問題があるだけでなく、他のアプリケーションもドーズ モード ホワイトリストを追加し、このロジックを備えている場合にも、この現象が発生します。参考にしていただけます。