Android: отправка смс синхронизированным способом - PullRequest
0 голосов
/ 12 декабря 2011

Я имею в виду эту статью для отправки смс с Android.

Я попытался отправить 10 смс на 10 разных номеров с помощью цикла выполнения.например, цикл по sendSMS(phoneNo, message); Но после отправки 6 смс, sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); выдает NullPointerExeption.

К вашему сведению, я передаю ноль в deliveryPI, так как меня не волнует доставка смс.Но очень важно знать, действительно ли отправлены смс, и это можно получить, зарегистрировав широковещательный приемник.

Я зарегистрировал широковещательный приемник, но кажется, что весь процесс не синхронизирован.Мы должны отправить второе смс только после того, как мы получим статус предыдущего смс.

Я предполагаю, что замедление скорости отправки смс поможет мне удалить NullPointerExeption.И ожидание статуса будет лучшей идеей, чтобы сохранить промежуток времени между отправкой другого смс.

Короче говоря, я хотел бы сделать -> отправить одну смс -> ждать статуса -> обновить статус в дб -> отправить еще одно смс.

Ответы [ 3 ]

1 голос
/ 12 декабря 2011

Я лично не проверял код, который я публикую, но он был принят в качестве ответа для этого другого вопроса , поэтому я предполагаю, что он будет работать.

    SmsManager smsMan = new SmsManager.getDefault();
    ArrayList<String> contactList = new ArrayList();
    //add contacts to contactList with contactList.add(string)
    for (int i = 0; i <= contactList().size(); i++) {
    String SENT = contactList.get(i).toString();// you could replace this with i,
    //or something like "sms_sent_myappname" + i.toString());

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

        //---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));
smsManager.sendTextMessage(contactList.get(i).toString(), null, message, sentPI, null);
}

Вышеуказанным способом вы отправите запрос в Android на отправку каждого сообщения одно за другим.Если вы действительно хотите отправить следующее SMS после Activity.RESULT_OK, то я бы по-прежнему рекомендовал использовать подход ArrayList, но вместо цикла for вы можете получить что-то вроде:

public void onCreate(Bundle savedInstanceState) {
smsMan = new SmsManager.getDefault(); //assuming you declared SmsManager smsMan in class body.
contactList = new ArrayList(); //assuming you declared ArrayList<String> contactList in class body.
//add contacts to contactList with contactList.add(string);
}
public void sendSms(int position){
    //add contacts to contactList with contactList.add(string)
    String SENT = contactList.get(position).toString();// you could replace this with i,
    //or something like "sms_sent_myappname" + i.toString());

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

            //---when the SMS has been sent---
            registerReceiver(new BroadcastReceiver(){
                @Override
                public void onReceive(Context arg0, Intent arg1) {
                    switch (getResultCode())
                    {
                        case Activity.RESULT_OK
                        context.unregisterReceiver(this);
                        i++;
                        if (contactList.size()<i){
                            sendSms(i);
                        } else {
                            //You are done sending - Do what you want.
                        }
                        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));
    smsManager.sendTextMessage(contactList.get(position).toString(), null, message, sentPI, null);

}

Опять.Я не проверял это, но это должно работать.Дайте мне знать, если у вас есть еще вопросы или мне было что-то неясно.

0 голосов
/ 24 октября 2012

Полагаю, вы уже нашли свой ответ.Но так как вопрос все еще остается здесь ... будет ли он использовать sendMultipartTextMessage ()?Существует ограничение в 160 знаков при использовании sendTextMessage (), которая представляет собой стандартную максимальную длину одного SMS-сообщения.

0 голосов
/ 04 сентября 2012

Я оставляю свой комментарий как ответ, потому что я не могу комментировать. Джакар, ваше решение, которое вы предоставили, НЕ будет работать. Вы не отменяете регистрацию приемников вещания нигде. Ваш код выдаст ошибку.

...