Я видаляю SMS з папки "Вхідні", але хочу знати: як я можу видалити його до того, як він дістанеться до папки "Вхідні"?
Я видаляю SMS з папки "Вхідні", але хочу знати: як я можу видалити його до того, як він дістанеться до папки "Вхідні"?
Відповіді:
Так.
Незважаючи на деякі негативні реакції на це питання, існує законне використання для перехоплення SMS. Наприклад: автоматизація перевірки номерів телефону, послуги, які надаються через SMS (хоча це зазвичай слід робити з даними SMS), або для додатків, які в іншому випадку покращують користувацький досвід, обробляючи спеціально відформатовані повідомлення, щоб показати їх у хорошому Android -специфічний інтерфейс користувача.
Що стосується Android 1.6, вхідні SMS-повідомлення ( android.provider.Telephony.SMS_RECEIVED
) передаються у вигляді " упорядкованої трансляції " - це означає, що ви можете сказати системі, які компоненти повинні отримувати трансляцію першими.
Якщо ви визначите android:priority
атрибут під час прослуховування SMS <intent-filter>
, ви отримаєте сповіщення перед початковою програмою SMS.
У цей момент ви можете скасувати трансляцію, не даючи їй розповсюджуватися на інші програми.
Оновлення (жовтень 2013 р.): Коли Android 4.4 з'явиться, він внесе зміни в API API, які можуть вплинути на можливість програми впливати на доставку SMS.
Перегляньте це повідомлення в блозі розробників Android для отримання додаткової інформації:
http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html
1000
, тому це можливо. Фактично, Handcent використовують пріоритет 2147483647
.
"Beginning with Android 4.4—any attempt by your app to abort the SMS_RECEIVED_ACTION broadcast will be ignored so all apps interested have the chance to receive it."
.
Крок 1: Створіть свій власний транслятор, щоб отримувати смс. введіть логіку, щоб скасувати найширші, щоб повідомлення не було доступним для вашої вхідних
public class SMSReceiver extends BroadcastReceiver
{
public void onReceive(Context context, Intent intent)
{
if(conditionMatches){
abortBroadcast();
}
}
}
Крок 2 Зареєструйте приймач широкомовної програми в AndoridManifest і поставте Android: значення пріоритету велика кількість
<receiver android:name=".SMSReceiver" >
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
Це воно
Як працює вищевказаний код
Оскільки широкомовна передача SMS - це впорядкована трансляція, одержувач з високим пріоритетом отримує першим, тому ваша програма отримує першу, а після отримання - ви припиняєте трансляцію. Тож жодна інша програма не може її отримати. Отже, SMS не буде існувати у папці "Вхідні"
Наведене нижче рішення ("android: пріоритет" та abortBroadcast ()) працює до тих пір, як за замовчуванням додаток Android Messaging (я мав на увазі застосунок Android Messaging). Якщо користувач встановлює "GoSMSPro" або "HandcentSMS", ці програми все ще показують повідомлення у папці "Вхідні", я вважаю це через "android: пріоритет". Я не бачу кращого способу виправити вищевказану проблему, якщо сторонні додатки для обміну повідомленнями встановлені на телефоні.
/**
* Check priority
* @param activity
*/
public static void receiverPriority(Activity activity){
Intent smsRecvIntent = new Intent("android.provider.Telephony.SMS_RECEIVED");
List<ResolveInfo> infos = activity.getPackageManager().queryBroadcastReceivers(smsRecvIntent, 0);
for (ResolveInfo info : infos) {
System.out.println("Receiver: " + info.activityInfo.name + ", priority=" + info.priority);
}
}
Перевірте пріоритет і встановіть вищий пріоритет (у своєму маніфесті), ніж інші приймачі.
Якщо у вас є такий сценарій, і ви хочете видалити або проігнорувати повідомлення, пов’язане з цим контактним номером "+ 44xxxxx" тощо, використовуйте цей код у приймачі SMS широкомовної передачі
if(sender.equalsIgnoreCase("+44xxxxxx")
this.abortBroadCast();
Ви також повинні встановити його як високий пріоритет.