在Android应用开发中,监听手机短信是一项常见需求,无论是为了实现自动读取验证码、安全监控还是其他业务逻辑,掌握监听短信的方法都至关重要,本文将详细介绍如何在Android中实现监听短信的两种主要方式:接受系统的短信广播和监听短信数据库。
一、接受系统的短信广播
1. 原理及优缺点
原理:当手机收到新短信时,系统会发送一条“android.provider.Telephony.SMS_RECEIVED”广播,通过注册一个BroadcastReceiver来接收这个广播,可以获取到短信内容。
优点:操作方便,适合简单的短信应用,实时性高,能够第一时间获取到短信内容。
缺点:来信会在状态栏显示通知信息,在某些定制系统或有安全软件的情况下,可能无法接收到广播。
2. 实现步骤
(1)添加权限:在AndroidManifest.xml
中添加接收短信和读取短信的权限。
<uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" />
(2)创建BroadcastReceiver:创建一个继承自BroadcastReceiver
的类,重写onReceive
方法。
public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pdus = (Object[]) bundle.get("pdus"); if (pdus != null && pdus.length > 0) { SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < pdus.length; i++) { byte[] pdu = (byte[]) pdus[i]; messages[i] = SmsMessage.createFromPdu(pdu); } for (SmsMessage message : messages) { String content = message.getMessageBody();// 得到短信内容 String sender = message.getOriginatingAddress();// 得到发信息的号码 Date date = new Date(message.getTimestampMillis()); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); format.setTimeZone(TimeZone.getTimeZone("GMT+08:00")); Log.e("日志:onReceive。。。", "开始接收短信....."); Log.e("日志:onReceive。。。", "短信内容:" + content); Log.e("日志:onReceive。。。", "发件人:" + sender); Log.e("日志:onReceive。。。", "时间:" + format.format(date)); } } } } } }
(3)注册BroadcastReceiver:在AndroidManifest.xml
中注册该BroadcastReceiver。
<receiver android:name=".SmsReceiver" android:exported="true"> <intent-filter android:priority="2147483647"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>
二、监听短信数据库
1. 原理及优缺点
原理:当手机收到短信时,短信数据库会发生变化,通过ContentObserver观察短信数据库的变化,当数据库变化时触发onChange()方法,从而读取短信。
优点:可以获取所有短信,包括已读和未读的短信,适用于需要读取历史短信的场景。
缺点:可能会因短信显示而被调用两次,在某些定制系统上可能无法正常工作。
2. 实现步骤
(1)添加权限:同样需要在AndroidManifest.xml
中添加相应的权限。
<uses-permission android:name="android.permission.READ_SMS" />
(2)创建ContentObserver:创建一个继承自ContentObserver
的类,重写onChange
方法。
public class SmsContentObserver extends ContentObserver { private Context context; private static final int MESSAGE_TYPE_ALLINBOX = 1; // SMS_INBOX 为收件箱,SMS_SENT 为发件箱 private static final Uri SMS_URI_ALL_INBOX = Uri.parse("content://sms/inbox"); public SmsContentObserver(Handler handler, Context context) { super(handler); this.context = context; } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Cursor cursor = context.getContentResolver().query(SMS_URI_ALL_INBOX, null, null, null, null); if (cursor != null) { while (cursor.moveToNext()) { String address = cursor.getString(cursor.getColumnIndex("address")); String body = cursor.getString(cursor.getColumnIndex("body")); long date = cursor.getLong(cursor.getColumnIndex("date")); Log.d("TAG", "短信来自:" + address + ", 内容:" + body + ", 时间:" + date); } cursor.close(); } } }
(3)注册ContentObserver:在合适的位置(如Activity或Service中)注册该ContentObserver。
SmsContentObserver observer = new SmsContentObserver(new Handler(), this); getContentResolver().registerContentObserver(SMS_URI_ALL_INBOX, observer);
三、相关问题与解答
1、如何确保在锁屏状态下也能监听到短信?
答:为了确保在锁屏状态下也能监听到短信,可以启动一个前台服务(Foreground Service),前台服务具有较高的优先级,不会被系统轻易杀死,在前台服务中注册BroadcastReceiver或ContentObserver即可实现锁屏监听。
2、如何处理动态权限申请问题?
答:由于Android 6.0(API级别23)及以上版本对危险权限进行了动态管理,因此在申请接收短信权限时需要动态请求用户授权,可以在Activity的onCreate
方法中添加如下代码:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECEIVE_SMS}, 1); }
并在onRequestPermissionsResult
方法中处理用户的授权结果。
通过接受系统的短信广播和监听短信数据库两种方式,可以实现Android中监听手机短信的功能,根据具体需求选择合适的方法,并注意处理动态权限申请问题以确保应用的正常运行。
小伙伴们,上文介绍了“android监听收短信”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/637201.html