Android中两种选择联系人方式

1.在选择联系人方式网上也有很多案例 有的说是使用ContactsContract.CommonDataKinds.Phone.CONTENT_URI也有的说是使用ContactsContract.Contacts.CONTENT_URI其实这两种方式都可以使用 只不过ContactsContract.Contacts.CONTENT_URI这种方式需要多查询一遍

一、使用ContactsContract.CommonDataKinds.Phone.CONTENT_URI跳转到选择联系人

//跳转到选择联系人界面
 private fun openLinkman() {
        val intent = Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI)
        linkmanResultLauncher.launch(intent)
    }

//联系人回调
 private val linkmanResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == RESULT_OK) {
                val contactUri: Uri = result.data?.data ?: return@registerForActivityResult
                val projection: Array<String> = arrayOf(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER)
                contentResolver.query(contactUri, projection, null, null, null).use { cursor ->
                    if (cursor != null && cursor.moveToFirst()) {
                        val nameIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)
                        val displayName = cursor.getString(nameIndex)
                        val phoneIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
                        val phoneNumber = cursor.getString(phoneIndex)
                        Log.e(TAG, "姓名:$displayName 手机号:$phoneNumber  count:${cursor.count}")
                    }
                }
            }
        }

这里把openLinkman方法改成这样也是一样的

private fun openLinkman() {
     val intent = Intent(Intent.ACTION_PICK)
     intent.type = ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE
     linkmanResultLauncher.launch(intent)
}

展示效果

请添加图片描述请添加图片描述

二、使用ContactsContract.Contacts.CONTENT_URI跳转到选择联系人

private fun openLinkman() {
     val intent = Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI)
     linkmanResultLauncher2.launch(intent)
}

//联系人回调
    private val linkmanResultLauncher2 = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == RESULT_OK) {
                val contactUri: Uri = result.data?.data ?: return@registerForActivityResult
                contentResolver.query(contactUri, null, null, null, null)?.use {cursor->
                    if (cursor.moveToNext()){
                        val nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)
                        //获取联系人姓名
                        val displayName = cursor.getString(nameIndex)
                        var phoneNumber = ""
                        //获取id
                        val idIndex = cursor.getColumnIndex(ContactsContract.Contacts._ID)
                        val id = cursor.getString(idIndex)
                        //判断是否有手机号
                        val hasPhoneIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER)
                        val hasPhone = cursor.getString(hasPhoneIndex) //等于1就是有手机号
                        if(hasPhone == "1"){
                            //重新查询手机号
                            contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,"${ContactsContract.CommonDataKinds.Phone.CONTACT_ID} = $id",null,null)?.use { phonesCursor->
                                while (phonesCursor.moveToNext()){
                                    val phoneIndex = phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
                                    phoneNumber = phonesCursor.getString(phoneIndex)
                                }
                            }
                        }
                        Log.e(TAG, "姓名:$displayName  手机号:$phoneNumber")
                    }
                }
            }
        }

展示效果

在这里插入图片描述

在这里插入图片描述

两则的区别

 1. 第一种联系人和姓名展示出来了 
 2. 第二种只展示一个姓名  手机号又重新查询返回的 这种一个人又多个手机号的不能单独选择代码中是当前联系人的最后一个号码

这两种方式看需求使用就好了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/310933.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

矿山无人驾驶方案

矿山无人驾驶运输系统&#xff0c;可实现露天矿采煤装载运输的无人化&#xff0c;满足智能矿山安全、高效、绿色、环保等目标。 无人驾驶应用的总体技术架构包括“车端、场端、云端”三个层面以及相应的安全保障体系&#xff0c;其中车端的智能矿卡具备车辆感知、通信、决策和执…

[NOIP2006 提高组] 作业调度方案(修改)

题目&#xff1a; 这里对于之前的题目进行修改记录。果然还是受不了等待&#xff0c;利用晚饭时间又看了这个题目。于是发现了问题。 之前的博客&#xff1a;https://blog.csdn.net/KLSZM/article/details/135522867?spm1001.2014.3001.5501 问题修改描述 上午书写的代码中是…

Mongodb Replica Sets 副本集群搭建

Replica Sets 复制集搭建 MongoDB 有三种集群架构模式&#xff0c;分别为主从复制&#xff08;Master-Slaver&#xff09;、副本集&#xff08;Replica Set&#xff09;和分片&#xff08;Sharding&#xff09;模式。 Master-Slaver 是一种主从复制的模式&#xff0c;目前已经…

Spring MVC 的RequestMapping注解

RequestMapping注解 使用说明 作用&#xff1a;用于建立请求URL和处理请求方法之间的对应关系。 出现位置&#xff1a; 类上&#xff1a; 请求 URL的第一级访问目录。此处不写的话&#xff0c;就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的 URL 可以…

解决:TypeError: ‘dict_keys’ object does not support indexing

解决&#xff1a;TypeError: ‘dict_keys’ object does not support indexing 文章目录 解决&#xff1a;TypeError: dict_keys object does not support indexing背景报错问题报错翻译报错位置代码报错原因解决方法方法一&#xff1a;方法二&#xff1a;方法三&#xff1a;今…

CES2024:智能戒指、全息技术、AI家居机器人等有趣的小工具

在CES2024的展会上上&#xff0c;我们见证了一系列充满创意和未来感的科技产品。从智能戒指到全息技术&#xff0c;再到AI家居机器人&#xff0c;这些有趣的小工具不仅展现了技术的进步&#xff0c;更预示着未来生活的可能性。现在就来给大家介绍九个实用有趣的小工具。 1、华…

单因素方差分析--R

