如何实现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

(0)
打赏 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
上一篇 2024-11-10 06:46
下一篇 2024-11-10 06:49

相关推荐

  • 为什么无法K歌了

    可能是因为网络问题、麦克风故障或者软件出现问题。建议检查网络连接、更换麦克风或重启软件尝试解决。

    2024-05-18
    0151
  • 服务器的散热量是多少

    枣庄服务器的能耗和散热问题如何解决?随着数据中心和云计算的快速发展,服务器的能耗和散热问题日益凸显,特别是在枣庄这样的地区,高温天气可能会加剧这一问题,解决服务器能耗和散热问题不仅有助于降低运营成本,还能提高系统的稳定性和可靠性,以下是一些有效的解决方案:1、优化数据中心布局 设计数据中心时,应确保充足的空间用于热通道和冷通道的布局,……

    2024-02-04
    0157
  • 怎么查公司所有的办理商标(怎么查询公司的商标)

    查询公司商标可通过国家知识产权局官网的商标数据库进行。

    2024-02-06
    0190
  • 哪个网站有专题页面

    许多网站都有专题页面,例如知乎、豆瓣、简书等。这些网站通常会根据不同的主题或事件创建专题页面。

    2024-05-27
    0122
  • Horizon Composer数据库的迁移和配置

    Horizon Composer数据库的迁移和配置Horizon Composer是一个用于管理Horizon项目依赖关系的工具,它可以帮助用户在不同的环境中部署和管理项目,确保项目的一致性和可重复性,在使用Horizon Composer时,数据库的迁移和配置是一个重要的环节,本文将详细介绍Horizon Composer数据库的迁……

    2023-12-25
    0135
  • redis配置文件详解

    Redis配置文件主要包括:bind、port、dbfilename、dir、logfile、maxclients等参数,用于设置Redis服务器的运行方式。

    2024-05-21
    084

发表回复

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

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