Перехват SMS с iPhone/Android и перенаправление в приложение

Можно ли перехватить SMS, пришедшее с определенного номера, и направить его в определенное приложение на iPhone/Android, где оно будет обработано? Спасибо.


person Monty Burns    schedule 22.08.2010    source источник


Ответы (5)


В Android вы можете зарегистрировать BroadcastReceiver для получения уведомления о получении SMS, пометить сообщение как прочитанное в поставщике содержимого SMS, а затем удалить это конкретное сообщение из поставщика содержимого. Это не позволит другим приложениям прочитать сообщение после того, как вы его удалили, и никакие уведомления не будут отображаться в области уведомлений. Тем не менее, я понятия не имею, что произойдет с приложениями, которые получают намерение, указывающее, что сообщение было получено, но затем не могут получить к нему доступ в базе данных. Это может привести к непредсказуемому поведению в результате ряда условий гонки.

person Chris Thompson    schedule 22.08.2010

да. В андроиде можно. Я делаю это в приложении, которое разрабатываю. Что вам нужно сделать, это:

public class SMSService extends BroadcastReceiver {
public static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
private String phoneNumber;
private String sms;
private Context context;

@Override
public void onReceive(Context context, Intent intent) {
    this.context = context;
    if (intent.getAction().equals(SMS_RECEIVED)) {
        Bundle bundle = intent.getExtras();
        SmsMessage[] msgs = null;

        if (bundle != null) {
            Object[] pdus = (Object[]) bundle.get("pdus");
            msgs = new SmsMessage[pdus.length];

            for (int i = 0; i < msgs.length; i++) {

                msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);

                // get sms message
                sms = msgs[i].getMessageBody();

                // get phone number
                phoneNumber = msgs[i].getOriginatingAddress();

                if (phoneNumber.equals("Some other phone number")){
                    // the sms will not reach normal sms app
                    abortBroadcast();

                Thread thread = new Thread(null,
                        doBackgroundThreadProcessing, "Background");
                thread.start();
                }

            }
        }
    }
}

private Runnable doBackgroundThreadProcessing = new Runnable() {
    // do whatever you want
};

ВАЖНО: В файле манифеста вы должны определить приоритет SMS с большим числом. Я считаю, что максимум 100.

<!-- SMS Service -->
    <service android:name=".SMSService" />
    <receiver android:name=".SMSService">
        <intent-filter android:priority="100">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
person Laranjeiro    schedule 11.06.2012
comment
Максимальное значение для android:priority — 1000. См. здесь: разработчик .android.com/guide/topics/manifest/ - person Nik NexAndrX; 16.08.2013

Для Android ответ - нет. Вы можете реализовать BroadcastReceiver, который вызывается всякий раз, когда устройство получает SMS текстовое сообщение, но не может помешать другим приложениям (например, встроенному приложению обмена сообщениями) получать их.

person Josef Pfleger    schedule 22.08.2010

Для Android ответ Да.

android.provider.Telephony.SMS_RECEIVED событие является упорядоченной трансляцией, и вы можете настроить приоритет. Это означает, что ваше приложение получит событие раньше всех остальных. И вы можете отменить вещание для остальных приемников вещания.

Дополнительную информацию можно найти здесь: stackoverflow.com/can-we-delete-an-sms-in-android-before-it-reaches-the-inbox/

person ibo.ezhe    schedule 27.04.2011

В Android, как только вы получили SMS-сообщение в своем приложении, вы можете использовать объект Intent для передачи сведений о сообщении другому действию/приложению для дальнейшей обработки. Если вам нужно передать сообщение вашему собственному приложению, используйте метод sendBroadcast() для трансляции объекта Intent. В вашей деятельности вам просто нужно использовать метод registerReceiver() для прослушивания трансляции.

Надеюсь, поможет! Вэй-Мэн Ли

person Wei-Meng Lee    schedule 15.05.2011