2014-07-24 3 views
14

Ich versuche Batterie Informationen meiner Anwendung nach den Richtlinien bei http://developer.android.com/training/monitoring-device-state/battery-monitoring.html„IntentReceiver Komponenten nicht registrieren erlaubt Absichten zu erhalten“, wenn sie versuchen Batterieniveau zu bestimmen

Dies ist die Methode zu erhalten ist, kam mit bis zu überprüfen der Batteriestand:

public void sendBatteryInfoMessage(){ 

    IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
    Intent batteryStatus = c.registerReceiver(null, iFilter); 

    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 isUsbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; 
    boolean isAcCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; 

    int batteryLevel = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
    int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 

    float batteryPct = batteryLevel/(float) scale; 

} 

c als Context Objekt zuvor in der Klasse initialisiert.

Dies ist die Fehlermeldung, die ich

07-24 18:11:23.445  634-634/wifi.myapp.sudara.lk.sudara_app W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x40028890) 
07-24 18:11:23.485  634-634/wifi.myapp.sudara.lk.sudara_app E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.RuntimeException: Unable to start receiver wifi.myapp.sudara.lk.sudara_app.SmsActivity: android.content.ReceiverCallNotAllowedException: IntentReceiver components are not allowed to register to receive intents 
      at android.app.ActivityThread.handleReceiver(ActivityThread.java:2821) 
      at android.app.ActivityThread.access$3200(ActivityThread.java:125) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2083) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:123) 
      at android.app.ActivityThread.main(ActivityThread.java:4627) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:521) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: android.content.ReceiverCallNotAllowedException: IntentReceiver components are not allowed to register to receive intents 
      at android.app.ReceiverRestrictedContext.registerReceiver(ContextImpl.java:138) 
      at android.app.ReceiverRestrictedContext.registerReceiver(ContextImpl.java:132) 
      at wifi.myapp.sudara.lk.sudara_app.BatteryInfo.sendBatteryInfoMessage(BatteryInfo.java:25) 
      at wifi.myapp.sudara.lk.sudara_app.SmsActivity.onReceive(SmsActivity.java:53) 
      at android.app.ActivityThread.handleReceiver(ActivityThread.java:2810) 
            at android.app.ActivityThread.access$3200(ActivityThread.java:125) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2083) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:123) 
            at android.app.ActivityThread.main(ActivityThread.java:4627) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:521) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
            at dalvik.system.NativeStart.main(Native Method) 

Was muss ich wissen, bin immer ist die Bedeutung von IntentReceiver components are not allowed to register to receive intents und wie man es über kommen.

Danke

Antwort

59

Statt:

c.registerReceiver(null, iFilter) 

Verwendung:

c.getApplicationContext().registerReceiver(null, iFilter) 

Die Context, die onReceive() geleitet wird, aus Aufruf registerReceiver() blockiert, auch mit einem nullBroadcastReceiver.

+1

Was passiert, wenn meine Empfänger stattdessen im AndroidManifest registriert sind? –

+1

@IgorGanapolsky: Ich bin mir nicht bewusst, dass Sie diesen Fehler für Empfänger im Manifest registriert erhalten können. – CommonsWare

+1

@CommonsWare Ich sehe diesen gleichen Fehler auf Android-Versionen 4.1.2 und weniger, auch wenn ich diese Lösung verwenden. Irgendwelche Ideen, wie dies geschehen kann, auch wenn ich den Kontext in den Anwendungskontext vor der Registrierung des Empfängers umwandeln werde? – neonDion

Verwandte Themen