為了鼓勵應用節省系統資源,以 Android 12 及更高版本為目標平臺且設定了精確的鬧鐘的應用必須能夠訪問“鬧鐘和提醒”功能,該功能顯示在系統設定的特殊應用訪問權限螢屏中,如需獲取這種特殊應用訪問權限,需在清單中請求 SCHEDULE_EXACT_ALARM 權限,
開發者網站請參考:
行為變更:以 Android 12 為目標平臺的應用 | Android Developers
簡單來說就是代碼中如果使用了setAlarmClock()、setExact()、setExactAndAllowWhileIdle()這幾種方法,則設定的是精準的鬧鐘,在Android12環境下,呼叫這些方法時,如果SCHEDULE_EXACT_ALARM權限未打開,應用就會crash(做之前先測驗一下,要是權限關閉以后,呼叫這些方法,要是應用不會crash,應該不需要對應),所以,在呼叫這些方法時,要增加權限檢查,
應對方法:
(1).申請權限
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
(2).跳轉到授權畫面
Google Pixel的處理流程:在一打開應用的時候就進行權限檢查,如果check到SCHEDULE_EXACT_ALARM權限沒打開,就使用toast提示用戶打開授權界面,若用戶不打開設定的鬧鐘都不好用(我的建議是彈dialog,要是用戶拒絕就直接退出應用,省得后面麻煩)
Uri uri = Uri.parse("package:"+this.getPackageName());
Intent i = new Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM,uri);
startActivity(i,200);
SCHEDULE_EXACT_ALARM權限 授權畫面

(3).判斷是否具有權限
alarmManager=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
boolean hasPermission = alarmManager.canScheduleExactAlarms();//true:有權限,false:沒有權限
if(hasPermission){
setAlarmClock();//設定精準鬧鐘的方法
setExact();
setExactAndAllowWhileIdle();
}else{
//如果沒檢查到權限,應該做出相應的處理
//(1).什么都不做,寫一條log,如果權限關閉鬧鐘將無法使用
//(2).設定不精準的鬧鐘
//(3).使用dialog、toast等提示用戶打開權限(具體專案,具體設計,不建議在每次設定精準鬧鐘時候都對用戶進行提示,這樣的用戶體驗感不好)
}
注意點:
1.如果用戶在SCHEDULE_EXACT_ALARM權限打開的時候設定鬧鐘,在鬧鐘到點前將鬧鐘關閉,到時間鬧鐘是不會響的,如果用戶發現鬧鐘到點沒響,就將SCHEDULE_EXACT_ALARM權限打開,鬧鐘可以響(鬧鐘過時,鬧鐘會被miss掉)
對應方法:設定一個廣播接收器(靜態,動態都可以),接收"AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED"
這里要注意:只有在打開精準鬧鐘權限的時候才能收到廣播;關閉時是收不到的,只能每次使用方法的時候checkPermission,
如果收不到廣播的話,在終端運行以下命令,啟用行為更:(模擬器也要運行)
adb shell am compat enable REQUIRE_EXACT_ALARM_PERMISSION [packageName]
正常來說,SCHEDULE_EXACT_ALARM權限是默認打開的,用戶應該也不會找到這個將它關閉,更不太可能進行這么非人類的操作,但是我們作為開發者應該考慮滴全面些,我就打算等Android 12適配了,我就給各個手機廠商找茬去,Google Pixel已經被我找過一次茬了,我這里面說的情況,Google就還沒做出處理(11月為止),
2.App info和System Setting都有SCHEDULE_EXACT_ALARM 權限,它們倆的授權界面雖然長得一樣,但是是不一樣的界面,這將會導致一個問題,要是在App info中將權限關閉,在跳轉授權界面的時候可能會跳轉兩個授權界面,
對應方法:在點擊跳轉按鈕的時候再startActivity,這樣就能把App info的授權界面(AlarmsAndRemindersAppActivity)給覆寫掉
public void createAlertDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(R.string.extra_alarm_permission_descript_title);
builder.setPositiveButton(R.string.extra_alarm_permission_turn_on, new DialogInterface.OnClickListener() {
Uri uri = Uri.parse("package:" + "com.android.deskclock");
Intent intent = new Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM, uri);
public void onClick(DialogInterface dialog, int which) {
startActivity(intent);
}
});
builder.setNegativeButton(R.string.extra_alarm_permission_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
mExtraAlarmDialog = builder.create();
mExtraAlarmDialog.setCancelable(false);
mExtraAlarmDialog.show();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/384315.html
標籤:其他
