首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从Android通讯录中获取名字和姓氏?

从Android通讯录中获取名字和姓氏,可以通过ContentResolver查询ContactsContract.Contacts表来实现。以下是具体的步骤和示例代码:

基础概念

  • ContentResolver:用于访问内容模型,如联系人、媒体文件等。
  • ContactsContract.Contacts:包含联系人信息的表。
  • ContactsContract.CommonDataKinds.Phone:包含电话号码信息的表。

优势

  • 权限控制:Android系统对通讯录访问有严格的权限控制,确保用户隐私安全。
  • 灵活性:可以获取多种联系人信息,不仅仅是名字和姓氏。

类型

  • 系统联系人:设备内置的联系人。
  • 第三方应用联系人:通过第三方应用添加的联系人。

应用场景

  • 社交应用:需要获取用户联系人信息进行好友推荐或消息推送。
  • 通讯录备份:将联系人信息备份到云端或其他设备。

示例代码

代码语言:txt
复制
import android.Manifest;
import android.content.ContentResolver;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_READ_CONTACTS = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_READ_CONTACTS);
        } else {
            readContacts();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_READ_CONTACTS) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                readContacts();
            }
        }
    }

    private void readContacts() {
        ContentResolver contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

        if (cursor != null && cursor.moveToFirst()) {
            do {
                String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                String firstName = "";
                String lastName = "";

                Cursor phoneCursor = contentResolver.query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
                        new String[]{cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID))},
                        null);

                if (phoneCursor != null && phoneCursor.moveToFirst()) {
                    do {
                        String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        // 这里可以根据需要处理电话号码
                    } while (phoneCursor.moveToNext());
                    phoneCursor.close();
                }

                String[] nameParts = displayName.split(" ");
                if (nameParts.length > 0) {
                    firstName = nameParts[0];
                }
                if (nameParts.length > 1) {
                    lastName = nameParts[nameParts.length - 1];
                }

                System.out.println("First Name: " + firstName);
                System.out.println("Last Name: " + lastName);

            } while (cursor.moveToNext());
            cursor.close();
        }
    }
}

参考链接

常见问题及解决方法

  1. 权限问题:确保在AndroidManifest.xml中声明了READ_CONTACTS权限,并在运行时请求权限。
  2. 权限问题:确保在AndroidManifest.xml中声明了READ_CONTACTS权限,并在运行时请求权限。
  3. Cursor为空:确保设备中有联系人数据,或者检查查询条件是否正确。
  4. 性能问题:如果联系人数量较多,可以考虑分页查询或异步处理。

通过以上步骤和代码示例,你可以从Android通讯录中获取名字和姓氏,并进行相应的处理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何通过反射获取属性的名字属性类型

显然我们事先不知道要查哪个表,泛型dao的基本要求就是对所有的表都适用,这就需要我们动态的获取表名,基本思想可以是方法传入一个类(前提是数据库的表实体类都是一一对应的)的实例,通过反射获取这个实体类的属性名属性类型...,这就用到了java反射这个特性。...反射是java中一个很重要的特性,在不知道类中信息的时候,利用反射我们可以获取到类中所有的信息,例如属性名,属性类型,方法名,还可以执行类的方法,很强大的,在框架中大多数也是采用反射获取的信息。...以前的知识只是知道反射可以破坏单例(因为反射可以获取到类的所有信息,构造方法也不例外),但是现实没有哪个程序员写完了单例模式,在用反射来破坏单例吧…… 在说反射前先说一个在反射中很重要的类Class...,包括权限修饰符,属性类型,属性名,这里的String是java.lang.String,属性名属性类型后面可以利用字符串截取获得实际想要的数据。

3.7K20

如何列表获取元素

有两种方法可用于列表获取元素,这涉及到两个命令,分别是lindexlassign。...该命令接收两个参数:列表变量名索引号。例如: ? 方法2:lassign 上述操作可以通过lassign快速完成。...lassign接收至少两个变量,第一个是列表变量,第二个是其他变量,也就是将列表的元素分配给这些变量。例如: ? 可以看到此时lassign比lindex要快捷很多。...情形1:列表元素的个数比待分配变量个数多 例如,上例只保留待分配变量xy,可以看到lassign会返回一个值c,这个值其实就是列表未分发的元素。而变量xy的值与上例保持一致。 ?...思考一下: 如何用foreach语句实现对变量赋值,其中所需值来自于一个给定的列表。

