2016-12-04 17 views
0

Я пытаюсь получить статус батареи и уровень в классе вещательного приемника, а затем отобразить ее в уведомлении.Не получать статус батареи или уровень заряда батареи в широковещательном приемном классе

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 всегда ложно независимо от того, телефон не подключен или нет. Переменные типа level и scale всегда равны -1.

Тот же код отлично работает, когда я использую его в классе действий. , пожалуйста, помогите. заранее спасибо.

ответ

0

добавьте действие ACTION_BATTERY_CHANGED в фильтр намерений.

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

...

+0

Еще одна проблема – user3190959

+0

добавьте намерение filler (и не заменяйте его тем, что у вас было ( ). Вы уверены, что все это время возвращает -1? Попробуйте подключить и отключить зарядное устройство, показывает ли он все -1 все время? – fbwnd

+0

Да -1 каждый раз – user3190959

0

Я сделал это так:

<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.

Надеюсь, что это поможет !!!

+0

Нужно ли регистрировать приемник briadcast в действии, если я уже зарегистрировал его в манифесте – user3190959

+0

Да, я думаю, вам также необходимо зарегистрироваться. –

+0

onReceive в классе приемника briadcast вызывается каждый раз, не содержит каких-либо дополнительных данных, таких как уровень заряда аккумулятора – user3190959

 Смежные вопросы

  • Нет связанных вопросов^_^