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

安卓读取,添加,更新,删除联系人,读取短信

目录

读取联系人

添加联系人

更新联系人

删除联系人

读取短信


读取联系人

安卓可以通过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来读取联系人表&#xff0c;联系人表的Uri信息是&#xff1a;content://com.android.contacts/data/phones 从而输出联系人信息&#xff0c; 需要相关权限&#xff1a…...

Practices6|69. x 的平方根、(哈希表)205. 同构字符串、(哈希表)1002. 查找共用字符

69. x 的平方根 1.题目&#xff1a; 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 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,无法启动

首先我先说明&#xff0c;我的步骤都是按照官网步骤来的 通过官网的操作步骤 通过测试命令 sudo docker run hello-world得到下面的命令&#xff0c;我们通过启动命令 sudo service docker start 执行结果如下图 也就是说无法启动&#xff0c;一直显示在启动中 遇到这种情况…...

Nginx反向代理配置+负载均衡集群部署

文章目录 负载均衡反向代理基础环境部署&#xff1a;什么是代理实验环境图流量过程 环境部署准备两台Web服务器安装Nginx准备页面内容添加主机名 代理服务器配置 修改windos hosts文件测试&#xff1a;终端浏览器 负载均衡反向代理基础环境部署&#xff1a; 什么是代理 正向代…...

设计模式行为型——迭代器模式

什么是迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;属于行为型模式&#xff0c;其提供一种方法顺序访问一个聚合对象中的各种元素&#xff0c;而又不暴露该对象的内部表示&#xff0c;即不需要知道集合对象的底层表示。编程环境中非常常用的设计模式。 迭代…...

K8s持久化存储(nfs网络存储)

数据卷 emptydir&#xff0c;是本地存储&#xff0c;pod重启&#xff0c;数据就不存在了&#xff0c;需要对数据持久化存储 1.nfs&#xff0c;网络存储 &#xff0c;pod重启&#xff0c;数据还存在的...

常规VUE项目优化实践,跟着做就对了!

总结&#xff1a; 主要优化方式&#xff1a; imagemin优化打包大小&#xff08;96M->50M&#xff09;&#xff0c;但是以打包速度为代价&#xff0c;通过在构建过程中压缩图片来实现&#xff0c;可根据需求开启。字体压缩&#xff1a;目前项目内引用为思源字体&#xff0c…...

PLL 的 verilog 实现

锁相环&#xff08;PLL&#xff09;是一种常用的频率、相位追踪算法&#xff0c;在信号解调、交流并网等领域有着广泛的应用。本文对全数字锁相环的原理进行介绍&#xff0c;随后给出 verilog 实现及仿真。 PLL 锁相原理 锁相环结构如下图所示&#xff0c;主要由鉴相器、环路滤…...

【Hystrix技术指南】(1)基本使用和配置说明

这世间许多事物皆因相信而存在&#xff0c;所以人们亲手捏出了泥菩萨&#xff0c;却选择坚定的去信仰它。 分布式系统的规模和复杂度不断增加&#xff0c;随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中&#xff0c;【熔断、隔离、降级、限流】是经常被…...

Oracle EBS OM客制化调用API创建销售订单非常慢(FND_FLEX_HASH死锁)

业务场景 由于Oracle EBS标准功的公司间关联交易操作涉及业务节点环节多,需要多个业务部门参考操作完成,浪费人力和花费时间。随着国内集团公司通过业务整合优化,大幅度减少间中很多环节的人为操作,如国内公司间贸易通过类似于客制化出货单申请方式,跨国公司间贸易通过类似…...

【leetcode】394. 字符串解码

题目链接&#xff1a;力扣 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]&#xff0c;表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的&#xff1b;输入字符串中没…...

系统架构设计高级技能 · 系统质量属性与架构评估(二)【系统架构设计师】

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…...

魅族Pandaer手机壳

Pandaer的设计真是非常好看啊&#xff01;像是手机壳的花样就特别多&#xff0c;还分出来很多系列&#xff0c;我比较喜欢它的亮面设计&#xff0c;入手了一款iPhone的&#xff0c;花色叫做“失控街头”&#xff0c;壳内部也是亮的&#xff0c;看起来特别浮夸&#xff0c;潮里潮…...

F5洞察2023年网络威胁,助力网络安全防护

2023已经过半&#xff0c;关于网络安全防护的相关讨论话题热度始终居高不下。对于网络安全领域的从业者来说&#xff0c;应当对相关的前瞻分析有所了解。前段时间&#xff0c;我阅读了F5 安全运营中心工程师对威胁网络安全的预测&#xff0c;深受启发&#xff0c;故此选取了几则…...

从零构建深度学习推理框架-4 框架中的算子注册机制

今天要讲的这一注册机制用到了设计模式中的工厂模式和单例模式&#xff0c;所以这节课也是对两大设计模式的一个合理应用和实践。KuiperInfer的注册表是一个map数据结构&#xff0c;维护了一组键值对&#xff0c;key是对应的OpType&#xff0c;用来查找对应的value&#xff0c;…...

使用vscode+ssh免密远程Linux

使用vscodessh免密远程Linux 使用 SSH 密钥对&#xff1a;使用 SSH Agent&#xff1a;ssh-agent的使用场景 使用 SSH 密钥对&#xff1a; 确保你的本地机器上已经生成了 SSH 密钥对。如果没有&#xff0c;请使用以下命令生成密钥对&#xff1a; ssh-keygen -t rsa这将在 ~/.ssh…...

rust-异步学习

rust获取future中的结果 两种主要的方法使用 async: async fn 和 async 块 async 体以及其他 future 类型是惰性的&#xff1a;除非它们运行起来&#xff0c;否则它们什么都不做。 运行 Future 最常见的方法是 .await 它。 当 .await 在 Future 上调用时&#xff0c;它会尝试把…...

【Azure】office365邮箱测试的邮箱账号因频繁连接邮箱服务器而被限制连接 引起邮箱显示异常

azure微软office365邮箱会对频繁连接自身邮箱服务器的IP地址进行&#xff0c;连接邮箱服务器IP限制&#xff0c;也就是黑名单&#xff0c;释放时间不确定&#xff0c;但至少一天及以上。 解决办法&#xff0c;换一个IP&#xff0c;或者新注册一个office365邮箱再重试。 以下是…...

重新登录成功和登录失败处理器

<template><div class="login"><el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form"><h3 class="title">Java1234 Vue3 后台管理系统</h3><el…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...