2014-07-24 15 views
14

Sto cercando di ottenere informazioni Batteria dalla mia applicazione seguendo le linee guida a http://developer.android.com/training/monitoring-device-state/battery-monitoring.html"componenti IntentReceiver non sono autorizzati a registrarsi per ricevere gli intenti" quando si cerca di determinare il livello della batteria

Questo è il metodo è venuto su con per controllare il livello della batteria:

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 viene inizializzato come Context oggetto in precedenza nella classe.

Questo è il messaggio di errore che sto ottenendo

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) 

Che cosa ho bisogno di sapere è il significato di IntentReceiver components are not allowed to register to receive intents e come venire su di esso.

Grazie

risposta

59

Invece di:

c.registerReceiver(null, iFilter) 

uso:

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

Il Context che viene passato al onReceive() è bloccato dal chiamare registerReceiver(), anche con un nullBroadcastReceiver.

+1

Cosa succede se i miei ricevitori sono registrati su AndroidManifest? –

+1

@IgorGanapolsky: non sono a conoscenza del fatto che è possibile ottenere questo errore per i ricevitori registrati nel manifest. – CommonsWare

+1

@CommonsWare Sto vedendo questo stesso errore su Android versioni 4.1.2 e meno anche quando utilizzo questa soluzione. Qualche idea su come questo possa accadere anche se sto convertendo il contesto nel contesto dell'applicazione prima di registrare il ricevitore? – neonDion