17.3K20
  • 如何使用AndroidQF快速Android设备获取安全取证信息

    关于AndroidQF AndroidQF,全称为Android快速取证(Android Quick Forensics)工具,这是一款便携式工具,可以帮助广大研究人员快速目标Android设备获取相关的信息安全取证数据...AndroidQF旨在给广大研究人员提供一个简单且可移植的跨平台实用程序,以快速Android设备获取信息安全取证数据。...工具下载 广大研究人员可以直接访问该项目的【Releases页面】下载获取最新版本的AndroidQF。...APK文件,或没有被标记为系统APP的所有APK文件; · “dumpsys” Shell命令的执行输出,可以提供设备相关的诊断信息; · “getprop” Shell命令的执行输出,可以提供构建信息配置参数...除此之外,我们还可以考虑让AndroidQF在一个VeraCrypt容器运行。

    7.1K30

    Spring 如何 IoC 容器获取对象?

    前情回顾 前面几篇文章主要分析了 Spring IoC 容器如何初始化,以及解析注册我们定义的 bean 信息。...其中,「Spring 的 IoC 容器」对 Spring 的容器做了一个概述,「Spring IoC 容器初始化」「Spring IoC 容器初始化(2)」分析了 Spring 如何初始化 IoC...IoC 容器已经建立,而且把我们定义的 bean 信息放入了容器,那么如何从容器获取对象呢? 本文继续分析。 配置及测试代码 为便于查看,这里再贴一下 bean 配置文件测试代码。...当从容器获取 bean 对象时,首先从缓存获取。如果缓存存在,处理 FactoryBean 的场景。...本文先从整体上分析了如何 Spring IoC 容器获取 bean 对象,内容不多,后文再详细分解吧。

    9.7K20

    如何使用DNSSQLi数据库获取数据样本

    泄露数据的方法有许多,但你是否知道可以使用DNSSQLi数据库获取数据样本?本文我将为大家介绍一些利用SQL盲注DB服务器枚举泄露数据的技术。...我尝试使用SQLmap进行一些额外的枚举泄露,但由于SQLmap header的原因WAF阻止了我的请求。我需要另一种方法来验证SQLi并显示可以服务器恢复数据。 ?...在之前的文章,我向大家展示了如何使用xp_dirtree通过SQLi来捕获SQL Server用户哈希值的方法。这里我尝试了相同的方法,但由于客户端防火墙上的出站过滤而失败了。...此外,在上篇文章我还引用了GracefulSecurity的文章内容,而在本文中它也将再次派上用场。 即使有出站过滤,xp_dirtree仍可用于网络泄露数据。...在下面的示例,红框的查询语句将会为我们Northwind数据库返回表名。 ? 在该查询你应该已经注意到了有2个SELECT语句。

    11.5K10

    【编程基础】Android如何获取资源的尺寸?

    Android为了实现不同屏幕的适配,经常会用到在不同dimen.xml文件对于同一dimen ID定义不同的大小,然后在代码通过getDimension函数来获取,下面就来说说几种getDimension...getDimension()是基于当前DisplayMetrics进行转换,获取指定资源id对应的尺寸。文档里并没说这里返回的就是像素,要注意这个函数的返回值是float,像素肯定是int。...getDimensionPixelOffset()与getDimension()功能类似,不同的是将结果转换为int,并且偏移转换(offset conversion,函数命名的offset是这个意思...getDimensiongetDimensionPixelOffset的功能类似,都是获取某个dimen的值,但是如果单位是dp或sp,则需要将其乘以density,如果是px,则不乘,并且getDimension

    2.5K70

    iOS获取通讯录联系人信息

    IOS关于通讯录的开发有两种,一种是直接调用系统的通讯录界面,根据回调信息处理数据,另一种是直接获取系统的通讯录,完全自定义UI,并且可以通过官方给我们提供的接口进行读写。...IOS获取系统通讯录联系人信息 一、权限注册 随着apple对用户隐私的越来越重视,IOS系统的权限设置也更加严格,在获取系统通讯录之前,我们必须获得用户的授权。...dispatch_semaphore_wait执行后会使信号量减1.                   2、因为是否被授权是在ABAddressBookRequestAccessWithCompletion的block回调获取的...    // 设置phone属性     ABRecordSetValue(person, kABPersonPhoneProperty, dic, NULL);     // 将新建的联系人添加到通讯录...); 2、修改联系人 修改联系人的操作就是将获取添加和在一起,先获取到相应的联系人引用,重设其属性字段即可。

    1.6K40

    iOS获取通讯录联系人信息 原

    iOS获取系统通讯录联系人信息 一、权限注册 随着apple对用户隐私的越来越重视,IOS系统的权限设置也更加严格,在获取系统通讯录之前,我们必须获得用户的授权。...dispatch_semaphore_wait执行后会使信号量减1.                   2、因为是否被授权是在ABAddressBookRequestAccessWithCompletion的block回调获取的...kABPersonFirstNameProperty));         //获取当前联系人姓氏         NSString*lastName=(__bridge NSString *)(ABRecordCopyValue...    // 设置phone属性     ABRecordSetValue(person, kABPersonPhoneProperty, dic, NULL);     // 将新建的联系人添加到通讯录...); 2、修改联系人 修改联系人的操作就是将获取添加和在一起,先获取到相应的联系人引用,重设其属性字段即可。

    1.3K40

    如何机器学习数据获取更多收益

    这个问题无法通过分析数据得到很好的解决,只能是通过一次次的制作数据集、搭建模型并进行仿真实验才能发现如何最好地利用数据集以及选取什么样的模型结构。  ...在这个过程,可以借鉴一些其它项目、论文领域中的想法,或者是展开头脑风暴等。在之前的博客《如何定义你的机器学习问题》,我总结了一些框架,可供读者参考。...3.研究数据 将能够想到数据都可视化,各个角度来看收集的数据。...4.训练数据样本大小  使用少量的数据样本做敏感性分析,看看实际需要多少数据,可参考博客《机器学习训练需要多少样本》。此外,不要认为训练数据越多越好,适合的才是最好的。...设计实验并仔细测试比较各个特征视图,通过实验数据来告诉我们哪些特征哪些视图是最具代表性的。有关特征选择的更多内容,可参考博客《特征选择导论》。

    8.3K20

    如何浏览器获取信用卡密码

    最近我们研究了几款最受欢迎的四种浏览器—Internet Explorer(IE),Microsoft Edge,Google ChromeMozilla Firefox是如何存储信用卡数据以及其他的安全风险...在研究我们发现IE,Edge,ChromeFirefox都存在记住密码的功能。不幸的是,他们存储敏感信息的方式都存在安全隐患。 在图1,您可以看到记住密码功能的一个示例。...五.加密数据提取 为了IE,Edge,ChromeFirefox中提取信用卡数据,我们需要了解两件事情: 1.SQLite数据库结构 2.如何使用DPAPI解密信用卡信息 SQLite是如今很受欢迎的嵌入式数据库软件...七.深入探索代码 在了解这些情况之后,我们可以以下两点来编写我们POC: 1.将处理SQLite数据库(适用于ChromeFirefox)DPAPI的软件包导入到我们的项目中。...第1行DB对象中提取加密的BlobData字段(信用卡号)。 第2行发送加密的BlobData进行解密。

    4.1K60

    教你如何快速 Oracle 官方文档获取需要的知识

    https://docs.oracle.com/en/database/oracle/oracle-database/index.html 如图,以上 7.3.4 到 20c 的官方文档均可在线查看...11G 官方文档:https://docs.oracle.com/cd/E11882_01/server.112/e40402/toc.htm 这里以 11g R2 官方文档为例: 今天来说说怎么快速的官方文档得到自己需要的知识...Application Development页面 PL/SQL Packages and Types Reference ,这个文档包括各种 oracle自建的包函数的功能、参数描述。...具体还没深入了解,但是感觉还是比较先进好用的,当 plsql没有办法完成任务的时候,可以使用 java存储过程来解决,比如说想要获取主机目录下的文件列表。...SQLJ提供了plsql java集成的简便方法。

    7.9K00
    领券