安卓读取,添加,更新,删除联系人,读取短信
目录
读取联系人
添加联系人
更新联系人
删除联系人
读取短信
读取联系人
安卓可以通过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…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...