任务说明 三个剂量水平的药物处理受试者&#xff0c;每个剂量水平十个受试者&#xff0c;现在收集到数据后&#xff0c;问&#xff1a; 药物剂量水平显著影响受试者的response&#xff1f; 或者不同剂量药物处理受试者有显著效果的差异吗&#xff1f; 数据 library(tidyvers…

stable diffusion代码学习笔记

前言&#xff1a;本文没有太多公式推理&#xff0c;只有一些简单的公式&#xff0c;以及公式和代码的对应关系。本文仅做个人学习笔记&#xff0c;如有理解错误的地方&#xff0c;请指出。 资源 本文学习的代码&#xff1b;相关文献&#xff1a; Denoising Diffusion Probab…

Linux学习之网络编程1(纯理论)

写在前面 刚刚更新完Linux系统编程&#xff0c;特别推荐大家去看的Linux系统编程&#xff0c;总共44个小时&#xff0c;老师讲的非常好&#xff0c;我是十天肝完的&#xff0c;每天大概看20集&#xff0c;每天还要以写blog的形式来写笔记来总结一下&#xff0c;虽然这十天有点…

ubuntu18.04 TensorRT 部署 yolov5-7.0推理

文章目录 1、环境配置2、推理部分2.1、检测2.2、分类2.3、分割2.4、INT8 量化 1、环境配置 链接: TensorRT cuda环境安装 2、推理部分 下载yolov5对应版本的包 https://github.com/wang-xinyu/tensorrtx/tree/master/yolov5 2.1、检测 1、源码模型下载 git clone -b v7.0 …

Python—使用LangCahin调用千帆大模型

文章目录 前言一、安装LangChain二、获取千帆API Key、Secret Key三、简单对话案例实现四、构建语言模型应用程序:LLM1.初始化模型2.LLM初始化和调用 五、提示词模板&#xff08;PromptTemplate&#xff09;: 管理 LLM 的提示1.定义提示模板2.组合 LLM 和提示词3.组合输出解析器…

浮动差价这么受欢迎Anzo Capital找了1个理由

在交易市场中&#xff0c;浮动差价是如今最常见的差价类型&#xff0c;也是最受欢迎的的差价类型。Anzo Capital认为它受欢迎的理由只有一条&#xff0c;那就是因为它对参与交易的各方都有利可图。 不仅是交易者本身&#xff0c;就连经纪人和交易商这三者都可以同时受益&…

Apipost接口自动化测试如何操作

Apipost提供可视化的API自动化测试功能&#xff0c;使用Apipost研发人员可以设计、调试接口&#xff0c;测试人员可以基于同一数据源进行测试&#xff0c;Apipost 接口自动化功能在上次更新中进行了逻辑调整&#xff0c;带来更好的交互操作、更多的控制器选择&#xff0c;同时新…

【python】内存管理和数据类型问题

一、内存管理 Python有一个自动内存管理机制&#xff0c;但它并不总是按照期望的方式工作。例如&#xff0c;如果创建了一个大的列表或字典&#xff0c;并且没有删除它&#xff0c;那么这个对象就会一直占用内存&#xff0c;直到Python的垃圾回收器决定清理它。为了避免这种情…

记录仪可作为XCP从站进行数据转发

车辆数据采集系统通常包含多种数据采集设备、多路总线或传感器信号&#xff0c;为了集中监控和管理&#xff0c;需要将这些设备的实时数据传输到上位机。对此&#xff0c;我们将使用基于XCP&#xff08;Universal Measurement and Calibration Protocol&#xff09;协议的数据记…

redis复习笔记03(小滴课堂)

Redis6常见数据结构概览 0代表存在&#xff0c;1代表不存在。 1表示删除成功&#xff0c;0表示失败。 查看类型&#xff0c;默认string类型。 也可以设置set类型。 list类型。 查看key的过期时间&#xff1a; Redis6数据结构之String类型介绍和应用场景 批量设置&#xff1a; …

期待!《数字化运维路线图》震撼发布(第一部分)

在时代的激流中&#xff0c;数字化浪潮奔涌而至&#xff0c;机遇与挑战在此交汇。各行业正步入持续变革阶段&#xff0c;一场技术的竞争与博弈正拉开帷幕。科技革命与产业变革如同疾风骤雨&#xff0c;加速进行&#xff0c;市场格局在不断重塑。各类因素叠加之下&#xff0c;一…

搜维尔科技:【简报】元宇宙数字人赛道,《全息影像技术应用》!

期待着看展的主角来到今天要参观的全息影像展&#xff0c;平时就喜欢看展的她对于所谓的全息影像非常好奇&#xff0c;于是她带着期待的心情进入展内。进入展内的主角看到的是与之前完全不同的画展&#xff0c;每幅画看起来就像真的一样&#xff0c;充满好奇的她在展览的各处游…

千问写作——论文写作

【千问写作】 千问写作是运用通义千问720亿参数的语言模型&#xff08;qwen-72b-chat&#xff09;进行基于目录的论文创作&#xff0c;通过python-docx设置文档格式然后写出文档 &#xff0c;其他免费模型&#xff08;qwen-1.8b-chat&#xff09;暂时无法生成目录 1. 请求延时 …

怎么做UI自动化测试?不会代码也可以?

UI自动化测试已经成为现代软件开发过程中不可或缺的一部分。它能够提供诸多优势&#xff0c;包括提高测试效率、减少人力成本、提升软件质量等。同时&#xff0c;可视化工具为UI自动化测试带来了更多便利和灵活性。然而&#xff0c;可视化工具也存在一些潜在的劣势。本文将探讨…