La programmazione di sveglie esatte è negata 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 programmare 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 dell'app a un dispositivo con Android 14 tramite un operazione di backup e ripristino, l'autorizzazione continuerà a essere negata. Se app esistente dispone già di questa autorizzazione, verrà pre-concessa quando il dispositivo upgrade ad Android 14.

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

di Gemini Advanced.

Le best practice esistenti per l'autorizzazione SCHEDULE_EXACT_ALARM sono ancora applicabili, 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, svegliarsi allarmi 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 consente di pianificare il lavoro periodico sensibile al tempo. È possibile fornire un intervallo di ripetizione e un intervallo flexInterval (15 minuti minimo) per puoi definire runtime granulare per il lavoro.
È necessaria una sveglia che suoni all'ora approssimativa mentre il sistema è in stato di inattività
Usa una sveglia inesatta. In particolare, chiama setAndAllowWhileIdle().
Azione specificata dall'utente che deve avvenire dopo un intervallo di tempo specifico
Usa una sveglia inesatta. In particolare, chiama set().
Azione specificata dall'utente che può avvenire entro un periodo 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 se hanno l'autorizzazione prima programmazione di sveglie esatte. Se le app non hanno l'autorizzazione, devono richiederla dall'utente richiamando un intent.

È uguale al flusso di lavoro standard per richiedere un'offerta speciale autorizzazione:

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

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

  3. Tieni d'occhio l'evento AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED annunci che vengono inviati 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, riduci in modo gentile la tua esperienza nell'app in modo che fornisca funzionalità l'utente senza le informazioni protette da tale 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, ti consigliamo app per ridurre elegantemente l'esperienza e cercare comunque di fornire il miglior una possibile esperienza utente di riserva identificando i 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.