2011-12-30 27 views
22

Birkaç SMS mesajı örneğine baktım ve Etkinlikler genellikle bir SMS almak için kullanılır. Ancak, benim yapmak istediğim arka plan servisimin SMS'i almasıdır (servis mesajı işleyecek ve uygulamaya uygulanabilir olup olmadığına karar verecek - sonra kullanıcıyı bilgilendirecektir)Bir Hizmete sahip olmak SMS iletileri almak

Manifest'imde servis aşağıdaki gibi tanımlanmıştır: Hizmetin SMS'i almasını sağlamak için, bu iş işe yarayacak mı? Benim gelişim modülü SMS göndermek için bir telefon numarası olmadığı için http://www.apriorit.com/our-company/dev-blog/227-handle-sms-on-android

Ben henüz test edemezsiniz:

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

Ben okudu örnek kod geldi.

+0

> 2) alıcısı niyet filtreli tezahür güncelleme YAPMAYIN! (Hangi > her örnek kod çevrimiçi görünüyor) AndroidManifest.xml dosyasını gönderir misiniz? –

cevap

54

  1. Güncelleme apaçık Uygulamanıza SMS (WRITE_SMS, READ_SMS, RECEIVE_SMS)
  2. alıcı niyet filtreli tezahür güncelleme YAPMAYIN almak için izinleri vermek için: Bir Hizmeti sahip olmak SMS mesajları almak! , Servis sınıfında Servis sınıfına

    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); 
          } 
    
         } 
    
        } 
    
    } 
    
  3. içinde yuvalanmış bir BroadcastReceiver sınıfı oluşturmak android.provider.Telephony.SMS_RECEIVED amaç filtresini almak için kayıt sizin hizmet et

  4. (her örnek kod çevrimiçi yapmak görünüyor ): bu kadar

    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); 
        } 
    } 
    

!

not: Ben ayrı BroadcastReceiver sınıf içinde benim hizmetine bağlama etmedi neden merak ediyorsanız örtmek - bindService() kullanılamadığı için çalışmıyor.

+0

SMSreceiver sınıfındaki yayın alıcısı aracılığıyla hizmet sınıfımdaki gelen SMS'leri nasıl okuyabilirim? – progNewbie

+0

@someone, manifest dosyasının nasıl olması gerektiğini veya bir kopyasını nasıl sağlayabileceğinizi açıklayabilir misiniz? –

+0

@AboJihadBazoka, 1. adımdaki izinleri belirtti. Yine de yeterli olmalı. –

10

Sizin kodunuz yanlış görünüyor. Kodunuzu emülatörle test edebilirsiniz. Emülatör ayrıca sanal cihaza sms göndermeyi de destekler. this answer den

Screenshot

Ekran: Ayrıca ekran bakın. Çözeltiyi buldum

0

SmsReceiver'ı onReceive yönteminden yıldız hizmetine bağlam kullanarak Sevice'den ayrı olarak yapabilirsiniz. Bu, her zaman servisi çalıştırmamanızı sağlar. Veya alıcıyı kaydetmek için aktiviteyi başlatmıyor bile. Yine de hata yapabilirim. Böyle

şey:

@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); 
      } 
     } 
} 
İlgili konular