如何实现Android应用监听并获取收到的短信内容?

在Android设备中,监听收到的短信内容是一个常见的需求,尤其是在需要处理短信验证码或进行短信通知监控的场景下,以下是两种主要的实现方式:

如何实现Android应用监听并获取收到的短信内容?

1、通过广播接收器(Broadcast Receiver)监听短信

2、通过ContentObserver监听短信数据库变化

方法一:通过广播接收器(Broadcast Receiver)监听短信

1. 添加必要的权限

在AndroidManifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />

2. 注册Broadcast Receiver

在AndroidManifest.xml中注册一个Broadcast Receiver:

<receiver android:name=".SmsReceiver">
    <intent-filter android:priority="2147483647">
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

注意:优先级设置为最大值2147483647,以确保在其他应用拦截之前接收到广播。

如何实现Android应用监听并获取收到的短信内容?

3. 创建SmsReceiver类

创建一个继承自BroadcastReceiver的类来处理接收到的短信:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        if (null != bundle) {
            Object[] pdus = (Object[]) bundle.get("pdus");
            for (Object pdu : pdus) {
                SmsMessage msg = SmsMessage.createFromPdu((byte[]) pdu);
                String sender = msg.getDisplayOriginatingAddress(); // 发件人地址
                String messageBody = msg.getMessageBody(); // 短信内容
                Log.i("SmsReceiver", "Sender: " + sender + ", Message: " + messageBody);
                // 在这里可以添加更多处理逻辑,如上传服务器等
            }
        }
    }
}

方法二:通过ContentObserver监听短信数据库变化

1. 添加必要的权限

同样需要在AndroidManifest.xml文件中添加权限:

<uses-permission android:name="android.permission.READ_SMS" />

2. 创建ContentObserver子类

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

import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.util.Log;
public class SmsContentObserver extends ContentObserver {
    private Context context;
    public SmsContentObserver(Context context, Handler handler) {
        super(handler);
        this.context = context;
    }
    @Override
    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange, uri);
        // 在这里处理短信数据库变化的逻辑
        Log.i("SmsContentObserver", "SMS database changed");
        // 读取最新的短信内容并进行处理
        Uri inboxUri = Uri.parse("content://sms/inbox");
        Cursor cursor = context.getContentResolver().query(inboxUri, null, null, null, null);
        if (cursor != null && cursor.moveToFirst()) {
            do {
                long threadId = cursor.getLong(cursor.getColumnIndexOrThrow("thread_id"));
                String address = cursor.getString(cursor.getColumnIndexOrThrow("address"));
                String body = cursor.getString(cursor.getColumnIndexOrThrow("body"));
                Log.i("SmsContentObserver", "Thread ID: " + threadId + ", Address: " + address + ", Body: " + body);
            } while (cursor.moveToNext());
            cursor.close();
        }
    }
}

3. 注册ContentObserver

如何实现Android应用监听并获取收到的短信内容?

在需要的地方注册ContentObserver,例如在Activity的onCreate方法中:

import android.database.ContentObserver;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
    private SmsContentObserver smsContentObserver;
    private Uri SMS_INBOX_URI = Uri.parse("content://sms/inbox");
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        smsContentObserver = new SmsContentObserver(this, new Handler());
        getContentResolver().registerContentObserver(SMS_INBOX_URI, true, smsContentObserver);
    }
}
方法 优点 缺点
广播接收器 操作简单,适合简单应用 可能被其他应用截断,无法获取历史短信
ContentObserver 可获取所有短信,包括已读和未读 实现稍复杂,需要处理数据库权限

相关问题与解答

问题1:如何确保广播接收器在应用被杀死后仍然能接收短信?

答:为了确保广播接收器在应用被杀死后仍然能接收短信,可以将Broadcast Receiver注册为动态注册,并在前台服务中保持应用活跃状态,这样即使应用被杀死,前台服务仍会运行,从而保证广播接收器能够继续工作。

问题2:如何处理短信内容的隐私和安全问题?

答:在处理短信内容时,必须严格遵守隐私政策和用户数据保护法规,应明确告知用户应用程序将访问短信内容,并在必要时请求用户授权,应采取加密措施保护短信内容,防止敏感信息泄露,避免将短信内容上传到不安全的服务器或存储在不安全的位置。

小伙伴们,上文介绍了“android监听收到短信内容”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/637273.html

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

相关推荐

  • code cloud

    答:CodecCloud 支持多种流行的音视频格式,包括 H.264, H.265, VP8, VP9 等,2、CodecCloud 的性能如何?答:CodecCloud 采用了多层次的安全措施,包括数据加密、访问控制、DDoS 防护等,确保用户的数据安全不受威胁,4、CodecCloud 的客户服务如何?

    2024-02-11
    0514
  • 国内轻量云主机哪一个地区的好用

    在国内市场中,有很多云主机提供商,它们各自具有不同的优势和特点,选择哪个地区的云主机取决于您的需求和预算,以下是一些关于国内轻量云主机地区选择的建议:1、香港地区香港地区的云主机以其高速度、稳定性和安全性而闻名,由于香港地理位置接近中国大陆,所以访问速度非常快,香港政府对互联网的监管相对宽松,因此在这里托管网站也比较安全,香港地区的云……

    2024-01-27
    0163
  • 海尔wifi设置方法,W8系统海尔无线路由器怎么设置,海尔连接wifi教程视频

    各位访客大家好!、海尔路由器的默认用户名、默认密码都是:admin,在海尔Hello Wifi路由器设置的底部有一个“Hello Wifi认证”,勾选上选项,就可以实现附近设备无需输入密码即可连接Wifi,路由器上网手机设置教程:第一步、手机连接到路由器的WiFi信号 把你的海尔路由器插上电源,并且把猫接出来的网线,连接到海尔路由器的WAN口,登录到设置页面在浏览器中输入你自己这台海尔 家用路

    2023-12-04
    0460
  • 新加坡高防服务器为啥能防御攻击

    新加坡高防服务器为啥能防御攻击随着互联网的快速发展,网络安全问题日益严重,黑客攻击、病毒入侵等安全事件频频发生,为了保障企业及个人用户的信息安全,越来越多的企业和个人选择使用高防服务器,新加坡高防服务器为何能防御攻击呢?答:新加坡高防服务器的优势主要包括地理位置优势、先进的防火墙技术、专业的安全团队以及高速稳定的网络环境,2、新加坡高防服务器的价格如何?

    2023-12-18
    0139
  • 服务器地址获取的方法是什么意思

    服务器地址获取的方法涉及多个步骤。通过运行cmd并键入ipconfig/all可以查看DNS服务器地址。每个电脑都有个IP地址,服务器亦然。登录服务器通常使用的是网址,然而这需要经过服务器解析,最终会指向一个具体的IP地址及访问端口。域名服务器则负责返回给本地域名服务器一个所查询的主域名服务器(gTLD Server)地址,com、.cm、.org等。获取服务器地址的过程涉及到网络配置、域名解析和IP地址的分配等多个环节。

    2024-01-20
    0183
  • 服务器磁盘分区步骤

    1. 启动计算机,进入BIOS设置。,2. 调整启动顺序,将安装光盘设为第一启动项。,3. 保存设置,重启计算机。,4. 进入光盘引导界面,选择磁盘分区工具。,5. 选择要分区的磁盘,点击“新建分区”。,6. 设置分区大小、文件系统和盘符,点击“确定”。,7. 重复步骤5-6,创建其他分区。,8. 完成分区后,选择“保存更改”。,9. 退出分区工具,按照提示完成安装过程。

    2024-03-20
    0195

发表回复

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

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