Android 获取手机通讯录联系人信息

文章介绍了在HarmonyOS3.0系统中发现应用频繁访问通讯录的问题,分析原因在于每次ContentProvider查询都会增加统计次数。为解决此问题,作者提供了改进方案,包括创建ContactsInfo类以整合联系人信息,以及优化获取联系人信息的方法,减少对ContentResolver.query的调用次数,从而降低通讯录访问频率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近日在项目开发过程中发现,华为手机HarmonyOS 3.0系统,设置>隐私 里面可以查看各个应用访问隐私权限的次数,发现应用程序访问手机通讯录的次数异常的高,针对访问通讯录频次高的问题做了研究和优化

问题分析:

分析代码发现只要通过ContentProvider 访问通讯录一次,统计次数就响应增加一次

ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(ContactsContract.Data.CONTENT_URI, null, null, null, null);

代码中获取联系人头像、邮箱、号码、公司信息等都调用了query 方法,因此查询一个联系人的信息访问了多次通讯录,因此对获取联系人的方法做了改进,改进如下:

一、权限声明

AndroidManifest.xml文件中声明权限如下:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />    获取联系人权限
    <uses-permission android:name="android.permission.READ_CONTACTS" />      文件读写权限

二、新建联系人信息类

import java.util.ArrayList;
import java.util.List;

/**
 * Create time 2023/3/8 16:56
 */
public class ContactsInfo {
    long contactId;      
    String displayName;
    String photoUri;
    String photoPath;
    //
    String firstName;
    String lastName;
    //
    String company;
    String department;
    String job;
    String jobDescription;
    //
    String emailAddress;
    String emailAddressDisplayName;
    String note;
    String nickName;
    String webUrl;
    String relationName;
    String protocol;
    String customProtocol;
    String identity;
    String namespace;
    String groupId;

    List<ContactsNumber> contactsNumbers;


    public long getContactId() {
        return contactId;
    }

    public void setContactId(long contactId) {
        this.contactId = contactId;
    }

    public String getDisplayName() {
        return displayName == null ? "" : displayName;
    }

    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }

    public String getPhotoUri() {
        return photoUri == null ? "" : photoUri;
    }

    public void setPhotoUri(String photoUri) {
        this.photoUri = photoUri;
    }

    public String getPhotoPath() {
        return photoPath == null ? "" : photoPath;
    }

    public void setPhotoPath(String photoPath) {
        this.photoPath = photoPath;
    }

    public String getFirstName() {
        return firstName == null ? "" : firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName == null ? "" : lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getCompany() {
        return company == null ? "" : company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    public String getDepartment() {
        return department == null ? "" : department;
    }

    public void setDepartment(String department) {
        th
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值