3

プログラムで着信を拒否しています。「通話拒否」と「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)

ありがとうございました。

4

3 に答える 3

8

マニフェスト ファイルにアクセス許可を追加します。

  <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 を設定し、is が設定されていることを確認できます。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.
    }
}
于 2013-04-23T19:35:33.280 に答える
3

あなたのisCharging()メソッドはおそらくonReceive()aから呼び出されていBroadcastReceiverます。その場合、最初のパラメーターを使用registerReceiver()しても、直接呼び出すことはできません。null

それ以外の:

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

試す:

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

背景の詳細​​については、このブログ投稿を参照してください。

于 2013-04-23T20:08:03.683 に答える
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
}
}
于 2013-04-23T19:14:03.750 に答える