试图识别短信发送确认
Trying to ID the SMS delivery confirmation
我目前正在尝试获取每条已发送短信的确认信息。我需要确保我的短信已发送,所以我使用 BroadCastReceived
来获取信息:
Intent sentIntent = new Intent(SMS_SEND);
sentIntent.putExtra("key", idSms);
PendingIntent sentPI = PendingIntent.getBroadcast(getApplicationContext(), 0, sentIntent, PendingIntent.FLAG_UPDATE_CURRENT);
SmsManager manager = SmsManager.getDefault();
try{
manager.sendTextMessage(exp, null, sms, sentPI, null);
put("sending " + sms); //Just a method to print in a textview use has a console
} catch (IllegalArgumentException e){
put("Exception " + e.getMessage());
}
并像这样使用广播接收器
public void onReceive(Context context, Intent intent){
String idsms = intent.getExtras().getString("key");
switch (getResultCode()) {
case Activity.RESULT_OK:
put("ACK : #" + idsms);
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
case SmsManager.RESULT_ERROR_RADIO_OFF:
case SmsManager.RESULT_ERROR_NULL_PDU:
case SmsManager.RESULT_ERROR_NO_SERVICE:
put("BOOM " + getResultCode() + "\n\tfrom sms #" + idsms);
break;
}
}
在我尝试同时发送多条消息之前,这项工作就像一个魅力,额外的接收总是来自最后发送的短信,所以我无法识别发送了哪些文本,哪些没有发送。
这里有一个简单的例子说明会发生什么。
当我循环发送3条短信时:
id : 1, message : SMS 1
id : 2, message : SMS 2
id : 3, message : SMS 3
收到的会得到:
ACK : #3
ACK : #3
ACK : #3
我知道这来自 PendingIntent.FLAG_UPDATE_CURRENT 但我找不到解决方案。任何人都可以向我解释我应该如何使用 PendingIntent.getBroadcast(..) 来管理这个或者至少让我走上正轨。
你的问题是由于 PendingIntent
s 可以被系统重用,如果请求的某些事情没有不同的话。在您的代码中,您正在传递 FLAG_UPDATE_CURRENT
,这导致每次请求 PendingIntent
时都会更新存储的 Intent
及其附加内容。这就是为什么您会收到每条消息的 id : 3
。要更正此问题,您可以每次使用唯一的请求代码(第二个参数)调用 getBroadcast()
,这将为每个请求创建一个新的 PendingIntent
,每个请求都有一个单独的 Intent
自己的演员。
对于您的情况,修复应该很简单,假设 idSms
对于每条消息都是唯一的。
PendingIntent sentPI = PendingIntent.getBroadcast(getApplicationContext(),
Integer.parseInt(idSms),
sentIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
我目前正在尝试获取每条已发送短信的确认信息。我需要确保我的短信已发送,所以我使用 BroadCastReceived
来获取信息:
Intent sentIntent = new Intent(SMS_SEND);
sentIntent.putExtra("key", idSms);
PendingIntent sentPI = PendingIntent.getBroadcast(getApplicationContext(), 0, sentIntent, PendingIntent.FLAG_UPDATE_CURRENT);
SmsManager manager = SmsManager.getDefault();
try{
manager.sendTextMessage(exp, null, sms, sentPI, null);
put("sending " + sms); //Just a method to print in a textview use has a console
} catch (IllegalArgumentException e){
put("Exception " + e.getMessage());
}
并像这样使用广播接收器
public void onReceive(Context context, Intent intent){
String idsms = intent.getExtras().getString("key");
switch (getResultCode()) {
case Activity.RESULT_OK:
put("ACK : #" + idsms);
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
case SmsManager.RESULT_ERROR_RADIO_OFF:
case SmsManager.RESULT_ERROR_NULL_PDU:
case SmsManager.RESULT_ERROR_NO_SERVICE:
put("BOOM " + getResultCode() + "\n\tfrom sms #" + idsms);
break;
}
}
在我尝试同时发送多条消息之前,这项工作就像一个魅力,额外的接收总是来自最后发送的短信,所以我无法识别发送了哪些文本,哪些没有发送。
这里有一个简单的例子说明会发生什么。
当我循环发送3条短信时:
id : 1, message : SMS 1
id : 2, message : SMS 2
id : 3, message : SMS 3
收到的会得到:
ACK : #3
ACK : #3
ACK : #3
我知道这来自 PendingIntent.FLAG_UPDATE_CURRENT 但我找不到解决方案。任何人都可以向我解释我应该如何使用 PendingIntent.getBroadcast(..) 来管理这个或者至少让我走上正轨。
你的问题是由于 PendingIntent
s 可以被系统重用,如果请求的某些事情没有不同的话。在您的代码中,您正在传递 FLAG_UPDATE_CURRENT
,这导致每次请求 PendingIntent
时都会更新存储的 Intent
及其附加内容。这就是为什么您会收到每条消息的 id : 3
。要更正此问题,您可以每次使用唯一的请求代码(第二个参数)调用 getBroadcast()
,这将为每个请求创建一个新的 PendingIntent
,每个请求都有一个单独的 Intent
自己的演员。
对于您的情况,修复应该很简单,假设 idSms
对于每条消息都是唯一的。
PendingIntent sentPI = PendingIntent.getBroadcast(getApplicationContext(),
Integer.parseInt(idSms),
sentIntent,
PendingIntent.FLAG_UPDATE_CURRENT);