【问题标题】:Detecting Battery Charging Android检测电池充电 Android
【发布时间】:2013-04-23 19:09:30
【问题描述】:

我以编程方式拒绝来电。 “呼叫拒绝”和“sendSMS”工作正常, 但我只想在手机处于充电模式时拒接电话。

我正在尝试实现以下代码:

  case TelephonyManager.CALL_STATE_RINGING:

        if (isCharging())
        {
            reject();
            sendSMS(incomingNumber);
        } 

  break;

正在充电:

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)

谢谢。

【问题讨论】:

  • 检查 LogCat 并查看与您的“暗恋”相关的堆栈跟踪。

标签: java android battery


【解决方案1】:

在清单文件中添加权限

  <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>

在您的类中添加此代码,您可以设置变量标志 isCharging 并设置检查。 BatteryManager 在包含充电状态的粘性 Intent 中广播所有电池和充电详细信息。

充电状态可以像插入设备一样轻松更改,因此监控充电状态的变化并相应地更改刷新率非常重要。

参考 developer.android.com 文档。

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

【讨论】:

    【解决方案2】:

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

    代替:

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

    尝试:

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

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

    【讨论】:

    • 你完全正确!我靠了一些东西。 :) 谢谢。
    【解决方案3】:

    在您的活动中,创建一个新的 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,真的。我认为您可以在需要检查电池状态时注册您的接收器,并在检查后取消注册。所以也许覆盖 onResume()onPause() 是额外的工作。
    • @CommonsWare 是的,你是对的。感谢您指出了这一点。赞赏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多