让服务接收SMS消息

时间:2011-12-30 22:42:51

标签: android

我查看了一些SMS消息示例,而活动通常用于接收SMS。但是,我想做的是让我的后台服务接收短信(该服务将处理该短信并决定它是否适用于该应用 - 然后通知用户)

在我的清单中,服务定义如下:

    <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

我无法测试它,因为我的开发模块没有电话号码来发送短信。

4 个答案:

答案 0 :(得分:54)

我找到了解决方案。让服务接收短信:

  1. 更新清单,为您的应用授予接收短信的权限 (WRITE_SMS,READ_SMS,RECEIVE_SMS)
  2. 请勿使用接收器意图过滤器更新清单! (哪一个 每个示例代码在线似乎都可以)
  3. 在您的服务中,在您的服务类

    中创建一个嵌套的BroadcastReceiver类
    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. 在您的服务类中,注册以接收 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);
        }
    }
    
  5. 就是这样!

    注意: 包括你想知道为什么我没有从一个单独的BroadcastReceiver类中绑定到我的服务 - 它不起作用,因为bindService()不可用。

答案 1 :(得分:10)

您的代码似乎是正确的。您可以使用模拟器测试代码。模拟器还支持将SMS发送到虚拟设备。另见截图:

Screenshot

来自this answer的屏幕。

答案 2 :(得分: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);
            }
        }
}

答案 3 :(得分:0)

<块引用>

通过添加 BROADCAST_SMS 权限,我让这个解决方案完美地适用于我

<receiver android:name="com.mohamedtest.sendandreceivesms_m.SMSReceiver"
        android:enabled="true"
        android:exported="true"
        android:permission="android.permission.BROADCAST_SMS">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
        </intent-filter>
    </receiver>