安卓(android)读取手机通讯录【Android移动开发基础案例教程(第2版)黑马程序员】

一、实验目的(如果代码有错漏,可在代码地址查看)

1.熟悉内容提供者(Content Provider)的概念和作用。

2.掌握内容提供者的创建和使用方法。

4.掌握内容URI的结构和用途。

二、实验条件

1.熟悉内容提供者的工作原理。

2.掌握内容提供者访问其他应用程序数据的方式。

三、实验内容

1.创建程序,添加recyclerview库。

2.添加界面控件,取消默认标题栏。

3.搭建通讯录列表条目界面布局。

4.封装联系人信息实体类。

5.编写通讯录列表的适配器。

6.实现显示通讯录界面数据的功能。

7.添加读取系统通讯录的权限,运行程序。

四、实验指导

正在layout包下:

1.activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"tools:context=".MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

2.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>

3.contact_item

<?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>

Java代码:

package cn.itcast.contacts;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;}
}
package cn.itcast.contacts;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);}}
}
package cn.itcast.contacts;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;}
}

package cn.itcast.contacts;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}

五:代码下载地址:

android: 实现注册界面、实现注册界面、饭堂小广播、音乐播放器、记事本、读取手机通讯录、学生管理系统 - Gitee.com

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

allegro修改封闭图形线宽

说在前面 我们先把最优解说在前面,然后后面再说如果当时不熟悉软件的时候为了挖孔是用了shapes该怎么修改回来。 挖空最方便的方式是在cutout层画一个圆弧,下面开始图解,先add一个圆弧 z 最好是在画的时候就选择好层,如果忘记了后续再换回去也行,但好像软件有bug,此处并…

使用openwrt搭建ipsec隧道

背景&#xff1a;最近同事遇到了个ipsec问题&#xff0c;做的ipsec特性&#xff0c;ftp下载ipv6性能只有100kb, 正面定位该问题也蛮久了&#xff0c;项目没有用openwrt, 不过用了开源组件strongswan, 加密算法这些也是内核自带的&#xff0c;想着开源的不太可能有问题&#xff…

Day29(补)-【AI思考】-精准突围策略——从“时间贫困“到“效率自由“的逆袭方案

文章目录 精准突围策略——从"时间贫困"到"效率自由"的逆袭方案**第一步&#xff1a;目标熵减工程&#xff08;建立四维坐标&#xff09;** 与其他学习方法的结合**第二步&#xff1a;清华方法本土化移植** 与其他工具对比**~~第三步&#xff1a;游戏化改造…

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码)

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09; 目录 手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09;Stable Diffusion 原理图Stable Diffusion的原理解释Stable Diffusion 和Di…

vscode+WSL2(ubuntu22.04)+pytorch+conda+cuda+cudnn安装系列

最近在家过年闲的没事&#xff0c;于是研究起深度学习开发工具链的配置和安装&#xff0c;之前欲与天公试比高&#xff0c;尝试在win上用vscodecuda11.6vs2019的cl编译器搭建cuda c编程环境&#xff0c;最后惨败&#xff0c;沦为笑柄&#xff0c;痛定思痛&#xff0c;这次直接和…

【ESP32】ESP-IDF开发 | WiFi开发 | TCP传输控制协议 + TCP服务器和客户端例程

1. 简介 TCP&#xff08;Transmission Control Protocol&#xff09;&#xff0c;全称传输控制协议。它的特点有以下几点&#xff1a;面向连接&#xff0c;每一个TCP连接只能是点对点的&#xff08;一对一&#xff09;&#xff1b;提供可靠交付服务&#xff1b;提供全双工通信&…

AI时序预测: iTransformer算法代码深度解析

在之前的文章中&#xff0c;我对iTransformer的Paper进行了详细解析&#xff0c;具体文章如下&#xff1a; 文章链接&#xff1a;深度解析iTransformer&#xff1a;维度倒置与高效注意力机制的结合 今天&#xff0c;我将对iTransformer代码进行解析。回顾Paper&#xff0c;我…

某盾Blackbox参数参数逆向

以前叫同盾&#xff0c;现在改名了&#xff0c;叫小盾安全&#xff0c;好像不做验证码了

docker中运行的MySQL怎么修改密码

1&#xff0c;进入MySQL容器 docker exec -it 容器名 bash 我运行了 docker ps命令查看。正在运行的容器名称。可以看到MySQL的我起名为db docker exec -it db bash 这样就成功的进入到容器中了。 2&#xff0c;登录MySQL中 mysql -u 用户名 -p 回车 密码 mysql -u root -p roo…

