La programmazione di sveglie esatte è negata per impostazione predefinita

Le sveglie esatte sono concepite per notifiche create dall'utente o azioni che devono verificarsi in un momento specifico.

SCHEDULE_EXACT_ALARM, l'autorizzazione introdotta in Android 12 per la programmazione di sveglie esatte non viene più concessa in anticipo alla maggior parte delle app appena installate che hanno come target Android 13 e versioni successive (sarà impostata su 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 dispone già di questa autorizzazione, questa verrà concessa in anticipo quando il dispositivo eseguirà l'upgrade ad Android 14.

L'autorizzazione SCHEDULE_EXACT_ALARM è necessaria per avviare allarmi esatti tramite le seguenti API, altrimenti verrà generato 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-granting.
  • 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 pianificare sveglie esatte proprio come per le app con l'autorizzazione SCHEDULE_EXACT_ALARM.

Casi d'uso che potrebbero non richiedere sveglie esatte

Poiché l'autorizzazione SCHEDULE_EXACT_ALARM ora è 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 e determinare se gli allarmi esatti sono ancora pertinenti per i loro casi d'uso.

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

Pianificare le attività ripetute durante il ciclo di vita dell'app
Il metodo set() è utile se l'attività deve tenere a mente i vincoli in tempo reale, ad esempio l'attivazione alle 14:00 di domani o tra 30 minuti. In caso contrario, ti consigliamo di utilizzare i metodi postAtTime() o postDelayed().
Operazioni in background pianificate, 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 intervallo flexInterval (minimo 15 minuti) per definire un runtime granulare per il lavoro.
È necessaria l'attivazione della sveglia a un'ora approssimativa mentre il sistema è in stato inattivo
Usa una sveglia inesatta. In particolare, chiama setAndAllowWhileIdle().
Azione specificata dall'utente che deve verificarsi dopo un intervallo di tempo specifico
Usa una sveglia inesatta. In particolare, chiama set().
Azione specificata dall'utente che può verificarsi in un intervallo di tempo
Usa una sveglia inesatta. In particolare, chiama setWindow(). Tieni presente che la durata minima consentita per la finestra è 10 minuti.

Passaggi di migrazione per continuare a utilizzare le sveglie esatte

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

Si tratta dello stesso 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 e il 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, la tua app può impostare sveglie esatte. Se l'utente ha invece negato l'autorizzazione, riduci automaticamente la tua esperienza nell'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 in caso di rifiuto delle autorizzazioni

Alcuni utenti si rifiuteranno di concedere l'autorizzazione. In questo scenario, consigliamo delle app per ridurre in modo controllato l'esperienza e cercare di offrire comunque la migliore esperienza utente di riserva 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 app avanzate (se la tua app soddisfa i requisiti, puoi richiederla utilizzando l'azione dell'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.