当前位置:首页 > 行业动态 > 正文

Android自动读取短信功能如何实现?

在Android中,可借助BroadcastReceiver监听短信广播,再通过Bundle获取短信内容实现自动读短信。

Android自动读短信的实现方法

一、通过短信接收器(SMS Receiver)实现

1、注册短信接收器:在AndroidManifest.xml文件中添加相应权限和注册短信接收器。

2、创建短信接收器类:创建一个继承自BroadcastReceiver的类,在onReceive()方法中处理收到的短信内容。

3、获取短信内容:在onReceive()方法中,从Intent中获取短信内容和发送者号码,并进行相应处理。

4、示例代码

AndroidManifest.xml:

        <uses-permission android:name="android.permission.RECEIVE_SMS" />
        <application>
            ...
            <receiver android:name=".SmsReceiver">
                <intent-filter>
                    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                </intent-filter>
            </receiver>
            ...
        </application>

SmsReceiver.java:

        public class SmsReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) {
                    Bundle bundle = intent.getExtras();
                    if (bundle != null) {
                        Object[] pdus = (Object[]) bundle.get("pdus");
                        if (pdus != null) {
                            for (Object pdu : pdus) {
                                SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
                                String messageBody = smsMessage.getMessageBody();
                                String sender = smsMessage.getDisplayOriginatingAddress();
                                // 在这里处理收到的短信内容
                            }
                        }
                    }
                }
            }
        }

二、通过监听短信数据库实现

1、建立监听数据库的类:创建一个继承自ContentObserver的类,用于监听短信数据库的变化。

2、在Activity中注册:在需要使用的地方注册该监听器。

3、取消注册:在合适的地方取消注册,避免内存泄漏。

4、示例代码

AutoGetCode.java:

        public class AutoGetCode extends ContentObserver {
            private Cursor cursor = null;
            private Activity activity;
            private String smsContent = "";
            private EditText editText = null;
            public AutoGetCode(Activity activity, Handler handler, EditText edittext) {
                super(handler);
                this.activity = activity;
                this.editText = edittext;
            }
            @Override
            public void onChange(boolean selfChange) {
                super.onChange(selfChange);
                // 读取收件箱中指定号码的短信
                cursor = activity.managedQuery(Uri.parse("content://sms/inbox"), new String[]{"_id", "address", "read", "body"}, "address=? and read=?", new String[]{"你要截获的电话号码", "0"}, "_id desc");
                if (cursor != null && cursor.getCount() > 0) {
                    cursor.moveToFirst();
                    if (cursor.moveToFirst()) {
                        String smsbody = cursor.getString(cursor.getColumnIndex("body"));
                        String regEx = "(?<![0-9])([0-9]{6})(?![0-9])";
                        Pattern p = Pattern.compile(regEx);
                        Matcher m = p.matcher(smsbody.toString());
                        while (m.find()) {
                            smsContent = m.group();
                            editText.setText(smsContent);
                        }
                    }
                }
            }
        }

在Activity中使用:

        AutoGetCode autoGetCode = new AutoGetCode(RegistCode.this, new Handler(), regist_code);
        this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, autoGetCode);

取消注册:

        @Override
        protected void onDestroy() {
            super.onDestroy();
            this.getContentResolver().unregisterContentObserver(autoGetCode);
        }

相关问题与解答

1、问题:为什么需要在AndroidManifest.xml文件中添加RECEIVE_SMS权限?

解答:RECEIVE_SMS权限允许应用程序接收短信广播,以便能够监听和读取收到的短信内容,这是实现自动读取短信功能的必要条件之一。

2、问题:如何确保在应用被放入后台或屏幕锁定时仍能继续监听短信?

解答:可以通过启动一个Service来实现锁屏监听,在Service中注册短信接收器,并在Service中处理收到的短信内容,需要在AndroidManifest.xml文件中声明FOREGROUND_SERVICE权限。

0