2012-04-24 2 views
3

여기에 약간의 문제가 있습니다.Android : 배터리가 정의 된 수준에 도달하면 무언가를하십시오

배터리가 10 % 인 경우에만 내 앱이 해보기를 원합니다.

내 앱에서 배터리 잔량을 지속적으로 감지하지 못합니다. LOW_BATTERY 의도를 기다립니다.

전 수준을 지정하지 않은 경우 그것은 작동하지만, 3 회 작동 : 15 %, 10 %, 및

이 난 단지는 10 %에서 뭔가를하고 싶은 5 %.

여기 내 코드입니다 :

public void onReceive(Context context, Intent intent) 
{ 
    if(intent.getAction().equals(ACTION_BATTERY_LOW)) 
    { 
     int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
     int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100); 
     int percent = (level*100)/scale; 

     if(percent == 10) 
     { 
      // Do Something 

     } 
    } 
} 
+2

세 가지 알림을 수락하지 않고 각 알림에서 배터리 수준을 테스트하고 그것이 10 % 일 때 행동 하는가? – Sam

+2

샘의 의견 외에도 정확한 10 % 방송을받을 수 있다고 보장 할 수는 없습니다. 특정 장치는 11 %에서 다시 방송하고 9 %에서 다시 방송 할 수 있습니다. – CommonsWare

+0

샘에게 : 이봐,이게 정확히 내가하는거야! 배터리 부족에 대한 알림을받은 다음 10 %인지 확인한 다음 조치를 취합니다. 하지만 결코 작동하지 않습니다. CommonsWare가 11 %를 9로 받아 들여야한다고 제안했을 수도 있습니다. 내가 말해 줄께! 감사 ! ;) – FrenchDude

답변

6

ACTION_BATTERY_LOW에는 읽을 거리가있는 엑스트라가 없기 때문에 매번 percent-1이됩니다.

@bimal이 암시하는대로, 해당 추가 ACTION_BATTERY_CHANGED 브로드 캐스트에 첨부 된입니다. 그러나 그렇다고해서 대신 수신하도록 등록해야한다는 의미는 아닙니다. ACTION_BATTERY_CHANGED은 끈적 거리기 때문에 registerReceiver()은 마지막 인 텐트를 즉시 반환합니다. 그것은 당신이 뭔가를 할 수 있다는 것을 의미합니다 : 당신이 등록 취소에 대해 걱정할 필요가 없습니다

public void onReceive(Context context, Intent intent) { 
    if(intent.getAction().equals(ACTION_BATTERY_LOW)) { 
     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, 100); 
     int percent = (level*100)/scale; 

     if (percent <= 10 && percent > 5) { 
      // Do Something 
     } 
    } 
} 

registerReciever() 것을이하는 null 브로드 캐스트 리시버 호출되었습니다. 이것은 "배터리 상태가 지금 무엇입니까?"라고 말하기에 좋은 깨끗한 방법입니다. (글쎄, 기술적으로는 이었습니다. 방송 시간은 마지막으로 Broadcast가 전송 된 시간입니다.)

+0

감사합니다. 하지만 지금은 어떻게하면 "무언가"를 한 번만하고, 다음 번에 낮아질 때까지 한 번만 수행 할 수 있습니까? – FrenchDude

+0

@ user1352526 그건 다른 질문이지만, 충분히 간단합니다. 'ACTION_BATTERY_OKAY'는 배터리가 더 이상 "부족"하지 않을 때 알려주는 것입니다.그래서 1) 해당 방송에 등록하십시오, 2) LOW 상태에 응답하여 무언가를 할 때 "이 낮은 상태가 처리되었습니다"라는 플래그를 설정하십시오, 3) LOW 브로드 캐스트를 수신하면 무시합니다 이미 처리 된 상태이며, 4) OKAY 방송을받을 때 그 깃발을 지우십시오. –

+0

대단히 감사하겠습니다. 유용 할 수 있습니다. – FrenchDude

3

이 경우, 당신은 "ACTION_BATTERY_CHANGED"이 당신을 도울 것입니다

public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (Intent.ACTION_BATTERY_CHANGED.equals(action)) { 
      int level = intent.getIntExtra("level", 0); 
      int scale = intent.getIntExtra("scale", 100); 
      double batStatus = level * 100/scale; 
     } 
    } 

희망을 사용할 수 있습니다.

관련 문제