Android - измените текст SMS перед тем, как попасть в папку «Входящие»

В настоящее время я пытаюсь изменить входящее SMS, прежде чем оно будет сохранено в папке «Входящие». Поскольку система Android 4.4.4, простой перехват с помощью высокоприоритетного широковещательного приемника невозможен. Это также причина, по которой я модифицирую Android Source (AOSP), а не создаю приложение.

Пока мне удалось выделить многообещающий класс: InboundSmsHandler. Внутри внутреннего класса SmsBroadcastReceiver метод onReceive запускается, когда приходит SMS, а затем отправляет намерение «SMS_RECEIVED». Так что в целом этот метод кажется удачным.

Проблема в том, что я не могу изменить SMS, которое доставляется с намерением onReceive. Я уже пробовал изменить его с помощью PDU:

byte[] pdu = createFakePDU("15555215556", "modified body");
intent.putExtra("pdus", new Object[] { pdu });
intent.putExtra("format", "3gpp");

(Этот подход не сработал, приложение SMS показало исходное сообщение)

Попытка изменить тело сообщения SmsMessage напрямую: (я добавил в SmsMessage метод, чтобы иметь возможность изменять тело сообщения)

SmsMessage[] msgs = Intents.getMessagesFromIntent(intent);
int pduCount = msgs.length;
for(int i=0; i<pduCount; i++)
{
    msgs[i].modifyBody("test");
}

(Этот подход не сработал, приложение SMS показало исходное сообщение)

И наконец добавили новое смс в базу:

....
contentResolver.insert( Uri.parse( SMS_URI ), values );

....

(Проблема с этим подходом заключается в том, что исходное SMS-сообщение все еще приходит, и поэтому приходит не только одно измененное SMS-сообщение, но и одно исходное SMS-сообщение, а также одно измененное. Исходное SMS-сообщение необходимо удалить, но я не знаю, как это сделать.)

Кто-нибудь знает, как я могу изменить SMS до того, как оно придет во входящие?

С уважением, мята


person stackmint54    schedule 07.01.2015    source источник


Ответы (2)


AFAIK, в 4.4.4 нет ничего, что могло бы помешать вашему приложению получать SMS, зарегистрировав BroadcastReceiver, установив правильные разрешения и правильный фильтр намерений. Это:

<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />

и

<action android:name="android.provider.Telephony.SMS_RECEIVED" />

(если я правильно их помню)

Затем внутри вашего BroadcastReceiver вы вызываете abortBroadcast (), при необходимости изменяете SMS и, наконец, сохраняете его вручную с помощью

getContentResolver().insert(Uri.parse("content://sms/sent"), values);
person motoDrizzt    schedule 07.01.2015
comment
Спасибо за ответ, но я не это ищу. В первом посте я написал, что модифицирую систему Android и не разрабатываю приложения. - person stackmint54; 07.01.2015
comment
Вы написали простой перехват с высокоприоритетным широковещательным приемником невозможен. Это также причина, по которой я модифицирую Android Source (AOSP), а не создаю приложение. и я тоже не видел, извините. Однако ... вероятно, то же самое применимо в любом случае: прервите исходную трансляцию, создайте новое намерение и транслируйте его. В противном случае вы, вероятно, пытаетесь изменить свою локальную копию намерения, а не намерения, которое система Android хранит для доставки каждому подписанному получателю. - person motoDrizzt; 07.01.2015
comment
@motoDrizzt Начиная с KitKat, трансляцию SMS_RECEIVED нельзя прервать. - person Mike M.; 07.01.2015
comment
@ stackmint54 Есть ли какая-то особая причина, по которой вы так подходите к этому? Я имею в виду, что для вашей ситуации было бы приемлемо вместо этого удалить входящее SMS и написать измененное сообщение после его получения? - person Mike M.; 07.01.2015
comment
Да, это было бы приемлемо. Но я не знаю, как этого добиться. - person stackmint54; 07.01.2015
comment
Что ж, этот вопрос действительно интересен, поэтому я провожу немного времени, читая AOSP и пытаясь понять решение :) @ stackmint54: InboundSmsHandler кажется правильным классом, но вы смотрите на то, что мне кажется неправильным. Это. Это конечный автомат, onReceive - последний шаг, который вызывается, когда pdus сохранен в db и доставка всем другим получателям уже выполнена, чтобы проверить наличие проблем и очистить необработанный db. Вы должны перехватить pdus ДО того, как они будут записаны в db, поэтому вам, вероятно, потребуется изменить метод addTrackerToRawTable. Я надеялся, что - person motoDrizzt; 07.01.2015
comment
P.S. однако будьте очень осторожны. Необработанная база данных очищается после того, как каждое SMS-сообщение было доставлено каждому получателю, с помощью запроса, хранящегося в экземплярах InboundSmsTracker: если вам удастся каким-то образом изменить их, необработанная база данных не может быть идеально очищена в конце и рано или поздно взорвется. - person motoDrizzt; 07.01.2015

Спасибо за все ответы, я нашел место в InboundSmsHandler, где можно изменить PDU перед отправкой широковещательной передачи: метод proccessMessagePart. Перед командой "intent.putExtra (" pdus ", pdus);" выполняется, массив pdus и, следовательно, тело сообщения могут быть изменены.

person stackmint54    schedule 13.01.2015
comment
Не могли бы вы поделиться кодом, пожалуйста? Я пытаюсь сделать то же самое и пока не могу. Любая помощь будет оценена по достоинству - gagan - person Gagan; 06.04.2018