4

Android で SMSManager を使用して、デバイスから他の人にテキスト メッセージを送信しています。

sentIntent が Activity.RESULT_OK で呼び出されたという事実に基づいて、配信されたと思われる SMS をユーザーが受信していないという報告がありました。それが本当に送信されたとき。

そこで、deliveryIntent を利用するべきだと考えました。

ここでの問題は、常に sentIntent コールバックを取得しますが、deliveryIntent コールバックを取得しないことです。

何か案は?コードは以下です、ありがとう。

        // The intent action to be unique so that we can have multiple
        // concurrent  pending intents.
        // http://developer.android.com/reference/android/app/PendingIntent.html
        String intentAction = TAG + "-" + callbackId;  // callbackId is unique
        Intent intent = new Intent(intentAction);
        intent.putExtra("phoneNumber", phoneNumber);
        intent.putExtra("callbackId", callbackId);
        intent.putExtra("message", message);

        PendingIntent sentPI = PendingIntent.getBroadcast(
            cordova.getActivity(), 0, intent, 0);

        cordova.getActivity().registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context ctx, Intent intent) {
                String sentToPhoneNumber = intent.getStringExtra("phoneNumber");
                String callbackId = intent.getStringExtra("callbackId");
                String message = intent.getStringExtra("message");
                int resultCode = getResultCode();
                int status = -1;
                String details = "";
                logger.log(Level.INFO, TAG + " SENT intent!! to: " +
                           sentToPhoneNumber + ", resultCode: " + resultCode);
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        status = 0;
                        break;
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                        details = "No service";
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                        details = "Null PDU";
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        details = "Radio off";
                        status = 1;
                        break;
                }

                JSONObject obj = new JSONObject();
                try {
                    obj.put("status", status);
                    obj.put("details", details);
                    obj.put("phone_number", sentToPhoneNumber);
                    obj.put("message", message);
                } catch (JSONException e) {
                    throw new RuntimeException(e);
                }
                sendAsyncResultStatus(callbackId, obj);
                ctx.unregisterReceiver(this);
            }
        }, new IntentFilter(intentAction));

        // The intent action to be unique so that we can have multiple
        // concurrent  pending intents.
        // http://developer.android.com/reference/android/app/PendingIntent.html
        String deliveryIntentAction = TAG + "-Delivery-" + callbackId;
        Intent deliveryIntent = new Intent(deliveryIntentAction);
        deliveryIntent.putExtra("phoneNumber", phoneNumber);
        deliveryIntent.putExtra("callbackId", callbackId);
        deliveryIntent.putExtra("message", message);

        PendingIntent deliveryPI = PendingIntent.getBroadcast(
            cordova.getActivity(), 0, deliveryIntent, 0);

        cordova.getActivity().registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context ctx, Intent intent) {
                logger.log(Level.INFO, TAG + " DELIVERY intent YOYO!!");
                String sentToPhoneNumber = intent.getStringExtra("phoneNumber");
                String callbackId = intent.getStringExtra("callbackId");
                String message = intent.getStringExtra("message");
                String pdu = intent.getStringExtra("pdu");
                logger.log(Level.INFO, TAG + " DELIVERY intent!! to: " +
                        sentToPhoneNumber + ", pdu: " + pdu);

                JSONObject obj = new JSONObject();
                try {
                    obj.put("pdu", pdu);
                    obj.put("phone_number", sentToPhoneNumber);
                    obj.put("message", message);
                } catch (JSONException e) {
                    throw new RuntimeException(e);
                }
                sendAsyncResultStatus(callbackId, obj);
                ctx.unregisterReceiver(this);
            }
        }, new IntentFilter(deliveryIntentAction));

        smsManager.sendTextMessage(phoneNumber, null, message, sentPI, deliveryPI);
4

2 に答える 2

5

DeliveryIntent は、一部のキャリアが提供する DeliveryReports に依存します。

DeliveryReports を提供するキャリアと提供しないキャリアがあります。DliveryReportsのキャリアサポートに関しては、3つのカテゴリがあります...

  • プロバイダーは DeliveryReport をまったく提供しません。
  • プロバイダーは常に偽の DeliveryReport を提供します (無効な番号でも OK レポートを取得します)
  • プロバイダは配信レポートを提供します。

問題はこれだけではありません... プロバイダー (送信元プロバイダー) が配信レポートをサポートしている場合、ほとんどの場合、同じキャリアのサブスクライバーにメッセージを送信しているときに配信レポートを取得します。ただし、このキャリア以外にメッセージを送信すると、配信レポートを受け取る場合と受け取らない場合があります。ほとんどの場合、そうしません。

これは、たとえば、さまざまな理由によって引き起こされる可能性があります。

  • 宛先プロバイダーは配信レポートをサポートしていません
  • 一部の中間 SMS ゲートウェイは配信レポートをサポートしていません
  • 宛先キャリアまたは一部の中間ゲートウェイの DeliveryReports は、発信キャリアの DeliveryReports と互換性がありません。

このような場合の配信レポートは、私の知る限り、保証された情報ではありません。

于 2014-02-12T21:19:17.680 に答える
0

配送の意図は、Return Receipt の受信に依存していると想像できます。ネットワーク プロバイダーは、プログラムを動作させるためにこれらを送信する必要があります。

これを行うには、「設定メニュー」を開き、「SMS 設定」を参照して、「領収書を返す」ボックスにチェックを入れます。

于 2013-09-05T13:00:29.247 に答える