Проблема с точной регистрацией нескольких заданий по доставке SMS для Android - PullRequest
0 голосов
/ 20 февраля 2019

Я занимаюсь разработкой приложения для Android, которое быстро отправляет несколько SMS-сообщений практически одновременно на один и тот же номер (обратите внимание, это для исследовательских целей).Мне нужно, чтобы это приложение также отслеживало его намерение доставки, что я делаю, добавляя пакет, содержащий информацию, которую я хочу перенести.Однако проблема, с которой я сталкиваюсь, заключается в следующем:

  • Если я не использую флаг ожидания намерения (он же 0) или FLAG_IMMUTABLE, значение пакета всегда остается таким же, как и первое отправленное сообщение, и яполучить дамп всех доставленных сообщений.
  • Если я использую FLAG_UPDATE_CURRENT, я получаю значение пакета, которое обновляется спорадически / случайно (несколько намерений содержат одно и то же значение пакета), и я получаю дамп всех доставленных сообщений.
  • Если я использую FLAG_ONE_SHOT, я получаю точное назначенное значение пакета (значение, как оно должно быть получено), НО я получаю дамп только очень небольшого количества намерений, и это количество остается маленьким(~ 1%), даже если я случайно отправлю более 1000 сообщений.

Вот часть метода отправки сообщения, ответственного за отправку SMS-сообщений в MainActivity :

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, и пока на стеке есть ответы, которые работают только для предупреждений / сигналов тревоги, а не для целей SMS, где единственными существующими учебными пособиями и записями на форуме для SMS являются SMS-сообщения с одной отправкой. И нет, я не пытаюсь отправить сообщение из нескольких частей .

Требуемый вывод :

  1. Все намерения доставки SMS должны быть зафиксированы в приемнике вещания
  2. Каждое захваченное намерение должно выводить свой уникальный номер ассоциации сообщений через пакет.
  3. Количество захваченных намерений должно равняться количеству сообщенийуспешно отправлено (да, у меня есть способ проверить, было ли полученное сообщение получено или нет)

Возможно ли даже этот желаемый вывод или я слишком много спрашиваю из Android?Для меня не имеет значения, является ли получатель отдельным приложением или нет, хотя предпочтительнее, если это отдельное приложение.

Примечание : все в приложении функционирует и не содержит ошибок, крометочное отслеживание / регистрация отправленных / доставленных намерений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...