美文网首页Android练级塔Android知识Android开发经验谈
七.Android四大组件的ContentProvider实例—

七.Android四大组件的ContentProvider实例—

作者: KaelQ | 来源:发表于2016-08-01 11:08 被阅读1154次

    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.日常福利

    相关文章

      网友评论

      • yaoTongxue:楼主你这篇文章的demo有地址吗
        KaelQ:最后的github地址。
      • miccall:好久没看了,复习加深一下
      • 71150ce14a00:推荐个qq交流群:126039945
      • nbpzjy:Fork了一个哈哈哈😄
        nbpzjy:@breakingsword 好的😄
        KaelQ: @nbpzjy 哈哈。给个star呗。

      本文标题:七.Android四大组件的ContentProvider实例—

      本文链接:https://www.haomeiwen.com/subject/lvexsttx.html