2015-01-18 2 views
0

배터리 모니터 응용 프로그램을 만들고 있는데 현재 배터리 백분율을 표시하려고합니다. 나는 듣고있는 방송 수신기를 가지고있다 ...현재 배터리 백분율을 얻는 방법?

<action android:name="android.intent.action.BATTERY_CHANGED" /> 

수신기에는 다음 코드가있다. 어떤 이유

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

currentBatteryLevel = level/(float) scale; 

Toast.makeText(context, "Current battery level: " + Float.toString(currentBatteryLevel) + "%", Toast.LENGTH_SHORT).show(); 

는, 결과는 어디에서 잘못 가고 ... 항상 Current battery level: 1.0%입니까?

편집 :

리시버가

패키지 com.garciaericn.t2d ...

<receiver android:name=".PowerMonitorReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> 
     <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> 
     <action android:name="android.intent.action.BATTERY_LOW" /> 
     <action android:name="android.intent.action.BATTERY_OKAY" /> 
     <action android:name="android.intent.action.BATTERY_CHANGED" /> 
    </intent-filter> 
</receiver> 

내 수신기는 ...로 매니페스트에 등록되어;

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.BatteryManager; 
import android.util.Log; 
import android.widget.Toast; 

public class PowerMonitorReceiver extends BroadcastReceiver { 

    private static final String TAG = "PowerMonitorReceiver.TAG"; 
    private float currentBatteryLevel; 

    @Override 
    public void onReceive(Context context, Intent intent) { 



     // Obtain action from intent to check which broadcast is being received 
     String action = intent.getAction(); 

     // Perform action according to type 
     switch (action) { 
      case (Intent.ACTION_BATTERY_CHANGED): { 
       Log.i(TAG, "Battery has changed"); 

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

       currentBatteryLevel = (level * 100)/(float) scale; 

       Toast.makeText(context, "Current battery level: " + Float.toString(currentBatteryLevel) + "%" + " level: " + level + " scale: " + scale, Toast.LENGTH_LONG).show(); 

       break; 
      } 
      case (Intent.ACTION_POWER_CONNECTED): { 
       Log.i(TAG, "Power connected"); 

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

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

       String chargingType = null; 

       if (usbCharge) { 
        chargingType = "USB"; 
       } else if (acCharge) { 
        chargingType = "AC Power"; 
       } 

       if (isCharging && chargingType != null) { 
        Toast.makeText(context, "Device is charging via: " + chargingType, Toast.LENGTH_SHORT).show(); 
       } else { 
        Toast.makeText(context, "Device is charging.", Toast.LENGTH_SHORT).show(); 
       } 
       break; 
      } 
      case (Intent.ACTION_POWER_DISCONNECTED): { 
       Log.i(TAG, "Power disconnected"); 
       Toast.makeText(context, "Power Disconnected", Toast.LENGTH_SHORT).show(); 
       break; 
      } 
      case (Intent.ACTION_BATTERY_LOW): { 
       Log.i(TAG, "Battery low"); 
       Toast.makeText(context, "Battery low", Toast.LENGTH_SHORT).show(); 
       break; 
      } 
      case (Intent.ACTION_BATTERY_OKAY): { 
       Log.i(TAG, "Battery Okay"); 
       Toast.makeText(context, "Battery Okay", Toast.LENGTH_SHORT).show(); 
       break; 
      } 
     } 
    } 
} 
+0

수신자 게시 위치 및 등록처 – tachyonflux

답변

0

여러 브로드 캐스트를 듣고 있으므로 브로드 캐스트의 유형을 결정해야합니다.

String action = intent.getAction(); 

if(action.equals(Intent.ACTION_BATTERY_CHANGED)){ 
    int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); 
    int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100); 
    int percent = (level*100)/scale; 

    Toast.makeText(context, "Current battery level: " + percent + "%", Toast.LENGTH_SHORT).show(); 
} 
+0

감사합니다. 확실히 도움이됩니다. 이것은 다른 모든 트리거에 대해 작동하고 작동합니다. 그러나'BATTERY_CHANGED'는 절대로 호출되지 않습니다. 배터리로 다른 이벤트를 시뮬레이션하는 물리적 장치 및 Genymotion 에뮬레이터를 사용해 보았습니다. – ENG618

1

나는 꽤 늦었다 고 생각하지만 해결책은 매우 간단합니다. this link에 따르면 브로드 캐스트 수신기가 xml로 등록 된 경우 고정 브로드 캐스트이므로 BATTERY_CHANGED에 대한 업데이트를 수신하지 않습니다.

Java 프로그램에 Broadcast Receiver를 등록해야합니다.

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
Intent batteryStatus = context.registerReceiver(null, ifilter); 

int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 
float batteryPct = (level * 100)/(float)scale; 

참고 : 수신기에 "null"을 건드리지 만 모든 필수 배터리 데이터를받을 수 있습니다. 지속적인 모니터링을 위해 "null"대신 Receiver 클래스를 전달할 수도 있지만이 브로드 캐스트가 자주 발생하므로 장치 배터리가 소모 될 수 있습니다.

0
boolean acCharge = false; 
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
Intent batteryStatus = registerReceiver(null, ifilter); 
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || 
     status == BatteryManager.BATTERY_STATUS_FULL; 

if(isCharging){ 
     chargePercentage = 
     batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
    } 

chargePercentage 변수는 현재 요금 비율을 알려줍니다.

관련 문제