Le sveglie esatte programmate sono vietate per impostazione predefinita

Le sveglie esatte sono pensate per le notifiche o le azioni intenzionali dell'utente che richiedono avvenga in un momento preciso.

SCHEDULE_EXACT_ALARM, l'autorizzazione introdotta in Android 12 per consentire alle app di di programmazione di sveglie esatte non viene più pre-concessa alla maggior parte dei casi le app destinate ad Android 13 e versioni successive (verranno rifiutate per impostazione predefinita). Se l'utente trasferisce i dati delle app a un dispositivo con Android 14 tramite un'operazione di backup e ripristino, l'autorizzazione verrà comunque negata. Se un'app esistente dispone già di questa autorizzazione, verrà concessa in anticipo quando il dispositivo eseguirà l'upgrade ad Android 14.

Per avviare sveglie esatte è necessaria l'autorizzazione SCHEDULE_EXACT_ALARM tramite le API seguenti o verrà restituito un SecurityException:

Le best practice esistenti per l'autorizzazione SCHEDULE_EXACT_ALARM continuano a essere valide, tra cui:

App interessate

Se un dispositivo utilizza Android 14 o versioni successive, questa modifica interesserà app installata con le seguenti caratteristiche:

  • Ha come target Android 13 (livello API 33) o versioni successive.
  • Dichiara l'autorizzazione SCHEDULE_EXACT_ALARM nel file manifest.
  • Non rientra in un'esenzione o nella pre-concessione in questo scenario.
  • Non è un'app di calendario o sveglia.

Le app di calendario e sveglia devono dichiarare USE_EXACT_ALARM

Le app di calendario o sveglia devono inviare promemoria di calendario, sveglie o avvisi quando l'app non è più in esecuzione. Queste app possono richiedere Autorizzazione normale USE_EXACT_ALARM. L'autorizzazione USE_EXACT_ALARM la licenza viene concessa al momento dell'installazione e le app che dispongono di questa autorizzazione potranno programmare sveglie esatte, proprio come le app con autorizzazione SCHEDULE_EXACT_ALARM.

Casi d'uso che potrebbero non richiedere sveglie esatte

Perché ora l'autorizzazione SCHEDULE_EXACT_ALARM è negata per impostazione predefinita e il processo di concessione delle autorizzazioni richiede ulteriori passaggi da parte degli utenti, Ti consigliamo vivamente di valutare i casi d'uso e di determinare se allarmi esatti che hanno comunque senso per i loro casi d'uso.

Il seguente elenco mostra flussi di lavoro comuni che potrebbero non richiedere un allarme esatto:

Pianificazione del lavoro ripetuto per tutta la durata dell'app
Il metodo set() è utile se l'attività deve rimanere in tempo reale ai vincoli in mente, come il lancio alle 14:00 di domani o tra 30 minuti. In caso contrario, ti consigliamo di utilizzare la postAtTime() o postDelayed().
Operazioni in background pianificate, ad esempio l'aggiornamento dell'app e il caricamento dei log
WorkManager fornisce un modo per pianificare attività periodiche sensibili ai tempi. Puoi fornire un intervallo di ripetizione e un intervallo flexInterval (15 minuti minimo) per puoi definire runtime granulare per il lavoro.
È necessario che la sveglia suoni a un'ora approssimativa quando il sistema è in stato inattivo
Utilizzare una sveglia non esatta. Nello specifico, chiama il numero setAndAllowWhileIdle().
Azione specificata dall'utente che deve avvenire dopo un'ora specifica
Usa una sveglia inesatta. In particolare, chiama set().
Azione specificata dall'utente che può verificarsi in un determinato arco di tempo
Usa una sveglia inesatta. In particolare, chiama setWindow(). Tieni presente che la durata minima consentita della finestra è di 10 minuti.

Passaggi di migrazione per continuare a usare le sveglie esatte

Come minimo, le app devono verificare di disporre dell'autorizzazione prima di pianificare sveglie esatte. Se le app non dispongono dell'autorizzazione, devono richiederla all'utente richiamando un intent.

È lo stesso flusso di lavoro standard per richiedere un'autorizzazione speciale:

  1. Le app devono chiamare il numero AlarmManager.canScheduleExactAlarms() per confermare che disponga dell'autorizzazione appropriata.
  2. Se l'app non dispone dell'autorizzazione, invoca un'intent che includa ACTION_REQUEST_SCHEDULE_EXACT_ALARM, insieme al nome del pacchetto dell'app, per chiedere agli utenti di concedere l'autorizzazione.

    Controlla la decisione dell'utente nel metodo onResume() della tua dell'app.

  3. Ascolta le trasmissioni AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED inviate se l'utente concede l'autorizzazione.

  4. Se l'utente ha concesso l'autorizzazione alla tua app, quest'ultima può impostare sveglie. Se invece l'utente ha negato l'autorizzazione, esegui il degrado graduale dell'esperienza con l'app in modo da fornire all'utente la funzionalità senza le informazioni protette da quell'autorizzazione.

Il seguente snippet di codice mostra come verificare la presenza di Autorizzazione SCHEDULE_EXACT_ALARM:

val alarmManager: AlarmManager = context.getSystemService<AlarmManager>()!!
when {
   // If permission is granted, proceed with scheduling exact alarms.
   alarmManager.canScheduleExactAlarms() -> {
       alarmManager.setExact(...)
   }
   else -> {
       // Ask users to go to exact alarm page in system settings.
       startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
   }
}

Codice campione per verificare l'autorizzazione e gestire le decisioni dell'utente in onResume():

override fun onResume() {
     
   if (alarmManager.canScheduleExactAlarms()) {
       // Set exact alarms.
       alarmManager.setExact(...)
   }
   else {
       // Permission not yet approved. Display user notice and revert to a fallback  
       // approach.
       alarmManager.setWindow(...)
   }
}

Riduci delicatamente in caso di rifiuto dell'autorizzazione

Alcuni utenti si rifiuteranno di concedere l'autorizzazione. In questo scenario, consigliamo alle app di eseguire il downgrade dell'esperienza in modo graduale e di continuare a offrire la migliore esperienza utente di riserva possibile identificando i relativi casi d'uso.

Esenzioni

I seguenti tipi di app possono sempre chiamare setExact() o Metodi di setExactAndAllowWhileIdle():

  • App firmate con il certificato della piattaforma.
  • App con privilegi.
  • Le app inserite nella lista consentita di app dell'alimentazione (se soddisfa i requisiti, puoi richiederlo utilizzando il ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS azione dell'intent).

Pre-concessioni

Linee guida per i test

Per verificare questa modifica, disattiva Sveglie e ai promemoria per la tua app dalla pagina Accesso speciale per le app nelle impostazioni di sistema (Impostazioni > App > Accesso speciale per le app > Sveglie e promemoria) e osserva il comportamento dell'app.