十.Android ContentProvider 实例——获取联系人

1.ContentProvider简述

  • ContenttProvider(以下简称CP)是为了获取不同应用之间的数据而诞生的组件,并且官方为常见的一些数据提供了默认的CP。例如,联系人、短信等。
  • CP的几点关键:
    1. Uri:是CP的标志符,是识别CP的唯一方式。
    2. ContentResolver:对CP进行操作的类。
    3. 权限:有时候操作一些地方需要一些权限。

2.获取联系人实现思路

3.具体实现

3.1 申请权限

android6.0不仅要在AndroidManifest.xml中静态申请,还需要在代码中进行动态申请。

  • 静态申请
    在AndroidManifest.xml中进行申请。
<manifest ...>
 <uses-permission android:name="android.permission.READ_CONTACTS" />
</manifest>
  • 动态申请
    动态申请的流程为:发起申请和申请结果。

  • 发起申请:
    主要使用requestPermissions(permission名字的数组,整型的自定义reques code)方法
    注:

    1. 什么时候进行动态申请呢?版本大于等于6.0当前页面没有这个权限
    2. request code 为自定义数值,例子中我定义了一个常量int–PERMISSIONS_REQUEST_READ_CONTACTS,这个是为了在查看申请结果时判定用的。
      private void showContacts() {
          //检验是否版本大于6.0,当前页面是否有这个权限
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
              //发起申请
              requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS);
          } else {
              //低版本直接运行,跳过动态申请。
              readContacts();
          }
      }
  • 申请结果
    重写onRequsetPermissionResult(int requestCode,String[] permissions,int[] grantResults)方法。
    注:

    1. 在此返回的requestCode是发送申请中自定义的requestCode,permissions String数组也是发送申请中的,grantResults返回的有两种PackageManager.PERMISSION_**GRANTED**和PackageManager.PERMISSIO
      N_**DENIED**
      @Override
      public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                             int[] grantResults) {
          if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS) {
              if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                  // 申请权限通过
                  showContacts();
              } else {
                  Toast.makeText(this, "只有通过了权限申请才能查看", Toast.LENGTH_SHORT).show();
              }
          }
      }

3.2 获取联系人

  • 主要使用ContentResolver进行操作
    使用游标来对ContentResolver获取的数据进行操作。
private void readContacts(){
        Cursor cursor=null;
        try{
            cursor=getContentResolver().query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,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);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(cursor!=null){
                cursor.close();
            }
        }
    }

3.3 页面显示

  • List->adapter->ListView
ListView contactsView;
ArrayAdapter<String> adapter;
List<String> contactsList =new ArrayList<>();
...
adapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,contactsList);
contactsView.setAdapter(adapter);

4.结果

5.日常福利

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值