美文网首页Android开发Android开发手机移动程序开发
Android基础-四大组件之Content Provider内

Android基础-四大组件之Content Provider内

作者: 小蜉蝣星蔚 | 来源:发表于2019-07-15 11:33 被阅读4次
    Android四大组件分别为:1.活动Activity,2.服务Service,3.广播接收器Broadcast Receiver,4.内容提供器Content Provider

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

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

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

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

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

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

    获取手机联系人
    这其实就是系统内部的内容提供器在起作用,这是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基础-四大组件之Content Provider内

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