Не получается состояние батареи или уровень заряда батареи в классе вещательного приемника
Я пытаюсь узнать состояние и уровень заряда батареи в классе приемника вещания, а затем отобразить его в уведомлении.
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 всегда ложна, независимо от того, подключен телефон или нет. Переменные, такие как уровень и масштаб, всегда имеют значение -1.
Тот же код работает отлично, когда я использую его в классе деятельности. пожалуйста помоги. заранее спасибо.
2 ответа
Добавьте действие ACTION_BATTERY_CHANGED в фильтр намерений.
<receiver android:name=".BatteryBroadcasts">
<intent-filter>
<action android:name="android.intent.action.ACTION_BATTERY_CHANGED"/>
...
Я сделал это так:
<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, отображается тостовое сообщение. Если вы используете эмулятор 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
всплывающее сообщение
Надеюсь, поможет!!!