2011-12-30 154 views
22

我已經看過幾條短信示例,並且活動通常用於接收短信。但是,我想要做的是讓我的後臺服務收到短信(該服務將處理消息並決定是否適用於該應用 - 然後通知用戶)有服務接收短信

在我的清單中,服務是定義如下:

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

要有服務收到短信,請問這個工作嗎?

<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

我無法測試它尚未因爲我的開發模塊沒有一個電話號碼,以短信發送到。

+0

> 2)不更新的清單與接收器意圖過濾器! (其中 >網上每個示例代碼似乎都這樣做)你可以發佈你的AndroidManifest.xml嗎? – 2013-05-28 08:02:40

回答

54

我找到了解決方案。爲了有一個服務接收短信:

  1. 更新清單給你的應用的權限,以接收短信 (WRITE_SMS,READ_SMS,RECEIVE_SMS)
  2. 沒有更新清單與接收器意圖過濾器! (這 每個樣本代碼在網上似乎做)
  3. 在你的服務,你的服務類

    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. 內創建一個嵌套的BroadcastReceiver類服務類,登記接收 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); 
        } 
    } 
    

這就是它!

注: 包住你想知道爲什麼我沒有從單獨的廣播接收器類中綁定到我的服務 - 這是行不通的,因爲bindService()不可用。

+0

如何通過SMSreceiver類中的廣播接收器讀取服務類中的傳入短信? – progNewbie 2014-08-15 12:52:17

+0

@someone您能否詳細解釋清單文件應該如何提供或者您是否可以提供副本? – 2015-04-07 16:36:47

+0

@AboJihadBazoka他在他的後續步驟1中陳述了權限。 應該夠用了。 – 2015-04-13 15:33:43

10

你的代碼似乎是正確的。你可以用模擬器測試你的代碼。仿真器還支持將短信發送到虛擬設備。另見截圖:從this answer

Screenshot

屏幕。

0

您可以使用onReceive方法的上下文將SmsReceiver與服務分開製作星服務。這可以讓你不要一直運行服務。甚至沒有開始註冊接收器的活動。雖然我可以誤會。

事情是這樣的:

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