当前位置: 首页 > article >正文

Telephony Contact

1、联系人数据库表

accounts账户,包括SIM卡账户,本机账户,已经三方如google账户等。

contacts表

raw_contacts 表,联系人数据表,每一条数据表示一个联系人,联系人关键数据表格。

mimetypes表,数据类型,表示相关数据类型。

data表,联系人相关数据表。

data表,mimetypes表,raw_contacts之间的关联如下

2、联系人数据库调试

1、导出联系人数据库分析

adb shell am start -a com.android.providers.contacts.DUMP_DATABASE

2、然后打开provider log:

//contacts provider log(无需重启)

adb shell setenforce 0

adb shell setprop log.tag.ContactsProvider VERBOSE

adb shell setprop log.tag.ContactsDatabaseHelper VERBOSE

adb shell setprop log.tag.ContactAggregator VERBOSE

adb shell setprop log.tag.ContactsStrictMode VERBOSE

adb shell setprop log.tag.CallLogProvider VERBOSE

adb shell setprop log.tag.SQLiteTime VERBOSE

adb shell setprop log.tag.SQLiteLog VERBOSE

adb shell setprop log.tag.SQLiteStatements VERBOSE

adb shell setprop log.tag.SQLiteDatabase VERBOSE

adb shell setprop log.tag.SQLiteDatabaseTrace VERBOSE

adb shell setprop log.tag.SQLiteConnection VERBOSE

adb shell setprop log.tag.SQLiteConnectionPool VERBOSE

adb shell killall android.process.acore

adb shell pkill android.process.acore

//验证contacts provider log 是否开启

adb shell getprop log.tag.ContactsProvider

-> VERBOSE 为开启成功。

若contacts provider log 未开启成功请将adb 命令逐条执行,不要全部粘贴。

//并执行以下命令 copy 复现操作前后的联系人数据库

adb root

adb pull /data/data/com.android.providers.contacts/databases D:\data

3、联系人增删改查

    public static void addContact(Context context, String name, String phoneNumber) {
        ContentResolver contentResolver = context.getContentResolver();
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        ContentValues values = new ContentValues();
        long contact_id = ContentUris.parseId(contentResolver.insert(uri, values));
        uri = Uri.parse("content://com.android.contacts/data");
        //add Name
        values.put("raw_contact_id", contact_id);
        values.put(ContactsContract.Data.MIMETYPE,"vnd.android.cursor.item/name");
        values.put("data1", name);
        contentResolver.insert(uri, values);
        values.clear();
        //add Phone
        values.put("raw_contact_id", contact_id);
        values.put(ContactsContract.Data.MIMETYPE,"vnd.android.cursor.item/phone_v2");
        values.put("data1", phoneNumber);
        contentResolver.insert(uri, values);
        values.clear();
    }

    public void deleteContacts(String name) {
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        ContentResolver resolver = this.getContentResolver();
        Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Data._ID},"display_name=?", new String[]{name}, null);
        if(cursor.moveToFirst()){
            int id = cursor.getInt(0);
            resolver.delete(uri, "display_name=?", new String[]{name});
            uri = Uri.parse("content://com.android.contacts/data");
            resolver.delete(uri, "raw_contact_id=?", new String[]{id+""});
        }
        cursor.close();
    }

    public void updateContacts(String name, String number) {
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        Uri uri2 = Uri.parse("content://com.android.contacts/data");
        ContentResolver resolver = this.getContentResolver();
        Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Data._ID},"display_name=?", new String[]{name}, null);
        if(cursor.moveToFirst()) {
            int id = cursor.getInt(0);
            ContentValues values = new ContentValues();
            values.put("data1", number);
            resolver.update(uri2, values, "mimetype=? and raw_contact_id=?", new String[]{"vnd.android.cursor.item/phone_v2", id + ""});
        }
        cursor.close();
    }

    private void queryContacts() {
        ContentResolver contentResolver = getContentResolver();
        Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        Cursor cursor = contentResolver.query(uri,null,null,null,null);

        List<String> arrData = new ArrayList<>();
        while (cursor.moveToNext()){
            String name= cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            arrData.add("姓名:"+name+"---"+number);
        }
        cursor.close();

        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this,R.layout.list_item, arrData);
        mListView.setAdapter(arrayAdapter);
    }

参考 Android入门之增删改查通讯录 - 唔愛吃蘋果 - 博客园


http://www.kler.cn/news/362959.html

相关文章:

  • 计算机毕业设计hadoop+spark知识图谱中药推荐系统 中药材推荐系统 中药可视化 中药数据分析 中药爬虫 机器学习 深度学习 人工智能 大数据
  • vue3处理货名的拼接
  • 如何减小 Maven 项目生成的 JAR 包体积 提升运维效率
  • Docker 基础入门
  • raidrive 访问搭建的ftp服务报错超时的情况
  • 内核参数优化记录
  • 信息系统的分类
  • JavaScript进阶:手写代码挑战(一)
  • chat_gpt回答:python 复制xml文件
  • AI绘画教程分享:Stable Diffusion最新使用指南
  • 大括号块作用域的起源是什么?为什么整型数值用补码保存?char类型变量是存储为int类型大小吗?枚举为什么被当做整型?编程语言标识符为什么不能以数字开头?
  • Java最全面试题->Java基础面试题->JavaWeb面试题->Maven面试题
  • Cookie与Session详解与应用
  • LangGraph 源码分析 | 结构化输出
  • Umi UI报错:连接失败,请尝试重启dev服务
  • 从一个简单的计算问题,看国内几个大语言模型推理逻辑能力
  • 市面上什么台灯性价比高?五款超强实力护眼台灯测评推荐!
  • SVN小乌龟 create patch 和 apply patch 功能
  • 基于Multisim的水温控制电路设计与仿真
  • 51单片机应用——直流电机PWM调速
  • TikTok营销实用技巧与数据分析工具:视频洞察
  • konvajs -基础图形-标签-箭头,动画,学习笔记
  • GORM框架中的预加载功能Preload详解
  • Java智慧工地管理平台SaaS源码:打造安全、高效、绿色、智能的建筑施工新生态
  • 如何在PyCharm中安全地设置和使用API Key
  • 开源项目 - yolo v5 物体检测 手检测 深度学习