Отправка 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
добавлено отредактировано
Просмотры: 1
de
покажите свой logcat
добавлено автор Usman Kurd, источник
Вы получили эту ошибку в эмуляторе или устройстве?
добавлено автор Shashank Kadne, источник
There' s никакая logcat ошибка, это просто покажет Тост для SmsManager. RESULT_ERROR_GENERIC_FAILURE высказывание Универсальной Ошибки дважды, когда я пытаюсь послать его в 2 контакта.
добавлено автор dythe, источник
Нет, Samsung Galaxy Note, работающий на 4.1.2 Мармеладе-горошке
добавлено автор dythe, источник

2 ответы

IHMO вы не используете правильный подход. Я использую различный, и он работает. Я пытаюсь объяснить:

Необходимо держать прилавок для всех надвигающихся намерений, потому что, если SMS вы посылаете, имеет две части, вы получите два 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
добавлено
Это посылает сообщение одному получателю во время. Я предположил, что каждое положение вашего множества - единственный номер телефона.
добавлено автор rciovati, источник
Это должен быть [mMessageSentCount].toString множества ()
добавлено автор rciovati, источник
Спасибо. Это оказалось полезным, желая послать большое количество сообщений SMS, поскольку мое приложение просто остановит наугад числа на различных устройствах. Теперь все сообщения посылают.
добавлено автор gbotha, источник
Ваш подход просто посылает сообщение отдельному пользователю? Поскольку в моем случае [t].toString множества() строковый массив числа приблизительно 2 - 3 человек вместо всего 1.
добавлено автор dythe, источник
Управляемый, чтобы решить его, отмечая как правильный ответ.
добавлено автор dythe, источник
Просто хочу спросить ли there' s какой-либо способ обнаружить номер телефона в приемнике, в который я посылаю?
добавлено автор 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
добавлено