Android 选择联系人并返回手机号等信息(适配安卓11+)

Android 11 适配指南 Android11 适配 阅读详情

从Android 11开始,出于隐私考虑,Google已经限制了第三方应用程序访问电话号码 在 Android 10 中,可以通过查询ContactsContract.CommonDataKinds.Phone.NUMBER来获取电话号码。但是,从 Android 11 开始,该列始终返回空值。

  1. 先在 AndroidManifest.xml 文件中添加 READ_CONTACTS 权限。
<uses-permission android:name="android.permission.READ_CONTACTS" />
  1. 下面请求使用 ActivityResultLauncher API仅适用于 androidx.activity 和 androidx.fragment 包,如果项目中没有引入这两个库,先在 build.gradle 文件中添加以下依赖项:
dependencies {
    // ...
    implementation "androidx.activity:activity-ktx:1.3.1"
    implementation "androidx.fragment:fragment-ktx:1.3.6"
}
  1. 完整示例代码
class MyFragment : Fragment() {

    private val contactsPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
        if (isGranted) {
            selectContactLauncher.launch(null)
        }
    }

    private val selectContactLauncher = registerForActivityResult(ActivityResultContracts.PickContact()) { uri ->
        uri?.let {
            val contactName = getContactName(it)
            val phoneNumber = getContactPhoneNumber(it)
            if (contactName != null && phoneNumber != null) {
                Toast.makeText(requireContext(), "Contact selected: $contactName, phone number: $phoneNumber", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(requireContext(), "Failed to retrieve contact information", Toast.LENGTH_SHORT).show()
            }
        }
    }

    private fun getContactName(contactUri: Uri): String? {
        val cursor = requireActivity().contentResolver.query(contactUri, null, null, null, null)
        cursor?.use {
            if (it.moveToFirst()) {
                val nameIndex = it.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)
                return it.getString(nameIndex)
            }
        }
        return null
    }

private fun getContactPhoneNumber(contactUri: Uri?): String? {
    if (contactUri == null) {
        return null
    }
    val projection = arrayOf(ContactsContract.CommonDataKinds.Phone.NUMBER)
    val selection = "${ContactsContract.CommonDataKinds.Phone.CONTACT_ID} = ?"
    val selectionArgs = arrayOf(ContentUris.parseId(contactUri).toString())
    val cursor = requireActivity().contentResolver.query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        projection,
        selection,
        selectionArgs,
        null
    )
    cursor?.use {
        if (it.moveToFirst()) {
            val phoneNumberIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
            return it.getString(phoneNumberIndex)
        }
    }
    return null
}

    private fun requestContactsPermission() {
        if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
            selectContactLauncher.launch(null)
        } else {
            contactsPermissionLauncher.launch(Manifest.permission.READ_CONTACTS)
        }
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // ...
        // 当用户单击按钮时请求读取联系人的权限并选择一个联系人
        myButton.setOnClickListener {
            requestContactsPermission()
        }
        // ...
    }
}

多嘴一句 由于use函数实现“try-with-resources”语句,use函数会在代码块完成时自动关闭资源,所以不用手动释放cursor 资源了 :)


利用Android Lost通过互联网或短信远程控制安卓设备 阅读详情

相关推荐

Android选择联系人:实现选择联系人功能的编程指南

它允许用户从设备的联系人列表中选择一个或多个联系人,并在应用中使用所选联系人的信息。用户选择联系人后,选择结果将传递回MainActivity的onActivityResult方法中,您可以在该方法中处理所选联系人的数据。通过添加相应的权限声明、UI元素和事件处理逻辑,您可以轻松地在应用中实现选择联系人的功能。在上述代码中,我们为按钮添加了一个点击事件监听器,并在点击时启动一个选择联系人的Intent。然后,在与该布局文件对应的Activity中,我们将为选择联系人按钮添加点击事件处理逻辑。

2301_79326559的博客 414

Android中两种选择联系人方式

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

CruelLei的博客 1647

【Android进阶】15、隐式 intent:选择通讯录的联系人、发短信、打电话

在Android系统中,可利用隐式intent启动其他应用的activity。例如下文,我们会利用隐式intent打开联系人和短信:对于开发者来说,使用隐式intent利用其他应用完成常见任务,远比自己编写代码从头实现要容易得多。对于用户来说,他们也乐意在应用中调用自己熟悉或喜爱的应用。创建隐式intent之前,需完成以下准备工作:我们会在CrimeFragment布局中添加两个投诉用按钮:首先在 中添加字符串资源如下: 添加布局如下: 其布局效果如下:在 中添加一个属性,如下: 因为数据库表添加了一列

呆呆的猫的博客 1329

Android选择联系人区别

