我正在开发一个 android 应用程序,它几乎同时向同一个号码快速发送多条 SMS 消息(请注意,这是出于研究目的)。我需要这个应用程序来跟踪它的交付意图,我通过添加一个包含我希望该意图携带的信息的包来做到这一点。但是,我遇到的问题如下:
- 如果我不使用未决意图标志(又名 0)或 FLAG_IMMUTABLE,则捆绑包值始终与发送的第一条消息相同,并且我会得到所有已发送消息的转储。
- 如果我使用 FLAG_UPDATE_CURRENT,我会得到一个偶尔/随机更新的包值(多个意图包含相同的包值),并且我会得到所有传递的消息的转储。
- 如果我使用 FLAG_ONE_SHOT,我会得到准确的捆绑包值(应该接收到的值),但我只会得到非常少量的意图转储,即使该数量仍然很小(~1%)我碰巧连续发送了 1000 多条消息。
以下是MainActivity中负责发送 SMS 的消息发送方法部分:
int z = 0;
for(int j=1; j<=messageCnt;j++){
try {
Intent dI = new Intent("SMS_DELIVERED");
Bundle b = new Bundle();
b.putString("MSGNUM",Integer.toString(z+1));
dI.putExtras(b);
dI.putExtra("MNUMSTR",Integer.toString(z+1));
PendingIntent deliveredIntent = PendingIntent.getBroadcast(getApplicationContext(),0,dI,PendingIntent.FLAG_ONE_SHOT);
deliveredPendingIntents.add(z,deliveredIntent);
SmsManager.getDefault().sendTextMessage(phoneNum, null, message[z], null, deliveredIntent);
b.clear();
}
catch (Exception e){
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
crashTrack.add((Long.toString(System.currentTimeMillis())).concat(",").concat("'").concat(sw.toString()).concat("'\n"));
//reset all incremental value back one for proper repeat
j=j-1;
continue; //jump back to for loop and reattempt send.
}
}
然后,在我想要的任何地方(无论是在新应用程序中还是在当前应用程序中),我都输入以下内容来注册我的接收器类。
//Create Broadcast receivers for sent and delivered intents
SmsDeliveredReceiver SDR = new SmsDeliveredReceiver();
//register the receivers
registerReceiver(SDR, new IntentFilter("SMS_DELIVERED"));
最后,我的广播接收器类SmsDeliveredReciever:
public class SmsDeliveredReceiver extends BroadcastReceiver {
protected static int sentCount = 0;
@Override
public void onReceive(Context context, Intent dI){
/*File delivDumpName = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),MainActivity.dateTime.concat("DelivDump.txt"));
File delivfailDumpName = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),MainActivity.dateTime.concat("DelivFailDump.txt"));*/
Bundle bundle = dI.getExtras();
switch (getResultCode()){
case Activity.RESULT_OK:
if(bundle!=null){
String msgNum = bundle.getString("MSGNUM","0");
MainActivity.delvDump.add(Long.toString(System.currentTimeMillis()).concat(",'Msg ").concat(msgNum).concat("'\n"));
} else {
MainActivity.delvDump.add(Long.toString(System.currentTimeMillis()).concat(",'Msg ").concat("Number Unknown'\n"));//Integer.toString(sentCount)).concat("'\n"));
}
break;
case Activity.RESULT_CANCELED:
if(bundle!=null){
String msgNum = bundle.getString("MSGNUM","0");
MainActivity.delvDump.add(Long.toString(System.currentTimeMillis()).concat(",'Sms Failed to Deliver.',' Msg ").concat(msgNum).concat("'\n"));
} else {
MainActivity.delvDump.add(Long.toString(System.currentTimeMillis()).concat(",'Sms Failed to Deliver.',' Msg ").concat("Number Unknown'\n"));//Integer.toString(sentCount)).concat("'\n"));
}
break;
}
/*MainActivity.writeFiles(delivDumpName,String.valueOf(MainActivity.delvDump));
MainActivity.writeFiles(delivfailDumpName, String.valueOf(MainActivity.delvFailDump));*/
sentCount++;
}
}
请注意,SendIntent 也会发生完全相同的事情。我已经阅读了所有的 Google Android SDK 文档,到目前为止,stackoverflow 提供的答案仅适用于警报/警报而不适用于 SMS 意图,其中唯一现有的 SMS 教程和论坛条目是单发送 SMS。不,我不是要发送多部分消息。
期望的输出:
- 所有 SMS 传递意图都应在广播接收器中捕获
- 捕获的每个意图都必须通过捆绑输出其自己的唯一消息关联号。
- 捕获的意图数量应该等于成功发送的消息数量(是的,我确实有办法检查是否收到消息)
这个期望的输出是否可能,或者我对 Android 的要求太多了?接收器是否是一个单独的应用程序对我来说并不重要,尽管它是一个单独的应用程序是首选。
注意:除了准确跟踪/记录发送/传递的意图外,应用程序中的所有内容均正常运行且无错误。