如何在Android系统中实现监听接收短信的功能?

在Android应用开发中,监听手机短信是一项常见需求,无论是为了实现自动读取验证码、安全监控还是其他业务逻辑,掌握监听短信的方法都至关重要,本文将详细介绍如何在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。

如何在Android系统中实现监听接收短信的功能?

<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。

如何在Android系统中实现监听接收短信的功能?

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

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2024-11-10 06:14
Next 2024-11-10 06:16

相关推荐

  • 域名解析包括泛域名解析 apache域名泛解析,域名泛解析是什么意思

    1、域名泛解析是指将一个域名下所有的子域名指向同一个IP地址的解析方式,比如,域名example.com使用域名泛解析后,、mail.example.com、blog.example.com等所有子域名都会解析到同一个IP地址,2、泛域名解析定义为:客户的域名a.com,之下所设的*.a.com全部解析到同一个IP地址上去,比如客户设b.a.com就会自动解析到与a.com同一个IP地址上去,

    2023-11-29
    0137
  • 如何建微信商城网站,如何微信建群详细步骤_怎么搭建微信商城

    接下来,给各位带来的是如何建微信商城网站,如何微信建群详细步骤的相关解答,其中也会对怎么搭建微信商城进行详细解释,假如帮助到您,别忘了关注本站哦!

    2023-11-26
    0182
  • 网站搭建在云服务器安全吗

    网站搭建在云服务器上的安全性是众多网站所有者关心的话题,云服务器提供了灵活性、可扩展性以及成本效益,但同时也带来了一系列的安全挑战,下面我们将详细分析云服务器上搭建网站的安全性,并探讨如何提高安全性。云服务器的安全优势1、专业的安全管理:云服务提供商通常拥有专业的安全团队来管理和维护数据中心的安全,包括物理安全和网络安全。2、数据备份……

    2024-04-06
    0175
  • 什么是负载均衡中的Hash法,以及它如何工作?

    负载均衡Hash法实现高效服务器资源分配策略1、负载均衡概述- 定义与目的- 常见算法类型2、哈希法基本原理- 哈希函数选择- 数据映射方式3、一致性哈希算法- 原理与特点- 虚拟节点引入4、源地址哈希法- 算法描述- 优点与局限性5、一致性哈希算法应用- 动态扩展性- 容错能力6、源地址哈希法应用- 会话保持……

    行业资讯 2024-11-13
    02
  • 详解Windows Server 2012下安装MYSQL5.7.24的问题

    在Windows Server 2012下安装MySQL 5.7.24,首先确保满足系统要求,然后下载对应版本的安装包,按照官方文档进行安装和配置。

    2024-05-21
    0122
  • SQL Server并发处理存在就更新解决方案探讨

    在数据库管理系统中,并发处理是一种常见的操作模式,它允许多个用户同时访问和修改数据库中的数据,并发处理也可能带来一些问题,其中之一就是“存在就更新”的问题,在SQL Server中,如果两个或更多的用户同时尝试更新同一条记录,可能会出现数据不一致的情况,为了解决这个问题,我们可以采用一些技术手段,如使用锁、事务和乐观并发控制等。1、使……

    行业资讯 2024-03-03
    0141

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入