Обнаружение зарядки аккумулятора 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
}
}
Другие вопросы по тегам