【问题标题】:How to detect power connected state?如何检测电源连接状态?
【发布时间】:2010-07-16 16:50:46
【问题描述】:

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

【问题讨论】:

    标签: android


    【解决方案1】:

    在 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
           }
       }
    }
    

    【讨论】:

    • 请注意,onReceive() 方法应该在扩展 BroadcastReceiver 的 PlugInControlReceiver 类中。
    • 感谢@OdedBreiner 的友好解释
    • 但以上方案不适用于vivo和OPPO手机
    • 在 Android 8 及更新版本due to background execution limitations 上,您无法在清单中为大多数隐式广播注册接收器。
    • 如何在 Android 8 或更高版本上进行操作?
    【解决方案2】:

    ACTION_BATTERY_CHANGED 设置BroadcastReceiver。额外的Intent 会告诉您充电状态是什么——详情请参阅BatteryManager

    【讨论】:

    • @NPike:关于另一个问题,请参阅accepted answer 上的 cmets — 无需订阅即可使用此处显示的方法获取当前状态。
    • 请准确地说: Intent ix = main.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); boolean plugged = ix != null && ix.getIntExtra("plugged", 0) != 0;
    • 请勿使用 ACTION_BATTERY_CHANGED,因为在电池电量达到 99% 时,Android 会广播一个事件,显示电源已断开且电池正在放电(即使手机仍连接到交流电源!)。相反,使用 ACTION_POWER_CONNECTED 和 ACTION_POWER_DISCONNECTED
    【解决方案3】:

    另一种方法是使用电池管理器。这我可用于 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;
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      在此处读取值:例如。

      通过安卓外壳:

      cat /sys/class/power_supply/usb/online
      

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

      cat /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());
      }
      

      【讨论】:

      • 这不起作用 - 该文件是 RO,我得到“权限”被拒绝。请使用 Android API 而不是 Linux 低级 API :)
      • 为什么要投反对票?它工作正常,可用于一些 bash 脚本和 ROM 自定义。我非常感谢这个答案。但它当然不应该从 java 中使用。
      • 更新:这个答案即使没有 root 也有效。它可以用作获取值的后备方法。在某些自定义 ROM 上,充电事件的正常广播以某种方式被破坏
      【解决方案5】:

      还有一件事你必须检查Manifest --->应用程序中是否有错误。 如果然后单击显示错误的字段,然后单击链接“名称” 然后出现添加类的对话框。添加类并在类中复制接收代码。也就是说,上面的代码应该复制到类文件而不是主要活动中。 谢谢 Pzycoderz

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-10
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多