春节期间,景区和酒店如何合理用工?

春节期间&#xff0c;景区和酒店如何合理用工&#xff1f; 春节期间&#xff0c;旅游市场将迎来高峰期。景区与酒店&#xff0c;作为旅游产业链中的两大核心环节&#xff0c;承载着无数游客的欢乐与期待。然而&#xff0c;也隐藏着用工管理的巨大挑战。如何合理安排人力资源&a…

初始化mysql报错cannot open shared object file: No such file or directory

报错展示 我在初始化msyql的时候报错&#xff1a;mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory 解读&#xff1a; libaio包的作用是为了支持同步I/O。对于数据库之类的系统特别重要&#xff0c;因此…

C语言------数组从入门到精通

1.一维数组 目标:通过思维导图了解学习一维数组的核心知识点: 1.1定义 使用 类型名 数组名[数组长度]; 定义数组。 // 示例&#xff1a; int arr[5]; 1.2一维数组初始化 数组的初始化可以分为静态初始化和动态初始化两种方式。 它们的主要区别在于初始化的时机和内存分配的方…

Docker/K8S

文章目录 项目地址一、Docker1.1 创建一个Node服务image1.2 volume1.3 网络1.4 docker compose 二、K8S2.1 集群组成2.2 Pod1. 如何使用Pod(1) 运行一个pod(2) 运行多个pod 2.3 pod的生命周期2.4 pod中的容器1. 容器的生命周期2. 生命周期的回调3. 容器重启策略4. 自定义容器启…

【开源免费】基于SpringBoot+Vue.JS公交线路查询系统(JAVA毕业设计)

本文项目编号 T 164 &#xff0c;文末自助获取源码 \color{red}{T164&#xff0c;文末自助获取源码} T164&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

< OS 有关 > Android 手机 SSH 客户端 app: connectBot

connectBot 开源且功能齐全的SSH客户端,界面简洁,支持证书密钥。 下载量超 500万 方便在 Android 手机上&#xff0c;连接 SSH 服务器&#xff0c;去运行命令。 Fail2ban 12小时内抓获的 IP ~ ~ ~ ~ rootjpn:~# sudo fail2ban-client status sshd Status for the jail: sshd …

中国股市“慢牛”行情的实现路径与展望

在现代经济体系中&#xff0c;股市不仅是企业融资的重要平台&#xff0c;也是投资者财富增值的关键渠道。一个健康、稳定、持续增长的股市&#xff0c;对于推动经济高质量发展、提升国家金融竞争力具有深远意义。近年来&#xff0c;“慢牛”行情成为众多投资者和市场参与者对我…

Linux Samba 低版本漏洞(远程控制)复现与剖析

目录 前言 漏洞介绍 漏洞原理 产生条件 漏洞影响 防御措施 复现过程 结语 前言 在网络安全的复杂生态中&#xff0c;系统漏洞的探索与防范始终是保障数字世界安全稳定运行的关键所在。Linux Samba 作为一款在网络共享服务领域应用极为广泛的软件&#xff0c;其低版本中…

ResNet 残差网络

目录 网络结构 残差块&#xff08;Residual Block&#xff09; ResNet网络结构示意图 残差块&#xff08;Residual Block&#xff09;细节 基本残差块&#xff08;ResNet-18/34&#xff09; Bottleneck残差块&#xff08;ResNet-50/101/152&#xff09; 残差连接类型对比 变体网…

【Unity3D】实现横版2D游戏角色二段跳、蹬墙跳、扶墙下滑

目录 一、二段跳、蹬墙跳 二、扶墙下滑 一、二段跳、蹬墙跳 GitHub - prime31/CharacterController2D 下载工程后直接打开demo场景&#xff1a;DemoScene&#xff08;Unity 2019.4.0f1项目环境&#xff09; Player物体上的CharacterController2D&#xff0c;Mask添加Wall层…

FPGA 使用 CLOCK_LOW_FANOUT 约束

使用 CLOCK_LOW_FANOUT 约束 您可以使用 CLOCK_LOW_FANOUT 约束在单个时钟区域中包含时钟缓存负载。在由全局时钟缓存直接驱动的时钟网段 上对 CLOCK_LOW_FANOUT 进行设置&#xff0c;而且全局时钟缓存扇出必须低于 2000 个负载。 注释&#xff1a; 当与其他时钟约束配合…