Android: отправьте SMS нескольким получателям и получите подтверждение
Я хочу отправить нескольким получателям. Я также хочу использовать встроенный механизм SMS без запроса требуемого приложения (WhatsApp и т. Д.)
Для этого я использую SmsManager для Android.
Цикл for просматривает массив номеров мобильных телефонов и отправляет SMS-сообщения каждому из них, один за другим.
Указание на доставленное SMS извлекается BroadcastReceiver для намерения доставленного действия.
Я выскакиваю тост со словом "Доставлено" и порядковым номером доставляемого сообщения.
Мои вопросы:
Фактический индекс (idx) не отображается. Я получаю для всех тостов один и тот же индекс, который является количеством элементов mobileList. Почему это происходит? Я ожидал, что индекс для каждого мобильного телефона сам по себе.
Количество элементов mobileList ограничено? Могу ли я иметь 200 человек, например?
Я проверил это в списке из 4 мобильных номеров, но затем я получил 8-10 тостов. Я ожидал один тост за одну мобильную доставку. Что здесь не так?
Как я могу получить уведомление, когда все SMS доставлены? Я думаю, что это должно быть фоновое действие, как AsyncTask. Может кто-нибудь показать мне, как это сделать?
Код SmsManager показан ниже.
SmsManager smsManager = SmsManager.getDefault();
for(idx = 0; idx < mobileList.length; idx++) {
String toNumber = mobileList[idx];
String sms = message;
// SMS sent pending intent
Intent sentActionIntent = new Intent(SENT_ACTION);
sentActionIntent.putExtra(EXTRA_IDX, idx);
sentActionIntent.putExtra(EXTRA_TONUMBER, toNumber);
sentActionIntent.putExtra(EXTRA_SMS, sms);
PendingIntent sentPendingIntent = PendingIntent.getBroadcast(this, 0, sentActionIntent, PendingIntent.FLAG_UPDATE_CURRENT);
/* Register for SMS send action */
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String result = "";
switch (getResultCode()) {
case Activity.RESULT_OK:
result = "Transmission successful";
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
result = "Transmission failed";
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
result = "Radio off";
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
result = "No PDU defined";
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
result = "No service";
break;
}
// Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
}
}, new IntentFilter(SENT_ACTION));
// SMS delivered pending intent
Intent deliveredActionIntent = new Intent(DELIVERED_ACTION);
deliveredActionIntent.putExtra(EXTRA_IDX, idx);
deliveredActionIntent.putExtra(EXTRA_TONUMBER, toNumber);
deliveredActionIntent.putExtra(EXTRA_SMS, sms);
PendingIntent deliveredPendingIntent = PendingIntent.getBroadcast(this, 0, deliveredActionIntent, PendingIntent.FLAG_UPDATE_CURRENT);
/* Register for Delivery event */
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(getApplicationContext(), "Deliverd " + Integer.toString(idx), Toast.LENGTH_SHORT).show();
}
}, new IntentFilter(DELIVERED_ACTION));
//send
smsManager.sendTextMessage(toNumber, null, sms, sentPendingIntent, deliveredPendingIntent);
}
1 ответ
1) idx меняется при прохождении цикла for. Таким образом, каждый раз, когда вы произносите тост, вы показываете текущее значение для idx, которое является количеством отображаемых сообщений. Поскольку вы собрали его в своем намерении, вы можете просто показать текст "Delivered" + intent.getIntExtra(EXTRA_IDX, -1)
в вашем методе onReceive.
2) Я не уверен, что вы спрашиваете.
3) Я не уверен, что не в порядке, и в настоящее время не могу отладить.
4) Вам нужно будет отслеживать, какие индексы вы получили. HashSet<Integer>
должен сделать свое дело.
Над циклом for добавьте следующее:
final HashSet<Integer> undelivered = new HashSet<Integer>();
В цикле for добавьте это:
undelivered.add(idx);
Чтобы ответить на ваши вопросы сразу по 1, 3 и 4, измените onReceived
тело к этому:
// Get the index from the intent
int idx = intent.getIntExtra(EXTRA_IDX, -1);
if (undelivered.contains(idx)) {
// This index is now delivered. We remove it from the undelivered set, and Toast that it was delivered.
undelivered.remove(idx);
Toast.makeText(getApplicationContext(), "Delivered " + idx, Toast.LENGTH_SHORT).show();
if (undelivered.isEmpty() {
// We've delivered all of the messages ...
Toast.makeText(getApplicationContext(), "All messages were delivered.", Toast.LENGTH_SHORT).show();
}
}