Обнаружение зарядки аккумулятора Android
Я программно отклоняю входящие звонки. "Отклонение вызова" и "sendSMS" работают нормально, но я хочу отклонить вызов, только если телефон находится в режиме зарядки.
Я пытаюсь реализовать следующий код:
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)
Спасибо.
3 ответа
Ваш isCharging()
Метод предположительно вызывается из onReceive()
из BroadcastReceiver
, В этом случае вы не можете позвонить registerReceiver()
напрямую, даже с null
Первый параметр
Вместо:
Intent batteryStatus = contextMember.registerReceiver(null, ifilter);
пытаться:
Intent batteryStatus = contextMember.getApplicationContext().registerReceiver(null, ifilter);
Смотрите этот пост в блоге для получения дополнительной информации.
Добавьте разрешения в ваш файл Manifyt
<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 транслирует все данные о батарее и зарядке в "липком" намерении, которое включает состояние зарядки.
Состояние зарядки может изменяться так же легко, как и устройство, подключенное к сети, поэтому важно следить за изменениями в состоянии зарядки и соответственно изменять частоту обновления.
Ссылка:// документация 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.
}
}
В своей деятельности создайте новый 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
}
}