检查设备是否已插入

Jos*_*osh 53 android batterymanager

我的应用程序有一个广播接收器来监听更改ACTION_POWER_CONNECTED,并反过来标记屏幕保持.

我缺少的是应用程序在首次运行时检查充电状态的能力.谁能帮我用代码手动检查充电状态?

Gee*_*cko 146

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

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

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

  • 并且不要忘记取消注册接收器 (3认同)
  • @JeffreyBlattman 这不是必需的,因为您一开始并没有真正注册接收器 (3认同)
  • 它正在注册到空接收器。@杰弗里·布拉特曼 (2认同)

wan*_*nam 29

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

支持无线充电的小更新.


Com*_*are 25

打电话registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)).这将返回一个Intent已定义的额外内容,BatteryManager以告知您是否已插入.

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

  • 所以当时没有办法正确查询?你必须在你的应用程序的某个地方保持电池的状态,然后在收到这些广播时更改它吗? (2认同)
  • @MattC:"所以当时没有办法正确查询?" - 是的 事实上,这正是我的回答告诉你如何完成的. (2认同)
  • @MattC:“从设计的角度来看,似乎仍然不够直观。” ——没有争论。每次我教这一点时,我都会得到学生的笑声。`BatteryManager` 上的方法似乎是一种更合乎逻辑的方法。但生活还要继续。 (2认同)

Jar*_*ler 7

在Android M +上,您可以BatteryManager通过来使用该服务getSystemService(BATTERY_SERVICE)。在运行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;
}
Run Code Online (Sandbox Code Playgroud)


Smi*_*ile 6

你的答案是在 android参考!

这是示例代码:

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


Adi*_*iii 5

简单的方法是使用意图过滤器 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);
}
Run Code Online (Sandbox Code Playgroud)