Intereting Posts
Как увеличить масштаб MapView, поэтому он всегда включает в себя два геоинтеграции? Как указать порядок сортировки для детей в расширяемом списке? TabLayout выбранный уровень гравитации Как мне перейти на бесплатное бесплатное приложение на Android-рынке? Увеличение холста частично Подтверждение и удаление в RecyclerView Получение веб-шрифтов для работы с телефоном и андроидом – как? Android Instrumentaion: как мне вернуться к ранее запущенной деятельности? Использование Android AccountManager для получения authtoken для gdata Android. Получение размера изображения из его идентификатора ресурса Настройка тестовой папки для модульного тестирования в студии Android Как передать значение параметру enum flag в сервисе Soap (услуга ASMX) Из приложения Android Android, Gradle. Как создать приложение и запустить тесты из тестового приложения «Android» отсутствует в моих настройках «Eclipse Juno 4.1» Панель состояния Android и панель действий

Отправка 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<String> parts = sms.divideMessage(message); int messageCount = parts.size(); Log.i("Message Count", "Message Count: " + messageCount); ArrayList<PendingIntent> deliveryIntents = new ArrayList<PendingIntent>(); ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>(); 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(); } } 

EDIT: вышеуказанный код находится в AsyncTask, который выполняется внутри Сервиса.

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

Вы должны держать счетчик для всех ожидающих намерений, потому что, если смс, который вы отправляете, имеет две части, вы получите два RESULT_OK (или RESULT_ERROR_ *), и только когда вы получите результаты для всех частей, вы должны продолжить отправку следующих смс. Мне не нравится идея блокировки потока … возможно, именно по этой причине вы получаете странные ошибки.

Я реорганизовал ваш код с помощью моего подхода:

 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<String> parts = sms.divideMessage(message); mMessageSentTotalParts = parts.size(); Log.i("Message Count", "Message Count: " + mMessageSentTotalParts); ArrayList<PendingIntent> deliveryIntents = new ArrayList<PendingIntent>(); ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>(); 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)); } 

Я пришел с той же ошибкой, что и «Общий сбой», используя этот код. Но я использовал массив [mMessageSentCount] .toString (). Trim () . Тогда его решена моя проблема и ее работоспособность. благодаря