ContactsContract.CommonDataKinds.Phone.CONTENT_URI和ContactsContract.Contacts.CONTENT_URI都是Android中的内容URI,用于访问联系人数据。因此,如果你想要访问联系人的电话号码信息,你应该使用ContactsContract.CommonDataKinds.Phone.CONTENT_URI,如果你想要访问联系人的基本信息,你应该使用ContactsContract.Contacts.CONTENT_URI。

windowsxp2014的专栏 423

Android调用系统通讯录,选择联系人,拨打电话

1.Android调用系统通讯录 2.选择联系人 3.拨打电话 4.添加 查询联系人

【复现论文】Looking here or there? Gaze Following in 360-Degree Images

论文:Looking here or there?

RichardoMu的博客 1129

android如何读取sim卡联系人信息,Android上如何获取手机和sim卡的联系人信息

需求很明确,获取手机和sim的联系人信息。接口设计也很简介public interface OnFetchContactsListener {void onFetcherContactsComplete(List list);}数据设计为:public class ContactInfo extends BaseModel {private static final long serialVers...

weixin_40001805的博客 1734

图形引擎实战:镭射效果制作分享

该方案的优势1.遵循物理的2.可以使用少量的参数去调控镭射的效果。计算相对简单,缺点仍是颜色不能够自定义,还有一种常见的方案是采样一张镭射贴图来模拟,好处是颜色可以自定义同时性能上还很高效没有复杂的公式计算。我查阅了网上普遍的方案,常见的做法是制作一个Ramp图生成工具,然后将生成好的ramp图赋给材质。这两个方案的好处是美术同学可以手动的去控制镭射的颜色。最后就是Shader中对Ramp图的采样的部分,Ramp图的UV坐标是使用fresnel作为Ramp的U轴坐标,0.5作为V轴坐标。

qq_41166022的博客 1353

android 安卓APP获取手机设备信息和手机号码的代码示例

下面我从安卓开发的角度,简单写一下如何获取手机设备信息和手机号码 准备条件:一部安卓手机、手机SIM卡确保插入手机里、eclipse ADT和android-sdk开发环境 第一步:新建一个android工程(JinshanTest), 并需要在工程的AndroidManifest.xml文件中,添加权限 图例: 第二步:新建一个工具类PhoneInf

love android 7839

博途 V16(TIA portal V16)安装教程

本文提供了西门子TIA Portal V16软件的完整安装指南。内容包括百度网盘下载链接(提取码kv69)、详细安装步骤(关闭安全保护、典型安装设置)、授权破解方法,以及PLCSIM仿真功能的使用说明。重点演示了S7-1200 PLC程序的仿真过程,解析了仿真界面各元素功能,包括状态指示灯(RUN/STOP/ERROR)、操作按钮(RUN/STOP/MRES)和网络接口状态等。通过图文并茂的方式,完整呈现了从软件安装到PLC程序仿真的全流程操作。

lingchen1906的博客 6698

护网日志分析基础

简要介绍日志分析,给出日志分析的步骤和思路。要求根据日志中的字符串特征,识别攻击者的攻击工具;根据日志中的行为特征,确定攻击者可能的攻击手段等。总结归纳护网中常见的中间件Tomcat、Apache、Weblogic、Nginx、Apache、IIS、MySQL、SQL Server、Oracle的日志路径和日志配置文件路径等。

m0_59302403的博客 3698

Android 获取通讯录联系人,打开通讯录获取联系人信息;整个流程封装在基类中;

打开原生通讯录获取联系人姓名和手机号 1、获取通讯录权限: <!--访问通讯录--> <uses-permission android:name="android.permission.READ_CONTACTS"/> 2、6.0动态权限和打开通讯录: protected final int REQUEST_PERMISSION_ADDRESS...

Choi晨的博客 9333

Ubuntu\linux,加载mcp2515的驱动,链接mcp2515,mcp2515的这个驱动默认在linux内核中。jetson nao、香橙派、树莓派

3. 其他文章,还要进行驱动编译就比较复杂了(不推荐)1.树莓派+MCP2515+

pvmsmfchcs的博客 1563

android vcf iphone,如何将安卓手机上的联系人转移到iPhone上

在我们日常生活中,很多人都有两部手机,有时候就会遇到一部是安卓手机,一部是iPhone。那么如何将安卓手机上的联系人转移到iPhone上呢?而且,从Android手机过渡到iPhone可能是一个挑战 - 不同于从一个Android设备升级到另一个Android (或iPhone到另一个iPhone)。没有什么快捷的转移方式.但是它也不是特别困难, 。有一些方法可以将联系人从Android设备转移到...

weixin_35656458的博客 1328

Matlab基于PSO-MVMD粒子群算法优化多元变分模态分解

Matlab基于PSO-MVMD粒子群算法优化多元变分模态分解

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 517

基于 STM32 与压电薄膜的婴儿睡眠呼吸暂停监测床垫设计

本设计以 STM32F103C8T6 为主控,结合 PVDF 压电薄膜传感器,通过模拟信号调理与数字峰值检测算法,实现了对婴儿睡眠呼吸状态的实时监测。系统结构简单、成本低廉、无接触无束缚,当检测到 20 秒以上无呼吸信号时自动触发声光报警,可有效降低婴儿睡眠呼吸暂停带来的安全风险。后续可扩展蓝牙 / WiFi 模块,将报警信息推送至家长手机端,实现远程监护。

weixin_42300449的博客 149

android app 手机号码,android 安卓APP获取手机设备信息和手机号码的代码示例

下面我从安卓开发的角度,简单写一下如何获取手机设备信息和手机号码准备条件:一部安卓手机、手机SIM卡确保插入手机里、eclipse ADT和android-sdk开发环境第一步:新建一个android工程(JinshanTest), 并需要在工程的AndroidManifest.xml文件中,添加权限图例: 第二步:新建一个工具类PhoneInfo.java1.package com.jinsha...

weixin_29315091的博客 761

代谢组数据分析(十五):基于python语言构建PLS-DA分类预测模型

本教程阐述典型代谢组学数据分析工作流程,用于二元分类结果的研究。流程主要步骤如下:首先从 Excel 表格导入代谢物与实验数据,接着基于汇总 QC 进行数据清洗。随后借助主成分分析可视化检查数据质量,再开展两类单变量统计。之后运用偏最小二乘判别分析(PLS - DA)实施多变量分析,此过程涵盖模型优化(对比 R2 与 Q2)、置换测试及明确模型预测指标、确定特征重要性、对模型预测数据进行可视化。最终将统计表格导出至 Excel 表格,完整呈现从数据导入到分析结果输出的全过程。

专注生信领域 2875

Android 获取通话记录、联系人

文章目录1、简介2、代码结构3、activity_main.xml 布局文件4、AndroidManifest.xml 添加权限5、MainActivity .java 功能文件 1、简介 获取通话记录的信息 log 提示: 2、代码结构 1)mainActivity.java 功能文件 2)AndroidManifest.xml 添加相关权限 3)activity_main.xm...

