Как определить состояние подключенного питания?

Есть ли простой способ получать уведомления, когда к телефону Android подключено питание от USB или переменного тока?

6 ответов

Решение

Настроить BroadcastReceiver за ACTION_BATTERY_CHANGED, Intent Extra скажет вам, в каком состоянии находится зарядка - смотрите BatteryManager для деталей.

В AndroidManifest.xml

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <receiver android:name=".receiver.PlugInControlReceiver">
        <intent-filter>
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
        </intent-filter>
    </receiver>
</application>

В коде

public class PlugInControlReceiver extends BroadcastReceiver {
   public void onReceive(Context context , Intent intent) {
       String action = intent.getAction();

       if(action.equals(Intent.ACTION_POWER_CONNECTED)) {
           // Do something when power connected
       }
       else if(action.equals(Intent.ACTION_POWER_DISCONNECTED)) {
           // Do something when power disconnected
       }
   }
}

Другой способ - использование менеджера батареи. это я могу использовать для API>=21

public class PowerUtil {
    public static boolean isConnected(Context context) {
        Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        return plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB;
    }
}

Вот еще один способ опроса информации:

прочитайте значения здесь: напр.

с помощью оболочки Android:

cat /sys/class/power_supply/usb/online

1 = подключен, 0= нет. Отражает состояние USB-соединения.

cat / sys / class / power_supply / ac / online

1 = подключен, 0= нет. Отражает состояние соединения переменного тока.

Используя оба этих устройства вместе, я думаю, покажет, получает ли устройство питание или нет. Не уверен, что местоположение одинаково для всех устройств. Нашел местоположение одинаковое хоть и на андроиде 7+ и 5+, на планшете Samsung и устройстве RockChip.

Для устройств, которые я упомянул, проверено, это работает Файлы являются RO, только для чтения, вы можете только читать их, чтобы опросить информацию. API-интерфейсы Android не обеспечивали уровень детализации, который мне был необходим в той версии, в которой я должен был использовать (5.1.1), это было сделано. Я использовал предоставленный Android API для создания процесса запуска этих команд. Не требует рута. Это было сделано для приложения киоска. Вы также можете запустить тот же процесс, используя только Android API (файл, FileReader и т. Д.).

Вот пример Android API:

File aFile = new File("/sys/class/power_supply/ac/online");
try {
    BufferedReader br = new BufferedReader(new FileReader(aFile));
    char aBuff[] = new char[1];
    int aCount = br.read(aBuff,0, 1);
    Log.d(TAG, "run: Res:"+new String(aBuff));
}catch(Exception e){
    Log.d(TAG, "Exception:Error:run: "+e.toString());
}

из документа Android, просто сделайте так

              Intent batteryStatus = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

        // Are we charging / charged?
        int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                status == BatteryManager.BATTERY_STATUS_FULL;

        // How are we charging?
        int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
        boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;

Еще одна вещь, которую вы должны проверить, есть ли ошибки в приложении Manifest--->. Если затем нажмите на поле с сообщением об ошибке и просто нажмите на ссылку "Имя". Появится диалоговое окно для добавления класса. добавьте класс и в классе скопируйте код on receive. То есть код выше должен быть скопирован в файл класса, а не в основное действие. Спасибо Pzycoderz

Другие вопросы по тегам