我查看了一些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
我无法测试它,因为我的开发模块没有电话号码来发送短信。
答案 0 :(得分:54)
我找到了解决方案。让服务接收短信:
在您的服务中,在您的服务类
中创建一个嵌套的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);
}
}
}
}
在您的服务类中,注册以接收
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);
}
}
就是这样!
注意:强>
包括你想知道为什么我没有从一个单独的BroadcastReceiver类中绑定到我的服务 - 它不起作用,因为bindService()
不可用。
答案 1 :(得分:10)
答案 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>