Venus 的博客 2万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android中联系人以及ContactsContract类

1.加入读写权限 (1).  (2).  联系人信息Uri: content://com.android.contacts/contacts 联系人电话Uri: content://com.android.contacts/data/phones 联系人Email Uri: content://com.android.contacts/data/emails (推荐)

supercube2的专栏 5494

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[andorid]_[初级]_[修改手机通讯录联系人信息-联系人名称、手机号码、电子邮件、即时信息、地址、组织]]

场景:只能进行联系人已存在的信息中进行数据修改,适用于从外部导入数据对联系人进行修改。要对联系人进行操作,不要忘了加权限 在AndroidExample.xml文件中添加. //通过获取联系人ID来查找到相对应的联系人进行修改 //1 联系人名称 ArrayList ops =new ArrayList();

moqj_123的专栏 3097

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

钱差点没了,京东莫名解绑手机号并注册,难道安卓手机中了木马?期待大神解释

2020.11.24 一、中招 一直不相信安卓的安全性,有二台安卓手机。 一台手机是银行卡关联的号,只用来打电话收短信,用三星手机原厂系统,没有安装任何第三方APP,没有ROOT。 另外一台手机专门上网安装各种APP,华为荣耀手机,也没有ROOT,手机号是不用的。近期只安装了“麦克风扩音器”这个APP。 京东我没有进行任何手机从账户中解绑的操作,23日早上6点多收到京东邮件,提示手机被解除验证。 同一时间手机收到短信:“京东注册验证码XXXXXX”,没有其它的短信。--即有骗子在注册我的手机号 8点多

wxlfreewind的专栏 2028

4种方法在电脑上查看安卓短信

乍一看,在电脑上查看安卓设备中的所有短信似乎颇具挑战。然而,实际上,只要使用合适的方法,以这种方式检查和管理短信就变得非常简单。拥有最便捷的工具——iReaShare Android Manager,凭借其稳定的性能,轻松完成任务如今尽在掌握。

Digitally的博客 2653

安卓调用手机通讯录选择联系人

项目需求是从手机通讯录中选择联系人姓名、手机号返回,尝试很多方法未果,终于成功,特此备份。   调起通讯录的方法: Intent jumpIntent = new Intent(Intent.ACTION_PICK); //从有电话号码的联系人中选取 jumpIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE...

muyang_1的博客 3648

Android 一个方法,拿到手机联系人(附:手机号正则判断)

有需要的直接拿去用, 方法: /* *作者:赵星海 *时间:18/06/28 16:40 *用途: 获取手机联系人 */ private ArrayList&lt;Bean_Contacts&gt; getContacts() { ArrayList&lt;Bean_Contacts&gt; list = new ArrayL...

赵星海 911
上一篇: Kotlin 协程基础入门:协程的上下文 Context (万物皆为Context)
下一篇: cannot access an invalid/free’d bitmap here!
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值