我看了很多帖子和多短信,例如:如何检查成功的多部手机短信发送上发送短信
Sending SMS in Android, Sending and Receiving SMS and MMS in Android (pre Kit Kat Android 4.4), Android PendingIntent extras, not received by BroadcastReceiver
...等,但他们似乎没有进入检查该消息的所有部分已成功发送。
从我所了解的情况来看,通过多部分消息,您可以为每个消息部分添加一个PendingIntent,但我所看到的例子似乎没有检查是否所有部分均已成功发送...如果是(I猜第一个),他们似乎认为它是成功的......
所以我想我会送一个多部分消息和跟踪部分。我不会说这个消息被成功发送,直到所有部分都成功发送。
我试图做到这一点在下面的代码... SmsMessageInfo仅仅是包含电话号码,消息和布尔值用于加工零件清单和零件清单的简单类发送成功,它也有一个唯一的消息ID。
我曾尝试以下:
private void sendLongSmsMessage(Context context, final SmsMessageInfo messageInfo) {
// Receive when each part of the SMS has been sent (or does it????)
context.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String messageIdAsString = intent.getExtras().getString(INTENT_EXTRA_MESSAGE_ID_KEY);
Log.i("SMSMessageSender", "Broadcast Intent Recieved, IntentMessageID: " + messageIdAsString + " messageInfoId: " + messageInfo.messageId);
if (messageIdAsString != null) {
if (Long.parseLong(messageIdAsString) == messageInfo.messageId) {
String messagePartNrAsString = (String) intent.getExtras().get(INTENT_EXTRA_PART_NR_KEY);
int messagePartNr = Integer.parseInt(messagePartNrAsString);
Log.i("SMSMessageSender", "Broadcast Intent Recieved Multi Part Message Part No: " + messagePartNrAsString);
// We need to make all the parts succeed before we say we have succeeded.
switch (getResultCode()) {
case Activity.RESULT_OK:
messageInfo.partsSent.add(messagePartNr, true);
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
messageInfo.failMessage = "Error - Generic failure";
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
messageInfo.failMessage = "Error - No Service";
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
messageInfo.failMessage = "Error - Null PDU";
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
messageInfo.failMessage = "Error - Radio off";
break;
}
messageInfo.partsProcessed.add(messagePartNr, true);
boolean allSent = true;
for (Boolean partSent : messageInfo.partsSent) {
allSent = allSent && partSent;
}
messageInfo.sent = allSent;
boolean allProcessed = true;
for (Boolean partProcessed : messageInfo.partsProcessed) {
allProcessed = allProcessed && partProcessed;
}
if (allProcessed) {
// We have our response for all of our message parts, so we can unregister our receiver.
Log.i("SMSMessageSender", "All message part resoponses received, unregistering message Id: " + messageIdAsString);
context.unregisterReceiver(this);
}
} else {
Log.w("SMSMessageSender", "Received a broadcast message with Id for a different message");
}
} else {
Log.w("SMSMessageSender", "Received a broadcast message but not for message Id");
}
}
}, new IntentFilter(SENT));
ArrayList<String> messageList = SmsManager.getDefault().divideMessage(messageInfo.message);
ArrayList<PendingIntent> pendingIntents = new ArrayList<PendingIntent>(messageList.size());
messageInfo.partsSent.clear();
for (int i = 0; i < messageList.size(); i++) {
messageInfo.partsSent.add(i, false);
messageInfo.partsProcessed.add(i, false);
Intent sentIntent = new Intent(SENT);
sentIntent.putExtra(INTENT_EXTRA_MESSAGE_ID_KEY, Long.toString(messageInfo.messageId));
sentIntent.putExtra(INTENT_EXTRA_PART_NR_KEY, Integer.toString(i));
Log.i("SMSMessageSender", "Adding part " + i + " tp multi-part message Id: " + messageInfo.messageId);
pendingIntents.add(PendingIntent.getBroadcast(context, 0, sentIntent, PendingIntent.FLAG_ONE_SHOT));
}
Log.i("SMSMessageSender", "About to send multi-part message Id: " + messageInfo.messageId);
SmsManager.getDefault().sendMultipartTextMessage(messageInfo.phoneNumber, null, messageList, pendingIntents, null);
}
的问题,这是第二部分的消息永远不会被接受。
我觉得奇怪,不得不进入才不会去检查,他们所有的工作创建多个PendingIntents的所有麻烦。
在我展示的消息部分没有日志消息,它始终是0,我从来没有得到的第二部分,因此该代码永远不会认为它被完成。
我只是把它弄得太复杂了,我是否应该将任何旧的PendingIntent返回并假设其他情况也适用(在这种情况下,为什么Google会让您首先提供它们的列表)。
我为长的问题道歉,但真的不知道如何在更短的方式向更清楚:-)
问候 科林
感谢你的解决方案比我的简单一些。我的应用程序可能会同时发送几条消息,并且我认为intent可能会混入广播接收器,因此我将该消息标识保存在意图中。但是,调整代码getExtras返回null,除非在添加它们时设置PendingIntent标志。我还注意到,我的'临时演员'不像我预期的那样工作,因为我似乎收到了两个意图,但额外的不是我设置的意思......我想尝试在发送消息和删除复杂性。 – user2400538
如果这可以帮助(2年后),我有同样的问题,但你只需要一个PendingIntent与不同的RequestCode(在getBroadcast)。这防止覆盖已经使用但尚未接收到PendingIntent。 – AxelH