尝试确定电池电量时出现“不允许IntentReceiver组件注册以接收意图”的错误提示。

22

我正在按照http://developer.android.com/training/monitoring-device-state/battery-monitoring.html中的指南尝试从我的应用程序中获取电池信息。

这是我想到的检查电池电量的方法:

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是在类中之前初始化的Context对象。

这是我得到的错误信息。

    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)

我需要知道的是意图接收器组件不允许注册接收意图的含义以及如何解决它。

谢谢

1个回答

98

改为:

c.registerReceiver(null, iFilter)

使用:

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

传递给onReceive()Context被阻止调用registerReceiver(),即使使用nullBroadcastReceiver也一样。


1
如果我的接收器是在 AndroidManifest 中注册的呢? - IgorGanapolsky
1
@IgorGanapolsky:我不知道您如何在已注册了manifest的接收方中获得该错误。 - CommonsWare
1
@CommonsWare 我在 Android 版本 4.1.2 及更低版本上看到了同样的错误,即使我使用了这个解决方案。如果我在注册接收器之前将上下文转换为应用程序上下文,那么这是怎么发生的呢?你有什么想法吗? - neonDion
1
@neonDion:就我个人而言,除了操作系统或原始设备制造商的错误之外,我不知道为什么会出现这种情况。您可能需要发布一个单独的问题。 - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接