Я занимаюсь разработкой приложения для 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-сообщения с одной отправкой. И нет, я не пытаюсь отправить сообщение из нескольких частей .
Требуемый вывод :
- Все намерения доставки SMS должны быть зафиксированы в приемнике вещания
- Каждое захваченное намерение должно выводить свой уникальный номер ассоциации сообщений через пакет.
- Количество захваченных намерений должно равняться количеству сообщенийуспешно отправлено (да, у меня есть способ проверить, было ли полученное сообщение получено или нет)
Возможно ли даже этот желаемый вывод или я слишком много спрашиваю из Android?Для меня не имеет значения, является ли получатель отдельным приложением или нет, хотя предпочтительнее, если это отдельное приложение.
Примечание : все в приложении функционирует и не содержит ошибок, крометочное отслеживание / регистрация отправленных / доставленных намерений.