Android studio—读取通讯录

Android studio—读取通讯录


好久不见,我又回来了
之前一直在忙着毕设和社畜生活所以一直没有更新
今天回来我们就学习做一下各大APP几乎都有的功能读取——你的——通讯录
本文主要讲最基础的读取通讯录功能,没有美观的设计,只有简单功能体现。
想要好看设计的同学可能要失望了(虽然以前的博客也没有好看的设计)

博主广告时间

先推广自己一波:https://blog.csdn.net/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 开发
随后我也会把这一期的软件打包好上传后,把连接放在评论区——谢谢嗷

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值