2016-12-04 4 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 상관없이 전화가 연결되지되지 않거나 항상 false입니다. 레벨 및 스케일과 같은 변수는 항상 -1입니다.

동일한 코드는 활동 클래스에서 사용할 때 완벽하게 작동합니다. 도와주세요. 미리 감사드립니다.

답변

0

ACENT_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에서 다음과 같이 작성하십시오 :

,210
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 토스트 메시지가 표시된다.

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

그리고 당신은 사용할 수 있습니다 : 다음

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

및 사용 : 당신이 에뮬레이터 AVD를 사용하고 다음을 테스트하려면 난 당신과 같이 텔넷을 통해 에뮬레이터에 연결해야한다고 제안한다 :

power capacity 15 

그리고 Toast 메시지 팝업이 표시됩니다.

희망이 있습니다. !!!

+0

이미 매니 페스트에 등록한 경우 briadcast 리시버를 등록해야합니다. – user3190959

+0

예. 등록해야한다고 생각합니다. –

+0

브리 아드 캐스트 수신기 클래스의 onReceive가 매번 의도적으로 호출됩니다. 배터리 레벨과 같은 추가 데이터가 없습니다. – user3190959