Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 让服务接收SMS消息_Android - Fatal编程技术网

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>