Как предотвратить отправку SMS в папку "Входящие" на Android?

Я разрабатываю бизнес-приложение для SMS. В этом приложении, если входящее сообщение от определенного номера, скажем, 999999999, оно должно перейти в папку входящих приложений, а не в встроенный почтовый ящик по умолчанию. Все остальные сообщения должны поступать в основной почтовый ящик телефона. Как это сделать?

Ответы

Ответ 1

Когда SMS получен системой Android, он передает упорядоченную передачу Intent с действием "android.provider.Telephony.SMS_RECEIVED". Все зарегистрированные ресиверы, включая приложение SMS по умолчанию для системы, получают этот Intent в порядке priority, который был установлен в их intent-filter. Порядок для широковещательных приемников с одинаковым приоритетом не указан. Любой BroadcastReceiver может помешать любым другим зарегистрированным вещательным приемникам принимать широковещательную передачу с использованием abortBroadcast().

Итак, все, что вам нужно, это широковещательный приемник:

public class SmsFilter extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
            Bundle extras = intent.getExtras();
            if (extras != null) {
                Object[] pdus = (Object[])extras.get("pdus");

                if (pdus.length < 1) return; // Invalid SMS. Not sure that it possible.

                StringBuilder sb = new StringBuilder();
                String sender = null;
                for (int i = 0; i < pdus.length; i++) {
                    SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[i]);
                    if (sender == null) sender = message.getOriginatingAddress();
                    String text = message.getMessageBody();
                    if (text != null) sb.append(text);
                }
                if (sender != null && sender.equals("999999999")) {
                    // Process our sms...
                    abortBroadcast();
                }
                return;
            }
        }

        // ...
    }
}

Похоже, что приложение для обработки SMS по умолчанию использует приоритет 0, поэтому вы можете попробовать 1, чтобы ваше приложение было перед ним. Добавьте эти строки в свой AndroidManifest.xml:

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

Не забывайте о необходимых разрешениях:

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

Кстати, вы можете найти всех зарегистрированных получателей и их приоритеты, используя этот код:

Intent smsRecvIntent = new Intent("android.provider.Telephony.SMS_RECEIVED");
List<ResolveInfo> infos = context.getPackageManager().queryBroadcastReceivers(smsRecvIntent, 0);
for (ResolveInfo info : infos) {
    System.out.println("Receiver: " + info.activityInfo.name + ", priority=" + info.priority);
}

Обновление: Как сказано в FantasticJamieBurn , начиная с Android 4.4 единственным приложением, которое может перехватывать SMS (и блокировать, если хотите), является приложение SMS по умолчанию (выбрано пользователем). Все остальные приложения могут слушать только входящие SMS, если приложение SMS по умолчанию не заблокировало его.

См. также Поставщик SMS в API Android 4.4.

Ответ 2

С выпуском Android 4.4 KitKat (API уровня 19) отключена возможность блокировки SMS-сообщения и предотвращения его доставки в SMS-сообщение по умолчанию. Приложение, не использующее по умолчанию, может наблюдать SMS-сообщения по мере их получения, но любая попытка прервать трансляцию будет игнорироваться Android 4.4+.

Если у вас есть существующее приложение, которое полагается на прерывание передач SMS-сообщений, вы можете подумать о том, какое влияние это изменение будет иметь при обновлении ваших пользователей до Android 4.4 +.

http://android-developers.blogspot.co.uk/2013/10/getting-your-sms-apps-ready-for-kitkat.html

Ответ 3

Да, это может быть DOne

public void onReceive(Context context, Intent intent)
{
    Bundle bundle=intent.getExtras();
    Object[] messages=(Object[])bundle.get("pdus");
    SmsMessage[] sms=new SmsMessage[messages.length];

    Toast.makeText(context, "Hello", 1).show();

    for(int n=0;n<messages.length;n++){
        sms[n]=SmsMessage.createFromPdu((byte[]) messages[n]);
    }

    for(SmsMessage msg:sms){
        if(msg.getOriginatingAddress().endsWith(number))
        {
        SMS.updateMessageBox("\nFrom: "+msg.getOriginatingAddress()+"\n"+
                "Message: "+msg.getMessageBody()+"\n");
            /*((SMS) context).delete();*/
        abortBroadcast();
        }
    }
}

просто используйте abortbroadcast() после получения в приложении

Ответ 4

Вы отправляете сообщения? Если это так, используйте вместо них данные, поскольку они не будут отображаться в папке "Входящие".

Проверьте этот вопрос для получения дополнительной информации о том, как его использовать.

Ответ 5

Проверьте, что номер отправителя равен номеру мобильного телефона, отправляющего sms.

замените следующую строку кода г-на "преторианский дроид"

if (sender != null && sender.equals("999999999")) {

к

if (sender != null && sender.equals("YOUR SMS SENDING MOBILE NUMBER HERE")) {

далее вы можете дать пользователю возможность вручную добавить номер отправки sms, если он захочет изменить его.