Можем ли мы удалить SMS в Android до того, как оно попадет во входящие?


100

Я удаляю SMS из почтового ящика, но хочу знать: как я могу удалить его до того, как оно попадет в почтовый ящик?


2
Действительно ли j2ee здесь соответствует тегу?
jitter

1
Почему Java неверна, если вы не программируете на Java на Android?
jitter

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 SMS, которые могут повлиять на способность приложения влиять на доставку 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
Это сработало для меня :) Сначала мое приложение перехватило сообщение, а уведомления нет, но затем смс не попадает в почтовый ящик сообщений. Вроде так и не получил, только в моем приложении. Есть ли способ использовать прерывание трансляции, но получать сообщения во входящие?
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: priority большое число.

<receiver android:name=".SMSReceiver" >
            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

Это оно

Как работает приведенный выше код

Поскольку широковещательная рассылка SMS - это заказная рассылка, получатель с высоким приоритетом получит ее первым, поэтому ваше приложение получит первое, а после получения вы прерываете рассылку. Так что никакое другое приложение не может его получить. Следовательно, смс не будет во входящих


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

9

Приведенное ниже решение («android: priority» и abortBroadcast ()) работает до тех пор, пока приложение Android Messaging по умолчанию (я имел в виду стандартное приложение Android Messaging). Если пользователь устанавливает «GoSMSPro» или «HandcentSMS», эти приложения по-прежнему показывают сообщения в папке «Входящие», я полагаю, это из-за «android: priority». Я не вижу лучшего способа решить указанную выше проблему, если на телефоне установлены сторонние приложения для обмена сообщениями.


2
Хорошая точка зрения. Но это должен быть комментарий, а не ответ. Можно ли его переместить? --- а что, если поставить очень большое значение? Как android: priority = "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 Broadcast.

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

Вы также должны установить ему высокий приоритет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.