Avere un servizio ricevere messaggi SMS

Ho esaminato alcuni esempi di messaggi SMS e le attività sono tipicamente utilizzate per ricevere un SMS. Tuttavia, quello che vorrei fare è avere il mio servizio di background ricevere l'SMS (il servizio elaborerà il messaggio e deciderà se è applicabile all'applicazione – quindi informi l'utente)

Nel mio Manifesto il servizio è definito come segue:

  • Visualizzazione di notifica personalizzata
  • Visualizza AlertDialog come window di sovrapposizione di sistema da Service
  • Utilizzando il progetto gradel in Eclipse e IDEA
  • Come get l'indirizzo email dell'utente con il richiesto grafico in Facebook Android sdk 4.0
  • NETWORK_PROVIDER non ha funzionato nelle versioni android 4.0 e sopra / livello API 14 e sopra
  • Come fare il mio dialer personalizzato in un telefono Android
  • <service android:name=".service.myService" android:enabled="true"> <intent-filter> <action android:name="package.com.service.myService"/> </intent-filter> </service> 

    per avere il servizio riceve l'SMS, functionrà?

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

    Il codice di esempio che ho studiato proveniva da: http://www.apriorit.com/our-company/dev-blog/227-handle-sms-on-android

    Non posso provarlo ancora perché il mio module di sviluppo non dispone di un numero di telefono per submit un SMS.

    3 Solutions collect form web for “Avere un servizio ricevere messaggi SMS”

    Ho trovato la soluzione. Per avere un servizio ricevere messaggi SMS:

    1. Aggiorna il manifesto per dare all'applicazione le autorizzazioni per ricevere SMS (WRITE_SMS, READ_SMS, RECEIVE_SMS)
    2. NON aggiornare il manifesto con il filter di intenti del ricevitore! (che sembra fare each codice di esempio online)
    3. Nel tuo servizio, crea una class BroadcastReceiver nidificata nella tua class di servizio

       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); } } } } 
    4. Nella class Service, registrati per ricevere il filter di intenti 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); } } 

    Questo è tutto !

    nota: inserire che stai chiedendo perché non ho legato al mio servizio da una class separata BroadcastReceiver – non funziona perché bindService() non è disponibile.

    Il tuo codice sembra essere corretto. È ansible testare il codice con l'emulatore. L'emulatore support anche l'invio di sms al dispositivo virtuale. Vedi anche lo screenshot:

    Immagine dello schermo

    Schermata da questa risposta .

    È ansible effettuare il SmsReceiver separatamente dal Sevice utilizzando il context dal metodo onReceive per eseguire il servizio. Questo ti permette di non eseguire il servizio per tutto il tempo. O anche non iniziare l'attività per registrare il ricevitore. Anche se posso sbagliare.

    Qualcosa come questo:

      @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); } } } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.