检测电池充电Android
我在程序中拒绝来电。 “呼叫拒绝”和“sendSMS”正常工作, 但我只想在电话处于充电模式时拒绝来电。检测电池充电Android
我试图执行以下代码:
case TelephonyManager.CALL_STATE_RINGING:
if (isCharging())
{
reject();
sendSMS(incomingNumber);
}
break;
isCharging:
public boolean isCharging()
{
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = contextMember.registerReceiver(null, ifilter);
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean bCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
return bCharging;
}
但应用程序可以使破碎的来电。
请帮我弄清楚这一点!
我收到的logcat的以下错误:
E/AndroidRuntime(11160): FATAL EXCEPTION: main
E/AndroidRuntime(11160): android.content.ReceiverCallNotAllowedException: IntentReceiver components are not allowed to register to receive intents
E/AndroidRuntime(11160): at android.app.ReceiverRestrictedContext.registerReceiver(ContextImpl.java:163)
E/AndroidRuntime(11160): at android.app.ReceiverRestrictedContext.registerReceiver(ContextImpl.java:157)
E/AndroidRuntime(11160): at com.SmartDialer_app.SmartDialer.MyPhoneStateListener.isCharging(MyPhoneStateListener.java:106)
E/AndroidRuntime(11160): at com.SmartDialer_app.SmartDialer.MyPhoneStateListener.onCallStateChanged(MyPhoneStateListene r.java:57)
E/AndroidRuntime(11160): at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:393)
E/AndroidRuntime(11160): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(11160): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(11160): at android.app.ActivityThread.main(ActivityThread.java:4898)
E/AndroidRuntime(11160): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(11160): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(11160): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
E/AndroidRuntime(11160): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
E/AndroidRuntime(11160): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(11160): FATAL EXCEPTION: main
E/AndroidRuntime(11160): android.content.ReceiverCallNotAllowedException: IntentReceiver components are not allowed to register to receive intents
E/AndroidRuntime(11160): at android.app.ReceiverRestrictedContext.registerReceiver(ContextImpl.java:163)
E/AndroidRuntime(11160): at android.app.ReceiverRestrictedContext.registerReceiver(ContextImpl.java:157)
E/AndroidRuntime(11160): at com.SmartDialer_app.SmartDialer.MyPhoneStateListener.isCharging(MyPhoneStateListener.java:1 06)
E/AndroidRuntime(11160): at com.SmartDialer_app.SmartDialer.MyPhoneStateListener.onCallStateChanged(MyPhoneStateListener.java:57)
E/AndroidRuntime(11160): at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:393)
E/AndroidRuntime(11160): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(11160): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(11160): at android.app.ActivityThread.main(ActivityThread.java:4898)
E/AndroidRuntime(11160): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(11160): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(11160): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
E/AndroidRuntime(11160): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
E/AndroidRuntime(11160): at dalvik.system.NativeStart.main(Native Method)
谢谢。
你isCharging()
方法可能正在从BroadcastReceiver
的onReceive()
调用。在这种情况下,您不能直接拨打registerReceiver()
,即使是null
的第一个参数。
相反的:
Intent batteryStatus = contextMember.registerReceiver(null, ifilter);
尝试:
Intent batteryStatus = contextMember.getApplicationContext().registerReceiver(null, ifilter);
更多背景信息,请参阅this blog post。
你是对的!我倾向于一些东西。 :) 谢谢。 – OlejkaKL 2013-04-23 20:39:35
在您的活动中,创建一个新的BroadcastReceiver
实例或扩展它的类实例。同时创建您的IntentFilter
和意图被过滤。然后在您的活动中,覆盖onReceive()
并在活动收到相应的意图时添加您想要执行的任何操作。
您可以在onResume()
中实例化接收器类,并在onPause()
中取消其注册。
事情是这样的:
public class YourAc extends Activity{
BroadcastReceiver br;
@Override
public void onResume(){
//instantiate your intent filter and other related stuff here
//register the receiver
}
@Override
public void onPause(){
//unregister your receiver
}
@Override
public void onReceive(){
//change the boolean isCharging to false
}
}
这应该没有必要。问题中显示的代码用于确定电池的当前状态。 – CommonsWare 2013-04-23 19:27:14
@CommonsWare,True。我认为您可以在需要检查电池状态时注册接收器,并在检查后取消注册。所以也许重写'onResume()'和'onPause()'是额外的工作。 – StoneBird 2013-04-23 19:41:54
使用OP所具有的代码会更简单。 – CommonsWare 2013-04-23 20:05:54
添加permisions你Manifiest文件
<receiver android:name=".PowerConnectionReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
</intent-filter>
</receiver>
在你的类添加该代码,你可以设置一个varible标志isCharging和检查被设置好的。 BatteryManager以包含充电状态的粘性Intent广播所有电池和充电细节。
充电状态可以随设备插入一样方便地更改,因此监视充电状态以更改并相应地更改刷新率非常重要。
Ref:// developer.android.com documentation。
public class PowerConnectionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
//remove some variables if you don't need it.
}
}
检查LogCat并查看与您的“粉碎”相关的堆栈跟踪。 – CommonsWare 2013-04-23 19:10:56