La programmazione di sveglie esatte è negata per impostazione predefinita

Le sveglie esatte sono concepite per notifiche avviate dall'utente o azioni che devono avvenire in un momento preciso.

SCHEDULE_EXACT_ALARM, l'autorizzazione introdotta in Android 12 per consentire alle app di pianificare sveglie esatte non è più concessa in anticipo alla maggior parte delle app appena installate che hanno come target Android 13 e versioni successive (l'autorizzazione sarà negata per impostazione predefinita). Se l'utente trasferisce i dati dell'app su un dispositivo con Android 14 tramite un'operazione di backup e ripristino, l'autorizzazione verrà comunque negata. Se un'app esistente ha già questa autorizzazione, questa verrà concessa in anticipo quando il dispositivo eseguirà l'upgrade ad Android 14.

È necessaria l'autorizzazione SCHEDULE_EXACT_ALARM per avviare sveglie esatte tramite le seguenti API, altrimenti verrà visualizzato un SecurityException:

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

App interessate

Se su un dispositivo è installato Android 14 o versioni successive, questa modifica interesserà un'app appena installata con le seguenti caratteristiche:

  • Ha come target Android 13 (livello API 33) o versioni successive.
  • Dichiara l'autorizzazione SCHEDULE_EXACT_ALARM nel manifest.
  • Non rientra in uno scenario di esenzione o pre-concessione.
  • 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 del calendario, sveglie o avvisi quando l'app non è più in esecuzione. Queste app possono richiedere l'autorizzazione normale USE_EXACT_ALARM. L'autorizzazione USE_EXACT_ALARM verrà concessa al momento dell'installazione e le app che dispongono di questa autorizzazione potranno programmare sveglie esatte proprio come per le app con autorizzazione SCHEDULE_EXACT_ALARM.

Casi d'uso che potrebbero non richiedere sveglie esatte

Poiché ora l'autorizzazione SCHEDULE_EXACT_ALARM è negata per impostazione predefinita e la procedura di concessione delle autorizzazioni richiede passaggi aggiuntivi da parte degli utenti, gli sviluppatori sono vivamente invitati a valutare i loro casi d'uso per stabilire se gli allarmi esatti hanno ancora senso per i loro casi d'uso.

Il seguente elenco mostra i flussi di lavoro comuni che potrebbero non richiedere una sveglia esatta:

Pianificazione di lavori ripetuti per l'intera durata dell'app
Il metodo set() è utile se l'attività deve tenere presenti vincoli in tempo reale, ad esempio se si attiva alle 14:00 di domani o tra 30 minuti. In caso contrario, ti consigliamo di utilizzare i metodi postAtTime() o postDelayed().
Operazioni programmate in background, ad esempio l'aggiornamento dell'app e il caricamento dei log
WorkManager consente di pianificare lavori periodici sensibili alle tempistiche. Puoi fornire un intervallo di ripetizione e un flexIntervalli (minimo 15 minuti) per definire un runtime granulare per il lavoro.
L'allarme deve suonare all'ora approssimativa mentre il sistema è in stato inattivo
Usa una sveglia inesatta. In particolare, chiama il numero setAndAllowWhileIdle().
Azione specificata dall'utente che deve verificarsi dopo un intervallo di tempo specifico
Usa una sveglia inesatta. In particolare, chiama il numero set().
Azione specificata dall'utente che può verificarsi in un determinato periodo di tempo
Usa una sveglia inesatta. In particolare, chiama il numero setWindow(). Tieni presente che la durata minima consentita per una finestra è 10 minuti.

Passaggi di migrazione per continuare a utilizzare le sveglie esatte

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

Questo è lo stesso del flusso di lavoro standard per la richiesta di un'autorizzazione speciale:

  1. Le app devono chiamare AlarmManager.canScheduleExactAlarms() per verificare che disponga dell'autorizzazione appropriata.
  2. Se l'app non dispone dell'autorizzazione, richiama un intent che include 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 app.

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

  4. Se l'utente ha concesso l'autorizzazione alla tua app, quest'ultima può impostare sveglie esatte. Se invece l'utente ha negato l'autorizzazione, riduci leggermente l'esperienza con l'app in modo che fornisca funzionalità all'utente senza le informazioni protette da tale autorizzazione.

Il seguente snippet di codice mostra come verificare l'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 automaticamente la rimozione delle autorizzazioni

Alcuni utenti si rifiutano di concedere l'autorizzazione. In questo scenario, consigliamo delle app per ridurre in modo controllato l'esperienza e continuare a cercare di fornire la migliore esperienza utente di riserva possibile identificando i relativi casi d'uso.

Esenzioni

I seguenti tipi di app sono sempre autorizzati a chiamare i metodi setExact() o setExactAndAllowWhileIdle():

  • App firmate con il certificato della piattaforma.
  • App con privilegi.
  • App che si trovano nella lista consentita delle funzionalità avanzate (se la tua app soddisfa i requisiti, puoi richiederla utilizzando l'azione intent ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).

Pre-concessioni

Linee guida per i test

Per testare questa modifica, disattiva l'autorizzazione Sveglie e 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 della tua app.