Подтвердить что ты не робот

Получение службы SMS-сообщений

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

В моем манифесте служба определяется следующим образом:

    <service android:name=".service.myService"
        android:enabled="true">
        <intent-filter>
            <action android:name="package.com.service.myService"/>
        </intent-filter>
</service>

чтобы служба получила SMS, будет ли это работать?

<receiver android:name=".service.myService" android:exported="true" > 
  <intent-filter android:priority="999"> 
    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  </intent-filter> 
</receiver>

Образец кода, который я изучал, исходил из: http://www.apriorit.com/our-company/dev-blog/227-handle-sms-on-android

Я не могу проверить его еще, потому что мой модуль разработки не имеет номера телефона для отправки SMS.

4b9b3361

Ответ 1

Я нашел решение. Чтобы служба получила SMS-сообщения:

  • Обновите манифест, чтобы предоставить вашему приложению разрешения на получение SMS-сообщений. (WRITE_SMS, READ_SMS, RECEIVE_SMS)
  • НЕ обновляйте манифест с помощью фильтра назначения приемника! (который каждый пример кода в Интернете, похоже, делает)
  • В вашей службе создайте вложенный класс BroadcastReceiver в классе

    private class SMSreceiver extends BroadcastReceiver
    {
        private final String TAG = this.getClass().getSimpleName();
    
        @Override
        public void onReceive(Context context, Intent intent)
        {
            Bundle extras = intent.getExtras();
    
            String strMessage = "";
    
            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();
    
                    strMessage += "SMS from " + strMsgSrc + " : " + strMsgBody;                    
    
                    Log.i(TAG, strMessage);
                }
    
            }
    
        }
    
    }
    
  • В вашем классе "Сервис" зарегистрируйтесь для получения android.provider.Telephony.SMS_RECEIVED фильтр цели:

    public class ServiceCommunicator extends Service
    {
        private SMSreceiver mSMSreceiver;
        private IntentFilter mIntentFilter;
    
        @Override
        public void onCreate()
        {
            super.onCreate();
    
            //SMS event receiver
            mSMSreceiver = new SMSreceiver();
            mIntentFilter = new IntentFilter();
            mIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
            registerReceiver(mSMSreceiver, mIntentFilter);
        }
    
        @Override
        public void onDestroy()
        {
            super.onDestroy();
    
            // Unregister the SMS receiver
            unregisterReceiver(mSMSreceiver);
        }
    }
    

Что это!

Примечание: вам не интересно, почему я не привязывался к моей службе из отдельного класса BroadcastReceiver - это не работает, потому что bindService() недоступен.

Ответ 2

Ваш код кажется правильным. Вы можете проверить свой код с помощью эмулятора. Эмулятор поддерживает также отправку смс на виртуальное устройство. Смотрите также скриншот:

Screenshot

Экран этот ответ.

Ответ 3

Вы можете сделать SmsReceiver отдельно от Sevice, используя контекст, от метода onReceive до звездного сервиса. Это позволяет вам не запускать службу все время. Или даже не начать работу по регистрации приемника. Хотя я могу ошибаться.

Что-то вроде этого:

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

        if (intent.getAction().equals(SMS_RECEIVED)) {
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                Object[] pdus = (Object[]) bundle.get("pdus");
                if (pdus.length == 0) {
                    return;
                }
                SmsMessage[] messages = new SmsMessage[pdus.length];
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < pdus.length; i++) {
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                    sb.append(messages[i].getMessageBody());
                }
                String number = messages[0].getOriginatingAddress();
                String messageText = sb.toString();


                Intent intent1 = new Intent(context, SMSreceiver.class);
                intent1.putExtra(PHONE_NUMBER, number);
                intent1.putExtra(SMS_TEXT, messageText);

                context.startService(intent1);
            }
        }
}