我想发送给多个接收者。 我还想使用内置的SMS机制,而不是提示所需的应用程序(Whatsapp等)
为了完成这个,我使用的是Android的SmsManager。
for循环遍历移动号码的mobileList数组,并逐个发送短信给每一个。
BroadcastReceiver为deliverActionIntent意图检索传送SMS的指示。
我正在用“Delivered”这个词和正在传递的邮件的索引号一起弹出一个祝酒词。
我的问题是:
未显示实际索引(idx)。我为所有人提供相同的索引号,即mobileList项的数量。 为什么会这样?我期望每个移动设备的索引。
mobileList项目的数量是否有限?例如,我可以有200个人吗?
我在4个手机号码的列表上对此进行了测试,但随后我获得了8-10个祝酒词。我期待一次移动递送的吐司。 这有什么问题?
如何在发送所有短信时收到通知?我想这应该是像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);
}
答案 0 :(得分:1)
1)运行for循环时,idx会发生变化。因此,每次敬酒时,您都会显示idx的当前值,即显示的消息数。由于您已将其打包在意图中,因此您只需在onReceive方法中显示文字"Delivered" + intent.getIntExtra(EXTRA_IDX, -1)
即可。
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();
}
}