2013-04-23 4 views
2

I; m программно отклоняет входящие вызовы. «Отклонить вызов» и «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

ответ

3

Ваш метод isCharging() предположительно вызывается из onReceive() в виде BroadcastReceiver. В этом случае вы не можете напрямую позвонить registerReceiver(), даже с первым параметром null.

Вместо:

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

попробовать:

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

См this blog post для более фона.

+0

Ты абсолютно прав! Я что-то наклонил. :) Спасибо. – OlejkaKL

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

+0

@CommonsWare, True.Я думаю, что вы можете зарегистрировать свой приемник в то время, когда вам нужно проверить состояние батареи, и отменить регистрацию после проверки. Поэтому, возможно, переопределение 'onResume()' и 'onPause()' является дополнительной работой. – StoneBird

+0

Было бы проще просто использовать код, который имеет OP. – CommonsWare

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 передает все данные об аккумуляторах и зарядке в липкое намерение, которое включает в себя статус зарядки.

Состояние зарядки может меняться так же легко, как устройство может быть подключено, поэтому важно следить за состоянием зарядки для изменений и соответственно изменять частоту обновления.

Ссылка: // документация разработчика.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. 
    } 
}