Android四大组件分别为:1.活动Activity,2.服务Service,3.广播接收器Broadcast Receiver,4.内容提供器Content Provider

Content Provider内容提供器概念、特点及用法分类

①内容提供器概念:
内容提供器是用于在不同的app之间实现数据共享的组件,它是android中实现跨程序共享数据的标准方式。

②内容提供器特点:
允许一个app访问另一app中的数据,在此基础上还能保证被访问数据的安全性。

规避风险的做法是,内容提供器可选择性的针对部分数据进行共享。

③内容提供器用法分类:
内容提供器用法分类分为两种:
1.使用系统内部的内容提供器,读取和操作数据。
2.创建app本身的内容提供器,为程序本身的数据提供外部访问接口。

系统内部的内容提供器,举个栗子,在日常使用手机中的app时,大家应该都遇到过以下图片中的场景,有的第三方社交app想获取读取联系人:

android 的内容提供者 安卓内容提供器是什么_contentprovider


这其实就是系统内部的内容提供器在起作用,这是android系统内部的电话簿内容提供器,除此之外还有手机存储,短信,相册,日历等都提供了类似的外部访问接口。

使用系统内部的内容提供器——以读取联系人为例子

读取联系人(READ_CONTACTS)涉及用户隐私,属于危险权限之一,需要在AndroidManifest.xml中注册:

<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

之后在代码逻辑中使用运行时权限申请的逻辑;

//运行时权限的申请,读取联系人的权限
        //尚未授权
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_CONTACTS}, 1);
        }
        //已授权
        else {
            getContacts();
        }

//运行时权限,调用requestPermissions()方法会弹出申请权限选择框,两个结果都会回调此方法
//授权结果封装在grantResults中

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    getContacts();
                }
        }
    }

使用ContentResolver对象来访问内容提供器中的共享数据,并打印至日志中:
记得操作完之后,关闭cursor对象,释放资源

//获取联系人
    private void getContacts() {
        Cursor cursor=null;
        try {
             cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null, null, null, null);
            if (cursor != null) {
                while (cursor.moveToNext()) {
                    //获取姓名并用log打印
                    Log.d(TAG, "onCreate: " + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
                    //获取手机号并用log打印
                    Log.d(TAG, "onCreate: " + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
    
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        //关闭cursor
            cursor.close();
        }
    }

请求授权如下:

android 的内容提供者 安卓内容提供器是什么_contentprovider_02


允许后查看日志信息如下,成功获取联系人姓名和电话号码:

android 的内容提供者 安卓内容提供器是什么_contentprovider_03