Android: получение SMS с определенного номера телефона - PullRequest
2 голосов
/ 31 января 2011

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

ЕслиИтак, как система может узнать, какой процесс первым в очереди, чтобы выбрать, какие сообщения получать?

Ответы [ 5 ]

3 голосов
/ 31 января 2011

Я не пробовал это, но теоретически это должно работать:

В Android-трансляция SMS отправляется как заказанная трансляция , что означает, что приемники обрабатываются по порядку и могут отменить трансляцию. См. SMSDispatcher.java , строка 420.

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

<intent-filter android:priority="1000" >
    . . .
</intent-filter>

Чтобы отменить широковещательный вызов broadcastReceiver.setResultCode(RESULT_CANCELED). Таким образом, трансляция SMS будет отменена и не будет отображаться системным приложением SMS (и SMS-уведомителем).

Обновление:

Также попробуйте использовать broadcastReceiver.setResultCode(Intents.RESULT_SMS_HANDLED).

Обновление 2:

пользователь672601 отметил в другом ответе, что это действительно работает, но он использовал abortBroadcast() внутри приемника вещания.

2 голосов
/ 04 марта 2011

Я второй фархан, это невозможно по ряду причин. Любой может сделать что-нибудь с таким разрешением. Проверьте это для деталей http://groups.google.com/group/android-developers/browse_thread/thread/78fecbc156f4a1ea

1 голос
/ 07 ноября 2012
public class NotifyServiceReceiver extends BroadcastReceiver{
static final String ACTION ="android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(Context arg0, Intent arg1) {
    // TODO Auto-generated method stub
    if(arg1.getAction().equalsIgnoreCase(ACTION))
    {
    Bundle extras = arg1.getExtras();

    String strMessage = "private message";
    if ( extras != null )
    {
        Object[] smsextras = (Object[]) extras.get( "pdus" );

        for ( int i = 0; i < smsextras.length; i++ )
        {
            SmsMessage smsmsg = SmsMessage.createFromPdu((byte[])smsextras[i]);

            String strMsgBody = smsmsg.getMessageBody().toString();
            String strMsgSrc = smsmsg.getOriginatingAddress();

            //Toast.makeText(GasService.this,strMessage, Toast.LENGTH_SHORT).show();
            if(strMsgSrc.equals("+919XXXXXXXXX"))
            {
             strMessage += "SMS from " + strMsgSrc + " : " + strMsgBody;               
            Toast.makeText(PrivatesmsService.this,strMessage, Toast.LENGTH_SHORT).show();

            abortBroadcast();
            }

        }

    }
    }

}
 }

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

1 голос
/ 23 марта 2011

Питер Кнего ответ правильный.Я пытался сделать именно это, попробовал его решение, и оно действительно работает, за исключением того, что я использовал:

this.abortBroadcast();

внутри broadcastReceiver.

0 голосов
/ 31 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...