Android 让服务接收SMS消息
我看了一些短信示例和活动,它们通常用于接收短信。然而,我想做的是让我的后台服务接收短信(该服务将处理该消息并决定其是否适用于应用程序-然后通知用户) 在我的清单中,服务定义如下:Android 让服务接收SMS消息,android,Android,我看了一些短信示例和活动,它们通常用于接收短信。然而,我想做的是让我的后台服务接收短信(该服务将处理该消息并决定其是否适用于应用程序-然后通知用户) 在我的清单中,服务定义如下: <service android:name=".service.myService" android:enabled="true"> <intent-filter> <action android:name="package.
<service android:name=".service.myService"
android:enabled="true">
<intent-filter>
<action android:name="package.com.service.myService"/>
</intent-filter>
</service>
我还不能测试它,因为我的开发模块没有可以发送短信的电话号码。我找到了解决方案。要让服务接收SMS消息,请执行以下操作:
更新清单以授予应用程序接收SMS的权限
(写短信、读短信、接收短信)
不要使用receiver intent筛选器更新清单!(哪个
每个在线示例代码似乎都可以)
在服务中,在服务类中创建嵌套的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);
}
}
}
}
就这样
注意:
encase您想知道为什么我没有从一个单独的BroadcastReceiver类中绑定到我的服务-它不起作用,因为bindService()
不可用。您可以使用onReceive方法到star service的上下文将SMSReiver与服务分开。这使您不必一直运行服务。甚至不启动活动来注册接收者。虽然我会犯错
大概是这样的:
@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);
}
}
}
@覆盖
公共void onReceive(上下文、意图){
if(intent.getAction().equals(SMS_已接收)){
Bundle=intent.getExtras();
if(bundle!=null){
Object[]pdus=(Object[])bundle.get(“pdus”);
如果(pdus.length==0){
返回;
}
SmsMessage[]messages=新SmsMessage[pdus.length];
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
通过添加广播和短信许可,我的解决方案非常适合我
我如何通过SMSreceiver类中的广播接收器读取我服务类中的传入短信?@有人能告诉我清单文件应该是什么样的,或者你是否可以提供副本吗?@AboJihadBazoka他在他的帖子步骤1中说明了权限。应该够了。@有人在某处嗨!我找到了这个主题,因为我在使用嵌套广播接收器运行服务时遇到问题。我尝试了您建议的方法,但显然我做错了什么,因为我仍然会遇到权限拒绝错误
。你能调查一下吗?谢谢除此之外,我无法使它工作。。。你能把你的清单文件放进去吗?(如果你从2012年至今还活着,哈哈)多谢了,你的代码似乎是正确的。您可以使用模拟器测试代码。模拟器还支持向虚拟设备发送sms。另请参见屏幕截图:!来自的屏幕。>2)不要使用接收者意图过滤器更新清单!(每个在线示例代码似乎都是这样)您可以发布您的AndroidManifest.xml吗?
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);
}
}
@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);
}
}
}
<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>