有一项服务可以收到短信

我已经看了一些短信的例子,活动通常用于接收短信。 但是,我想要做的是让我的后台服务收到短信(服务将处理消息,并决定是否适用于应用程序 – 然后通知用户)

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

<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

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

Solutions Collecting From Web of "有一项服务可以收到短信"

我find了解决scheme。 有一个服务接收短信息:

  1. 更新清单,为您的应用程序提供接收SMS(WRITE_SMS,READ_SMS,RECEIVE_SMS)的权限
  2. 不要使用接收方意向filter来更新清单! (网上的每个示例代码似乎都这样做)
  3. 在您的服务中,在Service类中创build一个嵌套的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. 在你的Service类中,注册接收android.provider.Telephony.SMS_RECEIVED意图filter:

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

而已 !

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

你的代码似乎是正确的。 你可以用模拟器testing你的代码。 仿真器也支持发送短信给虚拟设备。 另请参阅屏幕截图:

截图

从这个答案屏幕。

您可以使用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); } } }