目录

一、通讯录界面布局

activity_contact.xml 界面布局:

contact_item.xml 条目界面布局:

item_bg.xml 条目界面的背景文件(drawable文件夹中创建):

二、Java 代码

ContactInfo.java 封装联系人信息实体类:

ContactAdapter.java 数据适配器:

ContactActivity.java 实现显示通讯录界面数据的功能:


在 AndroidManifest.xml 中添加读取通讯录的权限:

<uses-permission android:name="android.permission.READ_CONTACTS"/>

一、通讯录界面布局

activity_contact.xml 界面布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".ContactActivity"><TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"android:padding="5dp"android:background="#BFDC9E"android:textSize="20sp"android:textColor="@color/black"android:text="通讯录" /><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rv_contact"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="2dp"android:background="#F2F4E2"/>
</LinearLayout>

contact_item.xml 条目界面布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="5dp"android:padding="8dp"android:background="@drawable/item_bg"><ImageViewandroid:id="@+id/iv_photo"android:layout_width="60dp"android:layout_height="60dp"android:layout_centerVertical="true"app:srcCompat="@drawable/user" /><TextViewandroid:id="@+id/tv_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignTop="@+id/iv_photo"android:layout_marginTop="5dp"android:layout_toEndOf="@+id/iv_photo"android:layout_marginStart="20dp"android:textColor="@color/black"android:text="李雷" /><TextViewandroid:id="@+id/tv_phone"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBottom="@+id/iv_photo"android:layout_marginBottom="5dp"android:layout_toEndOf="@+id/iv_photo"android:layout_marginStart="20dp"android:textColor="@color/black"android:text="13520677894" />
</RelativeLayout>

item_bg.xml 条目界面的背景文件(drawable文件夹中创建):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#EBEFC5"/><corners android:radius="10dp"/>
</shape>

二、Java 代码

ContactInfo.java 封装联系人信息实体类:

package com.example.contentprovider;public class ContactInfo {private String contactName;private String phoneNumber;public String getContactName() {return contactName;}public void setContactName(String contactName) {this.contactName = contactName;}public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;}
}

ContactAdapter.java 数据适配器:

package com.example.contentprovider;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import java.util.List;public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.MyViewHolder> {private Context context;private List<ContactInfo> contactInfoList;public ContactAdapter(Context context, List<ContactInfo> contactInfoList) {this.context = context;this.contactInfoList = contactInfoList;}@NonNull@Overridepublic MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {MyViewHolder holder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.contact_item,parent,false));return holder;}@Overridepublic void onBindViewHolder(@NonNull MyViewHolder holder, int position) {holder.tv_name.setText((CharSequence) contactInfoList.get(position).getContactName());holder.tv_phone.setText((CharSequence) contactInfoList.get(position).getPhoneNumber());}@Overridepublic int getItemCount() {return contactInfoList.size();}class MyViewHolder extends RecyclerView.ViewHolder {TextView tv_name, tv_phone;ImageView iv_photo;public MyViewHolder(@NonNull View itemView) {super(itemView);iv_photo = itemView.findViewById(R.id.iv_photo);tv_name = itemView.findViewById(R.id.tv_name);tv_phone = itemView.findViewById(R.id.tv_phone);}}
}

ContactActivity.java 实现显示通讯录界面数据的功能:

package com.example.contentprovider;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import android.annotation.SuppressLint;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.os.Build;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.Toast;import java.util.ArrayList;
import java.util.List;public class ContactActivity extends AppCompatActivity {private RecyclerView recyclerView;@SuppressLint("MissingInflatedId")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_contact);init();}private void init() {recyclerView = findViewById(R.id.rv_contact);recyclerView.setLayoutManager(new LinearLayoutManager(this));getPermissions();}String[] permissionList;//申请权限public void getPermissions() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {permissionList = new String[]{"android.permission.READ_CONTACTS"};ArrayList<String> list = new ArrayList<>();for (String s : permissionList) {if (ActivityCompat.checkSelfPermission(ContactActivity.this, s) !=PackageManager.PERMISSION_GRANTED) {list.add(s);}}if (list.size() > 0) {ActivityCompat.requestPermissions(ContactActivity.this, list.toArray(list.toArray(new String[list.size()])),1);} else {setDate();}} else {setDate();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == 1) {for (int i = 0; i < permissions.length; i ++) {if(permissions[i].equals("android.permission.READ_CONTACTS") &&grantResults[i] == PackageManager.PERMISSION_GRANTED) {Toast.makeText(this, "读取通讯录权限申请成功", Toast.LENGTH_SHORT).show();setDate();} else {Toast.makeText(this, "读取通讯录权限申请失败", Toast.LENGTH_SHORT).show();}}}}private void setDate() {List<ContactInfo> contactInfoList = getContacts();ContactAdapter adapter = new ContactAdapter(ContactActivity.this , contactInfoList);recyclerView.setAdapter(adapter);}//获取通讯录数据private List<ContactInfo> getContacts() {List<ContactInfo> contactInfos = new ArrayList<>();Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);while ( cursor.moveToNext() ) {@SuppressLint("Range") String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));@SuppressLint("Range") String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));@SuppressLint("Range") int isHas = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));if (isHas > 0) {Cursor cursor1 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id,null, null);while (cursor1.moveToNext()) {ContactInfo contactInfo = new ContactInfo();contactInfo.setContactName(name);@SuppressLint("Range") String number = cursor1.getString(cursor1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)).trim();number = number.replace(" ","");number = number.replace("-","");contactInfo.setPhoneNumber(number);contactInfos.add(contactInfo);}cursor1.close();}}cursor.close();return contactInfos;}
}

