Supportare i dispositivi senza batteria

In questa pagina viene spiegato in che modo Android gestisce i prodotti che hanno batterie rimovibili o non sono batterie interne. Questi ultimi sono invece collegati a una fonte di alimentazione esterna, ad esempio una presa di corrente CA o una porta USB su un altro dispositivo.

È presente una batteria?

Il seguente codice può essere utilizzato dalle applicazioni per rilevare se nel dispositivo è presente una batteria:

```
final Intent batteryInfo = registerReceiver(null, new
IntentFilter(Intent.ACTION_BATTERY_CHANGED));

return batteryInfo.getBooleanExtra(BatteryManager.EXTRA_PRESENT, true);
```

Comportamento dispositivo senza batteria

Se Android non rileva un dispositivo con batteria per il tuo prodotto, vengono utilizzati i seguenti valori predefiniti relativi alla batteria. Tieni presente che le impostazioni predefinite sono cambiate nella release di Android 9. Questa tabella mostra le differenze.

Stato batteria Android 9 e versioni successive Android 8.1 e versioni precedenti
Presenta falso true
Stato sconosciuto in carica
Capacità rimanente 0 100%
Salute sconosciuto buona
Stato online del caricabatterie CA non modificato forzato a true

I produttori possono modificare le impostazioni predefinite utilizzando un driver del kernel power_supply o un HAL di integrità.

Android 9 e versioni successive

Android 9 rimuove alcuni codici precedenti per i dispositivi senza batteria che per impostazione predefinita simulavano la presenza di una batteria, che venivano ricaricati al 100% e che erano in buono stato con una lettura normale della temperatura sul termistore.

La maggior parte delle API framework che si occupano di queste informazioni continua a gestire situazioni come in precedenza: il sistema viene considerato in fase di ricarica (ovvero, non alimentato a batteria) e non si considera con batteria scarica. Se nell'interfaccia utente è raffigurata l'icona della batteria, quest'ultima viene visualizzata con un punto esclamativo e la percentuale della batteria è pari a 0%. Tuttavia, il dispositivo non si arresterà perché la batteria è in esaurimento e vengono programmati lavori che richiedono la ricarica o una batteria di ottima qualità.

Android 8.1 e versioni precedenti

Poiché lo stato della batteria è sconosciuto, le API del framework Android considereranno il sistema come in carica (o non in esecuzione a batteria) e non saranno considerati con batteria in esaurimento. Se l'interfaccia utente esegue il rendering dell'icona della batteria, apparirà un punto esclamativo e la percentuale della batteria mostrerà 0%. Tuttavia, il dispositivo non si arresterà perché la batteria è in esaurimento e sono programmati processi che richiedono ricarica o una batteria di ottima qualità.

Implementazione

Il codice predefinito di Android 9 potrebbe funzionare correttamente per il tuo dispositivo, ma è consigliabile apportare una modifica al kernel o all'HAL per riflettere con precisione lo stato dell'alimentazione e della batteria del tuo prodotto, come descritto in precedenza. Se Android 9 e versioni successive non rileva un dispositivo di ricarica Classe di alimentazione Linux, per impostazione predefinita tutti i tipi di caricabatterie (CA, USB, wireless) avranno lo stato offline. Se tutti i caricabatterie sono offline, ma non viene rilevato alcun dispositivo a batteria, il sistema verrà comunque considerato in carica nel senso che è in funzione all'esterno, non all'alimentazione a batteria, come descritto in precedenza.

Se il prodotto non ha una batteria ed è sempre collegato a una fonte di alimentazione, è preferibile implementare un driver di classe charger del kernel Linux power_supply per la fonte di alimentazione CA o USB che imposti l'attributo online sysfs su true. In alternativa, puoi configurare la proprietà online del caricabatterie CA in un HAL per l'integrità del tuo dispositivo. Per configurare la proprietà online del caricabatterie CA in un HAL per l'integrità, fai riferimento a Health AIDL HAL.

Questo HAL di integrità personalizzato implementa una versione personalizzata di Health::getHealthInfo() che modifica il valore di BatteryProperties.chargerAcOnline = true.

Per iniziare, copia il file hardware/interfaces/health/aidl/default/Health.cpp nella tua implementazione di Health HAL e modificalo in base all'Health AIDL HAL.