Android studio—读取通讯录
文章目录
好久不见,我又回来了
之前一直在忙着毕设和社畜生活所以一直没有更新
今天回来我们就学习做一下各大APP几乎都有的功能读取——你的——通讯录
本文主要讲最基础的读取通讯录功能,没有美观的设计,只有简单功能体现。
想要好看设计的同学可能要失望了(虽然以前的博客也没有好看的设计)
博主广告时间
先推广自己一波:https://blog.youkuaiyun.com/genijmni?spm=1000.2115.3001.5343
博主这里还有很多关于基于Android studio 平台 的Android 开发小技能噢
不要心急。精彩马上开始
这一次我们要用到 ArrayAdapter 适配器
功能演示
话不多说,先来看看我们读取通讯录的功能展示(Show time):
我们现在虚拟机中添加一个联系人
启动我们的软件,当我们点击读取联系人时,软件会询问我们是否给予权限
当我们不给予的时候——软件会提示:授权失败,无法访问联系人并自己finish掉当前页面
当我们给予的时候——软件会提示:授权成功,并读取我们的联系人
软件只会在我们第一次访问时,询问授权信息。成功授权后不用每次都进行授权
逻辑设计
展示我们已经看完了
相信大家已经很清楚这中间的逻辑了
首次点击访问按钮——询问授权——是否授权——是——读取通讯录——下次点击不再询问
首次点击访问按钮——询问授权——是否授权——否——退出当前页面——下次点击继续询问
逻辑清楚了,那么我们就要开始做准备工作了
先把我们的页面跳转做好——这一步我相信大家已经很熟悉了,直接贴代码了
MainActivity代码
这里做一个跳转就可以了,简单易懂
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
go = findViewById(R.id.go);
go.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,AdapterActivity.class);
startActivity(intent);
finish();
}
});
}
Button控件,懂的都懂,不懂的,可以去博主的其他博客进行学习。
<Button
android:text="读取通讯录"
android:id="@+id/go"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
AdapterActivity代码
也是一个跳转,只不过是返回跳转
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_adapter);
back = findViewById(R.id.back);
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(AdapterActivity.this,MainActivity.class);
startActivity(intent);
finish();
}
});
Button控件,懂的都懂,不懂的,可以去博主的其他博客进行学习。
<Button
android:text="返回"
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
列表控件
这一步很关键噢,读取后的通讯录我们需要用到列表来承载
<ListView
android:layout_width="match_parent"
android:id="@+id/friend"
android:layout_height="match_parent"/>
在Activity内也要有对应的声明:
ArrayAdapter 适配器 开始接入(要注意了噢,重头戏开始)
ArrayAdapter<String> adapter; //适配器
List<String> contactsList= new ArrayList<>(); //列表读取适配器
功能设计
基本的逻辑设计已经完成了,接下来功能模块的设计了
ArrayAdapter 适配器 接入后,我们要对这个列表和适配器进行结合
授权功能以及读取通讯录的功能编写
首先我们先进行授权功能设计,这一部分逻辑是写于onCreate方法之内的噢
是否授权
ListView contactsView = (ListView) findViewById(R.id.friend); //声明定义列表
adapter = new ArrayAdapter<String>(AdapterActivity.this, android.R.layout.simple_list_item_1,contactsList);
contactsView.setAdapter(adapter);
if (ContextCompat.checkSelfPermission(AdapterActivity.this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){
//调用系统通讯录
ActivityCompat.requestPermissions(AdapterActivity.this,new String[]{Manifest.permission.READ_CONTACTS},1);
//系统系统通讯录授权第一次进行授权 ,询问是否授权
} else{
readCotacts();
//授权成功过后,每次打开自动读取通讯录
}
}
先声明列表——基本工作,使用控件都需要的过程
调用我们之前声明过的适配器,适配器是原生逻辑
接下来是一套IF—ELSE用来判断是否授权
授权成功 调用readCotacts();——这就是我们后面要编写的读取通讯录功能细节
到这里都是底层的工作流程——没有实际给用户反馈的信息
所以我们需要在继续完善增加给用户反馈信息的细节——也就是告诉用户授权是否成功,以及授权之后的表现
授权后
这一部分逻辑是写于onCreate方法之外的噢
public void onRequestPermissionsResult(int requestCode , String[] permissions, int[] grantResults){
switch (requestCode){ //请求授权信息
case 1:
if (grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
//收到授权
readCotacts();
Toast.makeText(AdapterActivity.this,"成功授权",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(AdapterActivity.this,"你拒绝授权,无法使用通讯录",Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
}
通过读取requestCode查看是否收到授权
读取中
这一部分逻辑是写于onCreate方法之外的噢
授权完那就要读取了,通常我们读取通讯录,需要对应的信息有:姓名、电话
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
//读取电话簿名字
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
//读取电话簿电话
这是ContactsContract原生吊用逻辑,调用完姓名和电话,要关注的就是如何显示出来
contactsList.add(displayName+"\n"+number);
//输出名字和电话列表
从上列代码可以看出,我们使用了cursor(游标),利用游标进行扫描,将扫过的信息进行记录读取,最后输出出来
完整的readCotacts():
private void readCotacts(){
Cursor cursor = null; //先置为空值
try {
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
if (cursor != null){ //当游标不为空
while (cursor.moveToNext()){
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
//读取电话簿名字
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
//读取电话簿电话
contactsList.add(displayName+"\n"+number);
//输出名字和电话列表
}
adapter.notifyDataSetChanged();
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (cursor != null){ //当游标不为空
cursor.close(); //结束
}
}
}
我们先将cursor 至为空
然后游标去扫过我们通讯录的信息最后读取打印出来
到这一步,我们的代码编写就完成了,让我们先测试一下
哎,奇怪的事情发生了,软件没有按照我们原本设定的逻辑进行运行,而且自动帮我们选择了拒绝授权
那么是哪里出了问题了?
可能有细心的同学发现了:
我们在 是否授权 中调用了一个逻辑:permission.READ_CONTACTS
if (ContextCompat.checkSelfPermission(AdapterActivity.this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){
//调用系统通讯录
ActivityCompat.requestPermissions(AdapterActivity.this,new String[]{Manifest.permission.READ_CONTACTS},1);
//系统系统通讯录授权第一次进行授权 ,询问是否授权
我们再回头看这一段代码,这里正是我们选择授权时候的逻辑关键,那么我们现在应该怎么办了?
AndroidManifest配置
其实很简单,我们只需要在AndroidManifest配置进行对应的配置就可以了:
<uses-permission android:name="android.permission.READ_CONTACTS" />
让用户有权限进行授权时候的选择
好了,读取通讯录的功能就介绍到这里了,我想想下期更新啥呢?
下期预告——不定时更新
哎,有了。细心的小伙伴肯定注意到了,在我GIF图里,有两个个不起眼的软件:
就是这个两个小东西——这是我一次面试的面试题
使用第二个软件——My mianshi去扫描手机里的软件(包括第一个软件),以及包括此软件里的一张图
简单演示一下:
这就是我当时的一道面试题目
什么时候更新,**看情况吧——不会挖了坑不做吧——不会的不会的 **
结尾
好了,大家伙,再见了。
关注,即可继续学习Android 开发
随后我也会把这一期的软件打包好上传后,把连接放在评论区——谢谢嗷