Android开发 读取手机通讯录相关推荐

  1. Android开发读取通讯录信息

    需求 通过搜索联系人的姓名获取相应的详细人信息,也可通过右侧字母条搜索相应的联系人信息. 主要代码如下: MainActivity public class MainActivity extends ...

  2. android+读取电话权限,【uniapp】 读取手机通讯录权限

    现在很多APP,市场需求都需要读取我们手机上的相关权限,例如WX要读取通讯录,相册,照相机等权限,其他APP亦如此 但是在获得这些权限之前我们首先需要征得用户的统一之后才能读取 官方讲解: https ...

  3. 最快速读取手机通讯录中联系人信息

    作为一名Android开发,读写手机通讯录的操作人人都会,但是有没有遇到通讯录存在好几百条联系人信息时候读取的速度会明显变慢呢?本文就是介绍解决办法,我总结出了以下几种办法 提供参考: 一.线程 有A ...

  4. java获取手机通讯录权限_Android读取手机通讯录联系人到自己项目

    本文实例为大家分享了Android读取手机通讯录联系人到项目的具体代码,供大家参考,具体内容如下 一.主界面代码如下: android:layout_width="match_parent& ...

  5. 【uniapp】 读取手机通讯录权限

    现在很多APP,市场需求都需要读取我们手机上的相关权限,例如WX要读取通讯录,相册,照相机等权限,其他APP亦如此 但是在获得这些权限之前我们首先需要征得用户的统一之后才能读取 官方讲解: https ...

  6. iOS程序猿之读取手机通讯录

    读取手机通讯录 如今很多app都有读取手机联系人的需要,最近项目也遇到了类似的需求,这里整理下 从iOS开始,苹果废弃了以前复杂的AddressBookFramework,使用非常简单易用的Conta ...

  7. Android开发之手机铃声代码实现

    Android开发之手机铃声代码实现 [IT168技术]对于Android应用开发来说,手机铃声是一个非常重要的需求,网上查了很多例子,都有点问题,综合几个自己写了个可以设置铃声.通知声音.闹钟声音和 ...

  8. uniapp 读取手机 通讯录 分组

    最近在做跨平台开发,用到了读取通讯录的功能,但是读取到的通讯录未实现分组,这个应该是H5标准的问题,具体参考以下文档: https://www.html5plus.org/doc/zh_cn/cont ...

  9. Android开发 设置手机壁纸

    目录 内容概要 所需方法 Mainfest中加入权限: 布局代码 ImageAdapter类 main代码 实现效果图 内容概要 可以选择自己喜欢的图片进行壁纸设置 所需方法 1.使用Wallpape ...

最新文章

  1. 超人类AI的幻想与思考:自下而上构建的自我迭代意识系统
  2. 认识一下Global.asa 文件
  3. Python3 CookBook | 数字处理
  4. .NET种Json时对单引号和特殊字符串的处理
  5. 感觉灵感被掏空?你需要这 9 篇论文来补一补 | PaperDaily #05
  6. OpenCV蒙版图像make mask image的实例(附完整代码)
  7. python内建函数是什么意思_Python3内建函数简介,Python3内建函数详解
  8. vue 组件属性监听_详解vuex 中的 state 在组件中如何监听
  9. Fast dev didn't succeed, trying another location
  10. 【英语学习】【加州教材】【G3】【科学】Science目录及术语表
  11. POJ 1141 Brackets Sequence
  12. easyui添加删除表格任意行
  13. c++ primer plus 对象和类
  14. python执行命令不阻塞_通过python 执行 nohup 不生效的解决
  15. NXP S32K3 RTD-MCAL快速引导
  16. 理解“正反馈”和“负反馈”,学会系统性思考
  17. 互联网巨头的2B市场变革
  18. AlphaGo对战李世石谁能赢?两万字长文深挖围棋AI技术(一)
  19. 你不知道的几种素数判断方法,由浅入深,详解。(附送程序员必读好书)
  20. PCB 板弯了怎么办?pcb板弯翘原因分析及改善方法

热门文章

  1. 重磅成果丨ASAM SOVD 1.0.0正式发布
  2. Ubuntu系统管理 —— 使用SSH及SCP实现远程登陆与数据传输
  3. 积分商城有哪些基本的功能呢?
  4. python如何定义函数k_Python 函数
  5. c语言如何多核运行程序,对于多线程程序,单核cpu和多核cpu如何工作?
  6. 吴恩达机器学习ex2 Logistic Regression (python)
  7. samba 本地设备名已在使用中 此连接尚未恢复
  8. 书架html5,基于HTML5 Canvas的CSG构造实体几何书架
  9. 2013年第四届c b组省赛蓝桥杯
  10. PyQt5 Qt Designer 新手教程(一)—— 软件界面介绍