0

我正在开发一个 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。不,我不是要发送多部分消息

期望的输出

  1. 所有 SMS 传递意图都应在广播接收器中捕获
  2. 捕获的每个意图都必须通过捆绑输出其自己的唯一消息关联号。
  3. 捕获的意图数量应该等于成功发送的消息数量(是的,我确实有办法检查是否收到消息)

这个期望的输出是否可能,或者我对 Android 的要求太多了?接收器是否是一个单独的应用程序对我来说并不重要,尽管它是一个单独的应用程序是首选。

注意:除了准确跟踪/记录发送/传递的意图外,应用程序中的所有内容均正常运行且无错误。

4

0 回答 0