2016-12-04 90 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始终是假的,无论手机连接与否。像级别和比例等变量始终为-1。

相同的代码工作完美,当我在活动课中使用它。 请帮忙。提前致谢。

回答

0

添加ACTION_BATTERY_CHANGED的意图过滤器的动作。

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

...

+0

仍然是同样的问题 – user3190959

+0

添加意图填充符(并且不要替换您的所有内容( )您确定它会一直返回-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