当前位置: 代码网 > it编程>App开发>Android > Android ContentObserver 监听短信思路详解

Android ContentObserver 监听短信思路详解

2024年11月03日 Android 我要评论
概述内容观察器contentobserver给目标内容注册一个观察器,目标内容的数据一旦发生变化,观察器规定好的动作马上触发,从而执行开发者预先定义的代码。思路注册一个监听getcontentreso

概述 

内容观察器contentobserver给目标内容注册一个观察器,目标内容的数据一旦发生变化,观察器规定好的动作马上触发,从而执行开发者预先定义的代码。

思路

注册一个监听

getcontentresolver().registercontentobserver(uri, true, mobserver);

继承 contentobserver 实现一个用于回调的监听类

 private static class smsgetobserver extends contentobserver {
        private final context mcontext;
        public smsgetobserver(context context) {
            super(new handler(looper.getmainlooper()));
            this.mcontext = context;
        }
        @suppresslint("range")
        @override
        public void onchange(boolean selfchange, @nullable uri uri) {
            super.onchange(selfchange, uri);
            // onchange会多次调用,收到一条短信会调用两次onchange
            // muri===content://sms/raw/20
            // muri===content://sms/inbox/20
            // 安卓7.0以上系统,点击标记为已读,也会调用一次
            // muri===content://sms
            // 收到一条短信都是uri后面都会有确定的一个数字,对应数据库的_id,比如上面的20
            log.d("aabb",uri.tostring());
            if (uri == null) {
                return;
            }
            if (uri.tostring().contains("content://sms/raw") ||
                    uri.tostring().equals("content://sms")) {
                return;
            }
            // 通过内容解析器获取符合条件的结果游标集
            cursor cursor = mcontext.getcontentresolver().query(uri, new string[]{"address", "body", "date"}, null, null, "date desc");
            if (cursor.movetonext()) {
                // 短信的发送号码
                string sender = cursor.getstring(cursor.getcolumnindex("address"));
                // 短信内容
                string content = cursor.getstring(cursor.getcolumnindex("body"));
                log.d("aaaa", string.format("sender:%s,content:%s", sender, content));
            }
            cursor.close();
        }
    }

短信相关权限

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

完整代码

package com.example.cpclient;
import androidx.annotation.nullable;
import androidx.appcompat.app.appcompatactivity;
import android.annotation.suppresslint;
import android.content.context;
import android.database.contentobserver;
import android.database.cursor;
import android.net.uri;
import android.os.bundle;
import android.os.handler;
import android.os.looper;
import android.util.log;
public class monitorsmsactivity extends appcompatactivity {
    private smsgetobserver mobserver;
    @override
    protected void oncreate(bundle savedinstancestate) {
        super.oncreate(savedinstancestate);
        setcontentview(r.layout.activity_monitor_sms);
        // 给指定uri注册内容观察器,一旦发生数据变化,就触发观察器的onchange方法
        uri uri = uri.parse("content://sms");
        // notifyfordescendents:
        // false :表示精确匹配,即只匹配该uri,true :表示可以同时匹配其派生的uri
        // 假设urimatcher 里注册的uri共有以下类型:
        // 1.content://authorities/[table]
        // 2.content://authorities/[table]/#
        // 3.content://authorities/[table]/[subtable]
        // 假设我们当前需要观察的uri为content://authorities/student:
        // 如果发生数据变化的 uri 为 3。
        // 当notifyfordescendents为false,那么该contentobserver会监听不到,但是当notifyfordescendents 为ture,能捕捉该uri的数据库变化。
        mobserver = new smsgetobserver(this);
        getcontentresolver().registercontentobserver(uri, true, mobserver);
    }
    @override
    protected void ondestroy() {
        super.ondestroy();
        getcontentresolver().unregistercontentobserver(mobserver);
    }
    private static class smsgetobserver extends contentobserver {
        private final context mcontext;
        public smsgetobserver(context context) {
            super(new handler(looper.getmainlooper()));
            this.mcontext = context;
        }
        @suppresslint("range")
        @override
        public void onchange(boolean selfchange, @nullable uri uri) {
            super.onchange(selfchange, uri);
            // onchange会多次调用,收到一条短信会调用两次onchange
            // muri===content://sms/raw/20
            // muri===content://sms/inbox/20
            // 安卓7.0以上系统,点击标记为已读,也会调用一次
            // muri===content://sms
            // 收到一条短信都是uri后面都会有确定的一个数字,对应数据库的_id,比如上面的20
            log.d("aabb",uri.tostring());
            if (uri == null) {
                return;
            }
            if (uri.tostring().contains("content://sms/raw") ||
                    uri.tostring().equals("content://sms")) {
                return;
            }
            // 通过内容解析器获取符合条件的结果游标集
            cursor cursor = mcontext.getcontentresolver().query(uri, new string[]{"address", "body", "date"}, null, null, "date desc");
            if (cursor.movetonext()) {
                // 短信的发送号码
                string sender = cursor.getstring(cursor.getcolumnindex("address"));
                // 短信内容
                string content = cursor.getstring(cursor.getcolumnindex("body"));
                log.d("aaaa", string.format("sender:%s,content:%s", sender, content));
            }
            cursor.close();
        }
    }
}

拓展

当在你的provider中,别人insert了一条数据,你要告知他是否成功了

使用 notifychange进行通知回调

getcontext().getcontentresolver().notifychange()

案例

   @override
    public uri insert(uri uri, contentvalues values) {
        if (uri_matcher.match(uri) == users) {
            sqlitedatabase db = dbhelper.getwritabledatabase();
            long rowid = db.insert(userdbhelper.table_name, null, values);
            if (rowid > 0) {
                // 如果添加成功,就利用新记录的行号生成新的地址
                uri newuri = contenturis.withappendedid(userinfocontent.content_uri, rowid);
                // 通知监听器,数据已经改变
                getcontext().getcontentresolver().notifychange(newuri, null);
            }
        }
        return uri;
    }

案例代码

到此这篇关于android contentobserver 监听短信的文章就介绍到这了,更多相关android contentobserver 监听短信内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com