2011-12-30 112 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); 
      } 
     } 
}