Чи можемо ми видалити SMS в Android, перш ніж воно надійде до вхідних?


100

Я видаляю SMS з папки "Вхідні", але хочу знати: як я можу видалити його до того, як він дістанеться до папки "Вхідні"?


2
Чи справді j2ee відповідає тегу?
тремтіння

1
Чому java була б невірною, якщо ви не програмуєте java на Android?
тремтіння

3
Це пахне злом. Ти не повинен цього робити.
MattC

43
Є законне використання! Наприклад, якщо ви хочете щось зробити (надіслати місце розташування GPS, стерти чи що-небудь) на своєму телефоні через SMS у випадку, якщо воно вкрадено; ви не хочете, щоб той, хто вкрав телефон, бачив це SMS-повідомлення.
поліглот

21
Давай люди! Це однозначно НЕ "зло". @polyglot має рацію! Я роблю заявку на підтвердження номера користувача (як це робить Viber) і мені це потрібно. Все можна використовувати як «зло». Не встановлюйте злі програми, тільки це.
Феліпе

Відповіді:


187

Так.

Незважаючи на деякі негативні реакції на це питання, існує законне використання для перехоплення 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


13
Святий бог. Це правда! Я завжди вважав, що це буде навпаки! Для доказу дивіться тут . Ого. Бажаю, я міг би дати вам більше одного внеску;)
Хемі

1
@kakopappa: Так, як зазначено у відповіді, він працює від Android 1.6+.
Крістофер Орр

1
@herom У мене є додатки, які використовують пріоритет 1000, тому це можливо. Фактично, Handcent використовують пріоритет 2147483647.
Крістофер Орр

2
Це працювало для мене :) Моє повідомлення про вилучення спочатку, і повідомлення не надходить, але потім SMS не потрапляє у папку "Повідомлення". Наче його ніколи не отримували, лише в моєму додатку. Чи є спосіб використання перервати аборт, але отримувати повідомлення у папці "Вхідні"?
pandabear

7
Важливо пам’ятати про новий рівень API 19, як говорить @ChristopherOrr у своєму оновленні. Там написано "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.".
GoRoS

11

Крок 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 не буде існувати у папці "Вхідні"


чи може ми мати приймач широкомовної передачі, коли користувач натискає папку "Вхідні повідомлення", щоб я міг розробити заблокований екран ..
Вамсі Паван Махеш

9

Наведене нижче рішення ("android: пріоритет" та abortBroadcast ()) працює до тих пір, як за замовчуванням додаток Android Messaging (я мав на увазі застосунок Android Messaging). Якщо користувач встановлює "GoSMSPro" або "HandcentSMS", ці програми все ще показують повідомлення у папці "Вхідні", я вважаю це через "android: пріоритет". Я не бачу кращого способу виправити вищевказану проблему, якщо сторонні додатки для обміну повідомленнями встановлені на телефоні.


2
Гарна думка. Але це має бути коментар, а не відповідь. Чи можливо його перемістити? --- а що робити, якщо ви ставите дуже високе значення? Як андроїд: пріоритет = "9999"? наприклад? Ви пробували це?
Феліпе

4
@FelipeMicaroniLalli насправді GO SMS PRO тощо ... використовуйте 2147483647 за своїм пріоритетом
rf43

1
@DDoSAttack 2147483647 - це максимум?
Феліпе

3
Це найбільше без підпису ціле число en.wikipedia.org/wiki/Integer_(computer_science), максимум, який підтримує Android, становить 999. developer.android.com/reference/android/content/…
rf43

2
@NomanHamid Це правильно. 999 - максимальний пріоритет. Ви можете використовувати будь-який номер, який ви вибрали, хоча Android гарантує лише до 999. Все, що є більшим за це, може бути або не бути нестабільним і мати непередбачувані наслідки. Особисто мені довелося скористатися 2147483647, щоб спробувати перейти на такі програми, як GO SMS PRO. Іноді це працювало для користувачів, а іноді - ні.
rf43

1
/**
 * 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);
    }
}

Перевірте пріоритет і встановіть вищий пріоритет (у своєму маніфесті), ніж інші приймачі.


0

Якщо у вас є такий сценарій, і ви хочете видалити або проігнорувати повідомлення, пов’язане з цим контактним номером "+ 44xxxxx" тощо, використовуйте цей код у приймачі SMS широкомовної передачі

 if(sender.equalsIgnoreCase("+44xxxxxx")
   this.abortBroadCast();

Ви також повинні встановити його як високий пріоритет.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.