2013-04-23 132 views
2

我在程序中拒绝来电。 “呼叫拒绝”和“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) 

谢谢。

+5

检查LogCat并查看与您的“粉碎”相关的堆栈跟踪。 – CommonsWare 2013-04-23 19:10:56

回答

3

isCharging()方法可能正在从BroadcastReceiveronReceive()调用。在这种情况下,您不能直接拨打registerReceiver(),即使是null的第一个参数。

相反的:

Intent batteryStatus = contextMember.registerReceiver(null, ifilter); 

尝试:

Intent batteryStatus = contextMember.getApplicationContext().registerReceiver(null, ifilter); 

更多背景信息,请参阅this blog post

+0

你是对的!我倾向于一些东西。 :) 谢谢。 – OlejkaKL 2013-04-23 20:39:35

1

在您的活动中,创建一个新的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 
} 
} 
+2

这应该没有必要。问题中显示的代码用于确定电池的当前状态。 – CommonsWare 2013-04-23 19:27:14

+0

@CommonsWare,True。我认为您可以在需要检查电池状态时注册接收器,并在检查后取消注册。所以也许重写'onResume()'和'onPause()'是额外的工作。 – StoneBird 2013-04-23 19:41:54

+0

使用OP所具有的代码会更简单。 – CommonsWare 2013-04-23 20:05:54

7

添加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. 
    } 
}