2011-12-30 19 views
22

Przyjrzałem się kilku przykładom wiadomości SMS, a działania są zwykle używane do odbierania wiadomości SMS. Chciałbym jednak, aby moja usługa w tle otrzymała SMS-a (usługa przetworzy wiadomość i zdecyduje, czy dotyczy ona aplikacji - następnie poinformuje użytkownika).Usługa odbierania wiadomości SMS

W moim manifeście usługa jest zdefiniowane w następujący sposób:

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

, aby usługa otrzymała wiadomość SMS, czy to zadziała?

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

Przykładowy kod Uczyłem pochodziły z: http://www.apriorit.com/our-company/dev-blog/227-handle-sms-on-android

nie mogę go jeszcze przetestować, ponieważ mój moduł rozwój nie ma numeru telefonu do wysyłania SMS.

+0

> 2) nie aktualizują manifest z filtrem zamiarem odbiornika! (który wydaje się być w stanie wykonać każdy przykładowy kod online) Czy możesz opublikować swój AndroidManifest.xml? –

Odpowiedz

54

Znalazłem rozwiązanie. Aby mieć usługę odbierania wiadomości SMS:

  1. zaktualizować manifest dać swojej aplikacji uprawnienia do odbierania wiadomości SMS (WRITE_SMS, READ_SMS, RECEIVE_SMS)
  2. nie aktualizują manifest z filtrem zamiarem odbiornika! (Co Internecie wydaje każdy kod przykładowy zrobić)
  3. w usłudze utworzyć zagnieżdżone klasy BroadcastReceiver ciągu swojej klasie usługi

    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. W swojej klasie usługi, zarejestruj aby otrzymać filtr zamiaru 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); 
        } 
    } 
    

to jest to!

uwaga: obudować zastanawiasz się, dlaczego nie wiążą się z moich usług w oddzielnej klasie BroadcastReceiver - to nie działa, ponieważ bindService() nie jest dostępna.

+0

jak mogę odczytać przychodzące wiadomości SMS w mojej klasie usług za pośrednictwem odbiornika transmisji w klasie SMSreceiver? – progNewbie

+0

@someone, czy możesz wyjaśnić więcej, jak powinien wyglądać plik manifestu lub czy możesz go dostarczyć? –

+0

@AboJihadBazoka oświadczył uprawnienia w swoim kroku po kroku 1. Powinien jednak wystarczyć. –

10

Twój kod wydaje się być poprawny. Możesz przetestować swój kod za pomocą emulatora. Emulator obsługuje również wysyłanie sms do urządzenia wirtualnego. Zobacz także zrzut ekranu:

Screenshot

ekran przed this answer.

0

Możesz ustawić SmsReceiver oddzielnie od Sevice, używając kontekstu z metody onReceive, aby uzyskać obsługę w gwiazdkach. To pozwala ci nie uruchamiać usługi przez cały czas. Lub nawet nie zaczyna się aktywność rejestrowania odbiornika. Chociaż mogę się pomylić.

coś takiego:

@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); 
      } 
     } 
} 
Powiązane problemy