如何检测电源连接状态?

NPi*_*ike 24 android

当USB或AC电源连接到Android手机时,是否有一种简单的通知方式?

J.J*_*Kim 68

在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>
Run Code Online (Sandbox Code Playgroud)

在代码中

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
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 对于 Android 8 及更高版本上的大多数隐式广播,您无法在清单中注册接收器 [由于后台执行限制](https://developer.android.com/about/versions/oreo/background#broadcasts)。 (5认同)
  • 请注意,onReceive()方法应该在PlugInControlReceiver类中,该类扩展了BroadcastReceiver. (4认同)
  • 感谢@OdedBreiner的善意解释 (2认同)

Com*_*are 9

设置BroadcastReceiverACTION_BATTERY_CHANGED.一个Intent额外的会告诉你的充电状态是什么-看BatteryManager的详细信息.

  • ***请勿使用***ACTION_BATTERY_CHANGED,因为在99%电量已满时,Android将播放一个事件,显示电源已断开且电池正在放电(即使手机仍然连接到交流电源!).而是使用ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED (14认同)

ima*_*yni 5

另一种方法是使用电池管理器。我可用于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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Jes*_*mer 5

这是轮询信息的另一种方法:

阅读此处的值:例如。

通过安卓外壳:

cat /sys/class/power_supply/usb/online
Run Code Online (Sandbox Code Playgroud)

1=已连接,0=未连接。反映 USB 连接状态。

猫 /sys/class/power_supply/ac/online

1=已连接,0=未连接。反映交流连接状态。

我认为将这两者结合使用可以判断设备是否正在通电。不确定所有设备的位置是否相同。在 Android 7+ 和 5+、三星平板电脑和 RockChip 设备上发现位置相同。

对于我提到的测试过的设备,它有效。文件是 RO、只读的,您只能读取它们来轮询信息。Android API 没有提供我需要使用的版本(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());
}
Run Code Online (Sandbox Code Playgroud)