安卓读取,添加,更新,删除联系人,读取短信
目录
读取联系人
添加联系人
更新联系人
删除联系人
读取短信
读取联系人
安卓可以通过contentResolver来读取联系人表,联系人表的Uri信息是:content://com.android.contacts/data/phones 从而输出联系人信息,
需要相关权限:
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
具体代码如下:
//需要读联系人权限READ_CONTACTS@SuppressLint("Range")private fun getContact() {//查询raw_contacts表获得联系人val resolver = contentResolverval uri = Uri.parse("content://com.android.contacts/data/phones")//查询联系人val cursor = resolver.query(uri, null, null, null, null)while (cursor!!.moveToNext()) {val name =cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))val number =cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))Log.d(TAG, "联系人:${name}")Log.d(TAG, "电话:${number}")}cursor.close()}
输出结构如下:
//2023-08-06 17:29:50.535 31719-31719 MainActivity2 com.example.myapplication D 联系人:张三 //2023-08-06 17:29:50.535 31719-31719 MainActivity2 com.example.myapplication D 电话:1 (883) 22 //2023-08-06 17:29:50.535 31719-31719 MainActivity2 com.example.myapplication D 联系人:si li //2023-08-06 17:29:50.535 31719-31719 MainActivity2 com.example.myapplication D 电话:10020 //2023-08-06 17:29:50.535 31719-31719 MainActivity2 com.example.myapplication D 联系人:bo xiao //2023-08-06 17:29:50.535 31719-31719 MainActivity2 com.example.myapplication D 电话:10086
添加联系人
同理,使用contentResolver。需要写联系人权限
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
具体代码如下:
private fun insertContact() {val resolver = contentResolverval values = ContentValues()//向raw_contacts表插入空数据,拿到urival uri = resolver.insert(ContactsContract.RawContacts.CONTENT_URI,values)//拿到表idval id = uri?.let { ContentUris.parseId(it) }//插入姓名values.clear()//put idvalues.put(ContactsContract.Data.RAW_CONTACT_ID,id)//put typevalues.put(ContactsContract.Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE)//put 值values.put(StructuredName.GIVEN_NAME,"xiaohong")resolver.insert(ContactsContract.Data.CONTENT_URI,values)//插入手机号values.clear()//put idvalues.put(ContactsContract.Data.RAW_CONTACT_ID,id)//put typevalues.put(ContactsContract.Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE)//put 值values.put(Phone.NUMBER,"15541383234")values.put(Phone.TYPE,Phone.TYPE_MOBILE)resolver.insert(ContactsContract.Data.CONTENT_URI,values)//插入邮箱values.clear()//put idvalues.put(ContactsContract.Data.RAW_CONTACT_ID,id)//put typevalues.put(ContactsContract.Data.MIMETYPE,Email.CONTENT_ITEM_TYPE)//put 值values.put(Email.DATA,"163@qq.com")values.put(Email.TYPE,Email.TYPE_WORK)resolver.insert(ContactsContract.Data.CONTENT_URI,values)}
运行结果如下:

更新联系人
这里我们是根据手机号码先获取联系人表id,也仅有这种方式,获取id
@SuppressLint("Range")private fun getContactByPhone(phone: Long): String? {val resolver = contentResolverval uri = Uri.parse("content://com.android.contacts/data/phones/filter/$phone")val cursor= resolver.query(uri, arrayOf(ContactsContract.Data.CONTACT_ID),null,null,null)return if (cursor!!.moveToNext()){val id = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.CONTACT_ID))cursor.close()id}else{null}}
拿到ContactId后,去更新数据
//根据手机号更新@SuppressLint("SuspiciousIndentation")private fun updateContact() {val id = getContactByPhone(15541383234)if(id!=null){val values = ContentValues()val resolver = contentResolvervalues.put(ContactsContract.Data.MIMETYPE,CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)values.put(CommonDataKinds.StructuredName.GIVEN_NAME,"xiaohong_update")resolver.update(ContactsContract.Data.CONTENT_URI, values,"${ContactsContract.Data.CONTACT_ID}=?",arrayOf(id))}}
删除联系人
删除联系人,比较简单,我们可以通过联系人名字,删除
private fun deteleContact() {val resolver = contentResolver//根据联系人删除val ret = resolver.delete(RawContacts.CONTENT_URI, CommonDataKinds.Phone.DISPLAY_NAME+"=?",arrayOf("si li"))if(ret > 0){Toast.makeText(this, "删除成功", Toast.LENGTH_LONG).show()}}
也可以根据联系人手机号删除,具体代码如下:
private fun deteleContact() {val resolver = contentResolver//根据手机号删除val id = getContactByPhone(10020)val ret = resolver.delete(RawContacts.CONTENT_URI, CommonDataKinds.Phone.CONTACT_ID+"=?",arrayOf(id))if(ret > 0){Toast.makeText(this, "删除成功", Toast.LENGTH_LONG).show()}}
读取短信
除此,我们还可以通过contentResolver读取短信信息,短信表的uri信息content://sms/
用途比如验证码快捷输入,像ios短信验证码快速copy到输入框。
下面看看任何实现
第一,读取短信信息,需要权限:
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>
具体代码如下;
private fun getMsgs() {val uri = Uri.parse("content://sms/")val resolver = contentResolverval cursor =resolver.query(uri, arrayOf("address","date","type","body"),null,null,null)while (cursor!!.moveToNext()){val address = cursor.getString(0)val date = cursor.getString(1)val type = cursor.getString(2)val body = cursor.getString(3)Log.d(TAG,"address:${address},date:${date},type:${type},body:${body}")}cursor.close()}
下面是一些表的uri信息:

相关文章:
安卓读取,添加,更新,删除联系人,读取短信
目录 读取联系人 添加联系人 更新联系人 删除联系人 读取短信 读取联系人 安卓可以通过contentResolver来读取联系人表,联系人表的Uri信息是:content://com.android.contacts/data/phones 从而输出联系人信息, 需要相关权限:…...
Practices6|69. x 的平方根、(哈希表)205. 同构字符串、(哈希表)1002. 查找共用字符
69. x 的平方根 1.题目: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.…...
Qt扫盲-Model/View入门
Model/View 编程入门 一、概述二、介绍1. 标准部件2. Model/View 控件3. Model/View控件概述4. 在表格单和 model 之间使用适配器 Adapters 三、 简单的 model / view 应用程序示例1. 一个只读表2. 使用role扩展只读示例3. 表格单元中的时钟4. 为列和行设置标题5. 最小编辑示例…...
关于win11 debian wsl 子系统安装启动docker一直starting,无法启动
首先我先说明,我的步骤都是按照官网步骤来的 通过官网的操作步骤 通过测试命令 sudo docker run hello-world得到下面的命令,我们通过启动命令 sudo service docker start 执行结果如下图 也就是说无法启动,一直显示在启动中 遇到这种情况…...
Nginx反向代理配置+负载均衡集群部署
文章目录 负载均衡反向代理基础环境部署:什么是代理实验环境图流量过程 环境部署准备两台Web服务器安装Nginx准备页面内容添加主机名 代理服务器配置 修改windos hosts文件测试:终端浏览器 负载均衡反向代理基础环境部署: 什么是代理 正向代…...
设计模式行为型——迭代器模式
什么是迭代器模式 迭代器模式(Iterator Pattern)属于行为型模式,其提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示,即不需要知道集合对象的底层表示。编程环境中非常常用的设计模式。 迭代…...
K8s持久化存储(nfs网络存储)
数据卷 emptydir,是本地存储,pod重启,数据就不存在了,需要对数据持久化存储 1.nfs,网络存储 ,pod重启,数据还存在的...
常规VUE项目优化实践,跟着做就对了!
总结: 主要优化方式: imagemin优化打包大小(96M->50M),但是以打包速度为代价,通过在构建过程中压缩图片来实现,可根据需求开启。字体压缩:目前项目内引用为思源字体,…...
PLL 的 verilog 实现
锁相环(PLL)是一种常用的频率、相位追踪算法,在信号解调、交流并网等领域有着广泛的应用。本文对全数字锁相环的原理进行介绍,随后给出 verilog 实现及仿真。 PLL 锁相原理 锁相环结构如下图所示,主要由鉴相器、环路滤…...
【Hystrix技术指南】(1)基本使用和配置说明
这世间许多事物皆因相信而存在,所以人们亲手捏出了泥菩萨,却选择坚定的去信仰它。 分布式系统的规模和复杂度不断增加,随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中,【熔断、隔离、降级、限流】是经常被…...
Oracle EBS OM客制化调用API创建销售订单非常慢(FND_FLEX_HASH死锁)
业务场景 由于Oracle EBS标准功的公司间关联交易操作涉及业务节点环节多,需要多个业务部门参考操作完成,浪费人力和花费时间。随着国内集团公司通过业务整合优化,大幅度减少间中很多环节的人为操作,如国内公司间贸易通过类似于客制化出货单申请方式,跨国公司间贸易通过类似…...
【leetcode】394. 字符串解码
题目链接:力扣 给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的;输入字符串中没…...
系统架构设计高级技能 · 系统质量属性与架构评估(二)【系统架构设计师】
系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估(二)【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…...
魅族Pandaer手机壳
Pandaer的设计真是非常好看啊!像是手机壳的花样就特别多,还分出来很多系列,我比较喜欢它的亮面设计,入手了一款iPhone的,花色叫做“失控街头”,壳内部也是亮的,看起来特别浮夸,潮里潮…...
F5洞察2023年网络威胁,助力网络安全防护
2023已经过半,关于网络安全防护的相关讨论话题热度始终居高不下。对于网络安全领域的从业者来说,应当对相关的前瞻分析有所了解。前段时间,我阅读了F5 安全运营中心工程师对威胁网络安全的预测,深受启发,故此选取了几则…...
从零构建深度学习推理框架-4 框架中的算子注册机制
今天要讲的这一注册机制用到了设计模式中的工厂模式和单例模式,所以这节课也是对两大设计模式的一个合理应用和实践。KuiperInfer的注册表是一个map数据结构,维护了一组键值对,key是对应的OpType,用来查找对应的value,…...
使用vscode+ssh免密远程Linux
使用vscodessh免密远程Linux 使用 SSH 密钥对:使用 SSH Agent:ssh-agent的使用场景 使用 SSH 密钥对: 确保你的本地机器上已经生成了 SSH 密钥对。如果没有,请使用以下命令生成密钥对: ssh-keygen -t rsa这将在 ~/.ssh…...
rust-异步学习
rust获取future中的结果 两种主要的方法使用 async: async fn 和 async 块 async 体以及其他 future 类型是惰性的:除非它们运行起来,否则它们什么都不做。 运行 Future 最常见的方法是 .await 它。 当 .await 在 Future 上调用时,它会尝试把…...
【Azure】office365邮箱测试的邮箱账号因频繁连接邮箱服务器而被限制连接 引起邮箱显示异常
azure微软office365邮箱会对频繁连接自身邮箱服务器的IP地址进行,连接邮箱服务器IP限制,也就是黑名单,释放时间不确定,但至少一天及以上。 解决办法,换一个IP,或者新注册一个office365邮箱再重试。 以下是…...
重新登录成功和登录失败处理器
<template><div class="login"><el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form"><h3 class="title">Java1234 Vue3 后台管理系统</h3><el…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
