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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android ContentProviderAndroid系统中的一个组件,用于管理应用程序之间的数据共享。它提供了一种标准的接口,使得应用程序可以访问其他应用程序的数据,同时也可以保护数据的安全性。ContentProvider可以将数据存储在文件系统、SQLite数据库或者网络上,然后通过URI来访问这些数据。开发者可以通过继承ContentProvider类来创建自己的ContentProvider,然后在AndroidManifest.xml文件中注册。在使用ContentProvider时,需要使用ContentResolver类来访问数据。 ### 回答2: Android ContentProviderAndroid Framework中的一个重要组件,用于在应用间共享数据。它提供一种标准化的方式,让其它应用或组件访问原本受到封装的私有数据。ContentProvider采用标准的CRUD(Create、Retrieve、Update、Delete)逻辑来管理数据,且提供额外的查询功能,是实现数据在应用间共享的理想选择。 ContentProvider可以用来实现以下几个功能: 1. 数据共享:ContentProvider提供了一个标准的接口,让其它应用或组件来操作内容提供者的数据。 2. 数据访问保护:ContentProvider可以控制其它应用或组件只有在得到授权的情况下才能访问数据。 3. 储存树形数据:储存树形数据是很常见的需求,不像SQLite那样的关系型数据库。 4. 数据访问审计:作为应用中的一个中央存储库,ContentProvider可以记录其它应用或组件对它的操作记录。 下面以一个简单的例子来说明ContentProvider的使用过程: 1. 首先在AndroidManifest.xml文件中定义ContentProvider,必须在所有Activity的前面定义; 2. 在代码中继承ContentProvider,实现CRUD和查询方法; 3. 在应用中使用CursorLoader或ContentResolver访问ContentProvider中的数据; 4. 客户端进程和服务端进程都需要读写ContentProvider,为了防止多线程数据访问问题, ContentProvider通常会使用线程池来进行并发处理。 ContentProviderAndroid组件中的一种,应用程序可以通过该组件来暴露自己的数据给其它应用程序使用,同时也可以访问其它应用程序的ContentProvider,以获取到这些应用程序所提供的数据。ContentProvider实例Android开发中广泛运用。通过ContentProvider,我们可以更加方便地共享数据,能够让我们的应用程序变得更加灵活。 ### 回答3: Android提供了Content Provider框架,以便不同的应用程序之间共享数据。ContentProvider提供了一种安全访问数据的方式,防止数据被未经授权的访问。 实现Content Provider需要定义一个类,该类继承自ContentProvider类,并实现一些必要的方法,包括onCreate()、query()、insert()、update()和delete()。我们可以通过Content Resolver类来访问Content Provider,它是一个用于查询、插入、更新和删除数据的类。 Content Provider的最大好处是在应用程序之间共享数据。例如,一个应用程序可以提供联系人列表,并允许其他应用程序访问该列表。如果应用程序需要共享数据,可以使用Content Provider。 在实现Content Provider时,需要确定好URI的结构,以便其他应用程序访问数据。URI的结构可以根据应用程序的需求来定制。例如,我想创建一个共享书籍列表的Content Provider,URI可以定义为content://com.example.bookprovider/books。通过这个URI,其他应用程序可以访问该Provider中的books表,并操作数据。 要使用Content Provider,需要先在AndroidManifest.xml文件中注册该Provider。这需要声明一个<provider>标记,其中包含Provider的名称、权限和URI。 Content ProviderAndroid中被广泛使用,它可以让应用程序之间共享数据,并提高应用程序的安全性。但是,使用Content Provider也需要注意数据安全性,防止数据被未经授权的访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值