1

Android BroadCastReceiver で次のコード スニペットを使用して、android.intent.action.PHONE_STATE 変更イベントをキャッチしています。イベントを正常に認識し、着信コールを処理することも、次のコードで実行できます。

私の要件は、特定の番号から着信している通話を識別し、コードを介してその通話を終了し、その着信イベントに対して Web サービスを呼び出すことです。

ここでは、このコードは着信イベントと終了イベントに対して 2 回実行されます。

このメソッドを 2 回呼び出すのをやめたいです。2 番目のイベントのコード スニペットの呼び出しを停止するにはどうすればよいですか (呼び出しを終了します)。誰かがこれについて私を助けることができれば、それは素晴らしいことです。

 if (intent.getAction().equals(
            "android.intent.action.PHONE_STATE")) {
        Log.i("INFO", "Call Received");

        try {

            TelephonyManager telephony = (TelephonyManager) context
                    .getSystemService(Context.TELEPHONY_SERVICE);

            Bundle bundle = intent.getExtras();

            Log.i("Calling database", "Creatinng DataHandler Object");
            DatabaseHandler db = new DatabaseHandler(context);
            String phoneNumber =db.getContact().getPhoneNumber();

            Log.i("Retriving : ", "Retriving .."+ db.getContact().getPhoneNumber());


            if ((bundle.getString("incoming_number").equals(phoneNumber))) {

                Log.i("Test Call", "This is the test call");

                @SuppressWarnings("rawtypes")
                Class c = Class.forName(telephony.getClass().getName());
                Method m = c.getDeclaredMethod("getITelephony");
                m.setAccessible(true);

                ITelephony telephonyService = (ITelephony) m
                        .invoke(telephony);
                telephonyService = (ITelephony) m.invoke(telephony);


                telephonyService.endCall();

                // Call the web service and send log details

                ServiceClient sc = new ServiceClient();
                sc.serviceCall(context);


            } else {
                Log.i("Normal Call", "This is not the test call");
            }

        } catch (Exception e) {
            Log.i("Exception Occured", "Exception in call code snipet");
        }
    }

}

4

4 に答える 4

4

あなたが抱えている問題は、電話の状態が2回変化することだと思います。1回は電話が鳴ったとき、次に、通話を終了した後、電話がアイドル状態になったときです。

このコードは 1 回だけ実行する必要があるため、電話が鳴っているかどうかを確認するために電話の状態の追加チェックを追加し、電話が鳴っている場合は通話を終了することをお勧めします。

これは、次のチェックを追加することで実現できます。

if (intent.getAction().equals(
        "android.intent.action.PHONE_STATE")) {
    Log.i("INFO", "Call Received");

String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
//your code here that starts with try block
}

それが役立つことを願っています

于 2013-05-04T01:19:33.700 に答える
0

受信機が起動したらすぐに、次のようなことを試すことができます。

    Bundle bundle = nIntent.getExtras();
    String phoneNr= bundle.getString("incoming_number");

    if(null == phoneNr)
    {   // this is outgoing call so bail out
        return;
    }
于 2012-10-05T11:31:41.613 に答える
0

Android のセキュリティ上の理由により、サードパーティ製アプリケーションを使用して着信を終了することはできません。「Android アプリ開発クックブック」ページ番号「164」で確認

于 2014-04-02T02:53:27.507 に答える
0

手遅れであることはわかっていますが、これに対する打者の解決策を見つけました。これは通常、5.0 および 5.1 で発生します。2 回呼び出すのを止めることはできませんが、すべての作業を 1 点で行うユニバーサル チェックを行うことができます。そして、このソリューションはすべての OS で普遍的に機能します。ここにコードがあります

public void onReceive(Context context, Intent intent) {
    Object obj = intent.getExtras().get("subscription");
      long subId;
      if(obj == null) {
        subId = Long.MIN_VALUE; // subscription not in extras
      } else {
        subId = Long.valueOf(obj.toString()); // subscription is long or int
      }

      if(subId < Integer.MAX_VALUE) {
        // hurray, this is called only once on all operating system versions!
      }}

詳細については、このリンクを確認してください。

于 2017-04-05T12:12:27.610 に答える