【问题标题】:Not getting battery status or battery level in broadcast receiver class在广播接收器类中未获取电池状态或电池电量
【发布时间】:2016-12-04 15:03:23
【问题描述】:

我正在尝试在广播接收器类中获取电池状态和电量,然后将其显示在通知中。

public class BatteryBroadcasts extends BroadcastReceiver {

private static final int NOTIFICATION_ID = 234234;
@Override
public void onReceive(Context context, Intent intent) {

    String notiText;
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context).setSmallIcon(R.drawable.ic_launcher).setContentTitle("Battery Alarm").setContentText(showBatteryStatus(intent));

    Intent resultIntent = new Intent(context, MainActivity.class);
    PendingIntent resultPendingIntent =PendingIntent.getActivity(context,0,resultIntent,PendingIntent.FLAG_UPDATE_CURRENT);
    mBuilder.setContentIntent(resultPendingIntent);
    NotificationManager mNotificationManager =(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());



}
private String showBatteryStatus(Intent batteryStatus){
    String batteryStat = new String();

    int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
    boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;


    int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
    boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
    boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;



    int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
    int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);


    float batteryPct = ((float)level / (float)scale)*100;
    Log.d("in notification","battery stat "+level+"scale"+scale+" "+batteryPct);

    int voltage = batteryStatus.getIntExtra(BatteryManager.EXTRA_VOLTAGE,-1);



    if(isCharging && usbCharge )
        batteryStat="Charging on USB\n";
    if(isCharging && acCharge )
        batteryStat="Charging on AC\n";
    if(!isCharging)
        batteryStat="Discharging\n ";

    return batteryStat+batteryPct+"% battery left.";
}

}

清单文件

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.r3h.batteryalarm">

<!-- Include required permissions for Google Mobile Ads to run. -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.BATTERY_STATS"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <!-- This meta-data tag is required to use Google Play Services. -->
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

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

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity> <!-- Include the AdActivity configChanges and theme. -->
    <activity
        android:name="com.google.android.gms.ads.AdActivity"
        android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
        android:theme="@android:style/Theme.Translucent" />
</application>

当充电状态发生变化时,会调用 onReceive 但变量 isCharging 始终为 false,无论手机是否连接。 level 和 scale 等变量始终为 -1。

当我在活动类中使用相同的代码时,它可以完美运行。 请帮忙 。提前致谢。

【问题讨论】:

    标签: android broadcastreceiver battery batterylevel


    【解决方案1】:

    将动作 ACTION_BATTERY_CHANGED 添加到意图过滤器。

    <receiver android:name=".BatteryBroadcasts">
        <intent-filter>
            <action android:name="android.intent.action.ACTION_BATTERY_CHANGED"/>
    

    ...

    【讨论】:

    • 还是同样的问题
    • 添加意图填充(并且不要用你拥有的替换(你确定它总是返回-1吗?尝试插入和拔出充电器,它仍然显示-1一直?
    • 每次都是-1
    【解决方案2】:

    我是这样做的:

    <receiver android:name="CheckBatteryStatusReceiver" ></receiver>
    

    然后我有这样的接收器:

    public class CheckBatteryStatusReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent != null){
                int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
                if (level <= 15){
                    Toast.makeText(context, "Batter level " + level + "% is very low. Please connect to a charger.", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
    

    不要忘记在您的Activity onCreate() 中注册接收器,例如:

    private void setupReceiver() {
            CheckBatteryStatusReceiver batteryStatusReceiver = new CheckBatteryStatusReceiver();
            registerReceiver(batteryStatusReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        }
    

    然后在onPause() 中使用:

    @Override
        protected void onPause() {
            super.onPause();
            try {
                if (batteryStatusReceiver != null){
                    unregisterReceiver(batteryStatusReceiver);
                }
            }catch (IllegalArgumentException e){
                e.printStackTrace();
            }
        }
    

    当它小于 15 或 15 时,将显示 toast 消息。如果您正在使用模拟器 AVD 并且想要对其进行测试,那么我建议您应该通过 Telnet 连接到模拟器,如下所示:

    telnet localhost 5554(emulator port(you can see that using adb devices))
    

    然后使用:

    auth key(you will find a key for emulator in the default path of you AndroidStudioProjects)
    

    然后你可以使用:

    power capacity 15
    

    你会看到Toast消息弹出。

    希望对你有帮助!!!

    【讨论】:

    • 如果我已经在清单中注册了广播接收器,是否需要在活动中注册它?
    • 每次调用广播接收器类中的onReceive,但意图不包含任何额外的数据,如电池电量
    • 我想我会告诉你如何检查电池电量...你的意思是你想每次都获得当前的电池电量?
    • 不可能吗?
    • 有可能......也许你必须使用服务......不太确定你为什么要这样做??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多