【发布时间】:2013-11-30 22:28:00
【问题描述】:
我想定期获取 Android 设备的电池状态。
由于每隔几分钟轮询一次电池更换是一个坏主意,我想使用一个可能每小时响一次的重复警报来调用一个获取当前电池状态的类。
但是我当前的实现给了我一个例外:
android.content.ReceiverCallNotAllowedException: IntentReceiver components are not allowed to register to receive intents.
闹钟超时调用的类如下:
public class GetBatteryStatusTimeout extends BroadcastReceiver{
private static final String TAG = "GetBatteryStatusTimeout";
@Override
public void onReceive(Context context, Intent intent) {
BatteryDataManager batteryData = new BatteryDataManager(context);
batteryData.getStatus();
Log.e(TAG, "GetBatteryStatus timer expired, getting status");
}
}
getStatus() 方法调用代码注册粘性 Intent 并获取电池状态:
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING;
boolean fullyCharged = status == BatteryManager.BATTERY_STATUS_FULL;
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
在我为这个接收器注册的地方引发了异常。
我明白异常在说什么(我想!),但我没有调用代码来从另一个接收器中注册粘性意图?
警报接收器调用另一个类,然后为接收器注册电池更改意图....但显然这也是不允许的?
有什么选择?
此外,该异常仅在某些设备上引发,而该应用程序在其他设备上运行良好?
【问题讨论】:
标签: android android-intent broadcastreceiver alarmmanager battery