SMSを複数の人にプログラム的に送信すると一般的なエラーが発生する

私は現在、SMSアプリケーションを開発しようとしており、ユーザーが複数の人にSMSを送信できるようにしています。

SMSは長いので、私は以下のsendMultipartTextMessageを使用する必要があります

private void sendSMS(final String phoneNumber, String message) {
    String SENT = "SMS_SENT";
    String DELIVERED = "SMS_DELIVERED";

    SmsManager sms = SmsManager.getDefault();
    ArrayList parts = sms.divideMessage(message);
    int messageCount = parts.size();

    Log.i("Message Count", "Message Count: " + messageCount);

    ArrayList deliveryIntents = new ArrayList();
    ArrayList sentIntents = new ArrayList();

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);

    for (int j = 0; j < messageCount; j++) {
        sentIntents.add(sentPI);
        deliveryIntents.add(deliveredPI);
    }

   //---when the SMS has been sent---
    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode()) {
            case Activity.RESULT_OK:
                Toast.makeText(getBaseContext(), "SMS sent",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                Toast.makeText(getBaseContext(), "Generic failure",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                Toast.makeText(getBaseContext(), "No service",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NULL_PDU:
                Toast.makeText(getBaseContext(), "Null PDU",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                Toast.makeText(getBaseContext(), "Radio off",
                        Toast.LENGTH_SHORT).show();
                break;
            }
        }
    }, new IntentFilter(SENT));

   //---when the SMS has been delivered---
    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode()) {

            case Activity.RESULT_OK:
                Toast.makeText(getBaseContext(), "SMS delivered",
                        Toast.LENGTH_SHORT).show();
                break;
            case Activity.RESULT_CANCELED:
                Toast.makeText(getBaseContext(), "SMS not delivered",
                        Toast.LENGTH_SHORT).show();
                break;
            }
        }
    }, new IntentFilter(DELIVERED));

    sms.sendMultipartTextMessage(phoneNumber, null, parts, sentIntents, deliveryIntents);
}

このようなループで複数の人に送信しようとすると、一般的なエラーが発生し、メッセージは送信されません。私はそれがおそらくメッセージが3〜4部であり、アンドロイドシステムが3000ミリ秒の遅延でも時間内にメッセージを送ることができないからだと思っています。

    for (int t = 0; t < array.length; t++) {
        System.out.println("temp: " + array[t].toString());
        try {
            sendSMS(array[t].toString(), message);
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

編集:上記のコードは、サービス内で実行されるAsyncTaskにあります。

7
nl ru de
あなたのlogcatを表示する
追加された 著者 Usman Kurd,
エミュレータまたはデバイスでこのエラーが発生しましたか?
追加された 著者 Shashank Kadne,
logcatエラーはありません.2つの連絡先に送信しようとすると、 SmsManager.RESULT_ERROR_GENERIC_FAILURE のGeneric Errorが2回表示されます。
追加された 著者 dythe,
いいえ、Samsung Galaxy Note 4.1.2 Jellybeanで動く
追加された 著者 dythe,

2 答え

IHMOあなたは正しいアプローチを使用していません。私は別のものを使用しており、それは働いています。私は説明しようとする:

送信しているSMSに2つの部分がある場合は、2つのRESULT_OK(またはRESULT_ERROR_ *)を受信し、次のSMSの送信を続ける必要があるすべての部分の結果を受け取った場合にのみ、保留中のすべてのインテントのカウンタを保持する必要があります。私はスレッドをブロックするアイデアが好きではありません。おそらくこれがあなたが奇妙なエラーを起こす理由です。

私はあなたのコードを私のアプローチでリファクタリングしました:

private int mMessageSentParts;
private int mMessageSentTotalParts;
private int mMessageSentCount;

private void startSendMessages(){

    registerBroadCastReceivers();

    mMessageSentCount = 0;
    sendSMS(array[mMessageSentCount].toString(), message);
}

private void sendNextMessage(){
    if(thereAreSmsToSend()){
        sendSMS(array[mMessageSentCount].toString(), message);
    }else{
        Toast.makeText(getBaseContext(), "All SMS have been sent",
                        Toast.LENGTH_SHORT).show();
    }
}

private boolean thereAreSmsToSend(){
    return mMessageSentCount < array.length;
}

private void sendSMS(final String phoneNumber, String message) {
    String SENT = "SMS_SENT";
    String DELIVERED = "SMS_DELIVERED";

    SmsManager sms = SmsManager.getDefault();
    ArrayList parts = sms.divideMessage(message);
    mMessageSentTotalParts = parts.size();

    Log.i("Message Count", "Message Count: " + mMessageSentTotalParts);

    ArrayList deliveryIntents = new ArrayList();
    ArrayList sentIntents = new ArrayList();

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);

    for (int j = 0; j < mMessageSentTotalParts; j++) {
        sentIntents.add(sentPI);
        deliveryIntents.add(deliveredPI);
    }

    mMessageSentParts = 0;
    sms.sendMultipartTextMessage(phoneNumber, null, parts, sentIntents, deliveryIntents);
}

private void registerBroadCastReceivers(){

    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode()) {
            case Activity.RESULT_OK:

                mMessageSentParts++;
                if ( mMessageSentParts == mMessageSentTotalParts ) {
                    mMessageSentCount++;
                    sendNextMessage();
                }

                Toast.makeText(getBaseContext(), "SMS sent",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                Toast.makeText(getBaseContext(), "Generic failure",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                Toast.makeText(getBaseContext(), "No service",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NULL_PDU:
                Toast.makeText(getBaseContext(), "Null PDU",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                Toast.makeText(getBaseContext(), "Radio off",
                        Toast.LENGTH_SHORT).show();
                break;
            }
        }
    }, new IntentFilter(SENT));

    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode()) {

            case Activity.RESULT_OK:
                Toast.makeText(getBaseContext(), "SMS delivered",
                        Toast.LENGTH_SHORT).show();
                break;
            case Activity.RESULT_CANCELED:
                Toast.makeText(getBaseContext(), "SMS not delivered",
                        Toast.LENGTH_SHORT).show();
                break;
            }
        }
    }, new IntentFilter(DELIVERED));

}
20
追加された
それはある時点で1つの受信者にメッセージを送信します。私はあなたの配列の各位置が単一の電話番号であると仮定しました。
追加された 著者 rciovati,
配列[mMessageSentCount] .toString()でなければなりません。
追加された 著者 rciovati,
ありがとう。これは、私のアプリがさまざまなデバイスの乱数で停止するので、多数のSMSメッセージを送信したいときに役立ちます。今すぐすべてのメッセージが送信されます。
追加された 著者 gbotha,
あなたのアプローチは単一のユーザーにメッセージを送信するだけですか?なぜなら私の場合、 array [t] .toString()は文字列配列で、約1から3までの数の配列です。
追加された 著者 dythe,
それを解決するために管理され、正解とマークする。
追加された 著者 dythe,
ちょうど私が送信している受信機の電話番号を検出する方法があるかどうか尋ねたいですか?
追加された 著者 dythe,

I have come same error "Generic failure" occured using this code. But i used array[mMessageSentCount].toString().trim(). Then its solved my problem & its working fine. Thanks

2
追加された