Questa pagina descrive come Android gestisce i prodotti con batterie rimovibili o senza batterie interne. Questi ultimi dispositivi 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?
Le applicazioni possono utilizzare il seguente codice per rilevare se il dispositivo ha una batteria:
```
final Intent batteryInfo = registerReceiver(null, new
IntentFilter(Intent.ACTION_BATTERY_CHANGED));
return batteryInfo.getBooleanExtra(BatteryManager.EXTRA_PRESENT, true);
```
Comportamento dei dispositivi senza batteria
Se Android non rileva un dispositivo batteria per il tuo prodotto, vengono utilizzati i seguenti valori predefiniti relativi alla batteria. Tieni presente che i valori predefiniti sono cambiati nella release di Android 9. Questa tabella mostra le differenze.
| Stato batteria | Android 9 e versioni successive | Android 8.1 e versioni precedenti |
|---|---|---|
| Presente | falso | vero |
| Stato | sconosciuto | carica |
| Capacità rimanente | 0 | 100% |
| Salute | sconosciuto | prodotto |
| Stato online del caricabatterie CA | non modificato | forzato su vero |
I produttori possono modificare le impostazioni predefinite utilizzando un driver power_supply del kernel o Health HAL.
Android 9 e versioni successive
Android 9 rimuove alcuni codici precedenti per i dispositivi senza batteria che per impostazione predefinita fingevano che fosse presente una batteria, che fosse in carica al 100% e che fosse in buone condizioni con una lettura della temperatura normale sul termistore.
La maggior parte delle API del framework che gestiscono queste informazioni continua a gestire le situazioni comuni come in precedenza: il sistema è considerato in carica (ovvero non funziona con l'alimentazione a batteria) e non sarà considerato con batteria scarica. Se l'interfaccia utente disegna l'icona della batteria, questa viene visualizzata con un punto esclamativo e la percentuale della batteria viene mostrata come 0%. Tuttavia, il dispositivo non si arresta a causa della batteria scarica e vengono pianificati i job che richiedono la ricarica o una batteria in buone condizioni.
Android 8.1 e versioni precedenti
Poiché lo stato della batteria è sconosciuto, le API del framework Android considereranno il sistema in carica (ovvero non funzionante con l'alimentazione a batteria) e non sarà considerato con batteria scarica. Se l'interfaccia utente esegue il rendering dell'icona della batteria, questa viene visualizzata con un punto esclamativo e la percentuale della batteria viene mostrata come 0%. Tuttavia, il dispositivo non si arresta a causa della batteria scarica e vengono pianificati i job che richiedono la ricarica o una batteria in buone condizioni.
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 di alimentazione e della batteria del tuo prodotto, come descritto in precedenza. Se Android 9 e versioni successive non rilevano un dispositivo caricabatterie di classe di alimentazione Linux class, per impostazione predefinita tutti i tipi di caricabatterie (CA, USB, wireless) avranno stato offline. Se tutti i caricabatterie sono offline, ma non viene rilevato alcun dispositivo batteria, il sistema sarà comunque considerato in carica nel senso che funziona con alimentazione esterna, non a batteria, come descritto in precedenza.
Se il tuo prodotto non ha una batteria ed è sempre collegato a una fonte di alimentazione, è consigliabile implementare un driver charger della classe power_supply del kernel Linux per la fonte di alimentazione CA o USB che imposta l'attributo online sysfs su true. In alternativa, puoi configurare la proprietà online del caricabatterie CA in un Health HAL per il tuo dispositivo. Per configurare la proprietà online del caricabatterie CA in un Health HAL,
consulta Health AIDL HAL.
Questo Health HAL 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 a
Health AIDL HAL.