【问题标题】:Check if device is plugged in检查设备是否已插入
【发布时间】:2011-07-14 02:23:32
【问题描述】:

我的应用有一个广播接收器来监听ACTION_POWER_CONNECTED 的变化,然后标记屏幕以保持打开状态。

我缺少的是应用程序在首次运行时检查充电状态的能力。任何人都可以帮我编写代码以手动检查充电状态吗?

【问题讨论】:

    标签: android batterymanager


    【解决方案1】:

    感谢 CommonsWare,这是我编写的代码。

    public class Power {
        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 || plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS;
        }
    }
    
    if (Power.isConnected(context)) {
        ...
    }
    

    或 Kotlin 版本

    object Power {
        fun isConnected(context: Context): Boolean {
            val intent = context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
            val plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1)
            return plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB || plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS
        }
    }
    

    http://developer.android.com/training/monitoring-device-state/battery-monitoring.html

    【讨论】:

    • 别忘了注销接收者
    • @JeffreyBlattman 这没有必要,因为您并没有真正注册接收器
    • 嗯,你打电话给Context.registerReceiver(),怎么不注册接收方?
    • 你不需要向后兼容,因为 BATTERY_PLUGGED_WIRELESS 只是一个常数。
    • 如果设备没有电池,我们如何知道设备是否已插入?
    【解决方案2】:
    public static boolean isPlugged(Context context) {
        boolean isPlugged= false;
        Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        isPlugged = plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB;
        if (VERSION.SDK_INT > VERSION_CODES.JELLY_BEAN) {
            isPlugged = isPlugged || plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS;
        }
        return isPlugged;
    }
    

    支持无线充电的小更新。

    【讨论】:

      【解决方案3】:

      致电registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED))。这将返回一个 Intent,它在 BatteryManager 上定义了额外内容,让您知道它是否已插入。

      这是因为Intent.ACTION_BATTERY_CHANGED 是一个粘性广播。

      【讨论】:

      • 所以当时没有办法查询吗?您必须在应用中的某个位置保存电池状态,然后在收到这些广播时更改它?
      • @MattC:“所以当时没有办法查询吗?” - 是的。事实上,这正是我的回答告诉你如何完成的。
      • 我的想法更像是找一个经理,然后说 isPluggedIn()。注册广播接收器然后在我得到信息后取消注册似乎很乱。
      • @MattC:您没有阅读我的答案。继续重读,直到你注意到我没有告诉你注册BroadcastReceiver。我告诉你打电话给registerReceiver(),但第一个参数是null。现在,如果这些数据可以简单地在BatteryManager 上获得,那很好,但您绝对不必注册BroadcastReceiver,正如我的回答所述。
      • @MattC:“从设计的角度来看,这似乎仍然不够直观。” ——那里没有争论。每次我讲授这一点时,我的学生都会咯咯地笑。 BatteryManager 上的方法似乎是一种更合乎逻辑的方法。但是,生活还要继续。
      【解决方案4】:

      在 Android M+ 上,您可以通过getSystemService(BATTERY_SERVICE) 使用BatteryManager 服务。在运行 pre-M 的设备上,您可以使用其他人提到的粘性广播。示例:

      public static boolean isCharging(Context context) {
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
              BatteryManager batteryManager = (BatteryManager) context.getSystemService(Context.BATTERY_SERVICE);
              return batteryManager.isCharging();
          } else {
              IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
              Intent intent = context.registerReceiver(null, filter);
              int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
              if (status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL) {
                  return true;
              }
          }
          return false;
      }
      

      【讨论】:

      • 我不明白为什么当电池状态已满时认为是正在充电?当它充满 100% 时会发生什么然后你拔掉它仍然说它正在充电不会错吗?
      【解决方案5】:

      你的答案在android reference

      示例代码如下:

      // 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;
      

      【讨论】:

        【解决方案6】:

        简单的方法是使用意图过滤器ACTION_BATTERY_CHANGED

        public void checkBatteryState(View sender) {
            IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
            Intent batteryStatus = registerReceiver(null, filter);
        
            int chargeState = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
            String strState;
        
            switch (chargeState) {
                case BatteryManager.BATTERY_STATUS_CHARGING:
                case BatteryManager.BATTERY_STATUS_FULL:
                    strState = "charging";
                    break;
                default:
                    strState = "not charging";
            }
        
            TextView tv = (TextView) findViewById(R.id.textView);
            tv.setText(strState);
        }
        

        【讨论】:

        • 未解决的参考:kotlin 或 java 中的 registerReceiver 我能做什么
        【解决方案7】:

        试试这个:

        public class PowerConnectionReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
        
                IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
                Intent batteryStatus = context.registerReceiver(null, ifilter);
        
        
                int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
                boolean isCharging =    status == BatteryManager.BATTERY_STATUS_CHARGING ||
                                        status == BatteryManager.BATTERY_STATUS_FULL;
        
                int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
                boolean usbCharge   = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
                boolean acCharge    = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
        
        
                if (batteryStatus != null) {
                    int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
                    int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
                    float batteryPct = level / (float) scale;
                }
        
        
            }//end onReceive
        
        
        }//end PowerConnectionReceiver
        

        【讨论】:

          【解决方案8】:
          BroadcastReceiver receiver = new BroadcastReceiver() {
          
              @Override
              public void onReceive(Context context, Intent intent) {
                  // TODO Auto-generated method stub
                  String action = intent.getAction();
                  if(action.equalsIgnoreCase(ACTION_POWER_CONNECTED))
                  {
          
          
                          if(chargerConnected != null )
                          {
                              chargerConnected.setText("Cable Connected");
                          }
                          if(chargerImage != null )
                          {
                              chargerImage.setImageDrawable(getResources().getDrawable(R.drawable.usb));
                          }
          
                  }else if(action.equalsIgnoreCase(ACTION_POWER_DISCONNECTED))
                  {
          
          
                          if(chargerConnected != null )
                          {
                              chargerConnected.setText("NOT CHARGE");
                          }
                          if(chargerImage != null )
                          {
                              chargerImage.setImageDrawable(getResources().getDrawable(R.drawable.battery_icon));
                          }
          
                      try {
          
                          Toast.makeText(context, "Power Cable Disconnected", Toast.LENGTH_SHORT).show();
                      }catch (Exception e){e.printStackTrace();}
          
                  }
              }
          };
          

          【讨论】:

            【解决方案9】:

            这是一个粘性意图,您不需要注册广播接收器——只需调用 registerReceiver 传入 null 作为接收器,如下一个 sn-p 所示,返回当前电池状态意图。您可以在此处传入一个实际的 BroadcastReceiver 对象,但我们将在后面的部分中处理更新,因此没有必要。

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

            您可以提取当前的充电状态,如果设备正在充电,无论是通过 USB 还是交流充电器充电:

            // 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;
            

            每当设备连接或断开电源时,BatteryManager 都会广播一个动作。即使在您的应用程序没有运行时接收这些事件也很重要——特别是因为这些事件会影响您启动应用程序以启动后台更新的频率——因此您应该在清单中注册一个 BroadcastReceiver 以通过以下方式监听这两个事件在意图过滤器中定义 ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED

            <receiver android:name=".PowerConnectionReceiver">
              <intent-filter>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
                <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
              </intent-filter>
            </receiver>
            

            在关联的 BroadcastReceiver 实现中,您可以提取当前的充电状态和方法,如上一步所述。

            public class PowerConnectionReceiver extends BroadcastReceiver {
                @Override
                public void onReceive(Context context, Intent intent) {
                    int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
                    boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                                        status == BatteryManager.BATTERY_STATUS_FULL;
            
                    int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
                    boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
                    boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2012-05-27
              • 2012-09-02
              • 2011-05-31
              • 1970-01-01
              • 2011-09-09
              • 1970-01-01
              • 2013-07-09
              • 2014-10-05
              • 1970-01-01
              相关资源
              最近更新 更多