目录(?)[-]

  1. 访问其他应用的content provider
  2. Provider的读写权限
  3. Provider的URI权限
  4. Provider的granting
    1. 全局granting
    2. 部分URI的granting

访问其他应用的content provider

我们在ProPermission中提供了一个content provider,成为PrivProvider,然后在ProPermissionClient中对调用这个provider接口。在ProPermission的AndroidManifest.xml中,对provider声明如下:

<provider android:name=".PrivProvider" 
    android:authorities="cn.wei.flowingflying.propermission.PrivProvider" 
    android:exported="true" />

android:exported属性非常重要。这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。如果设置为true,则能够被调用或交互,否则不能。设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。如果content provider允许其他应用调用,即允许其他进程调用,需要将该属性设置为true。如果,我们设置该属性,会报下面的错误:

Provider的读写权限

Provider可以提供读权限,写权限,或者权限,例如:

<permission android:name="wei.permission.READ_CONTENTPROVIDER" 
    android:label="Allow read content provider" 
    android:protectionLevel="normal" />

……

<provider android:name=".PrivProvider" 
    android:authorities="cn.wei.flowingflying.propermission.PrivProvider" 
    android:readPermission="wei.permission.READ_CONTENTPROVIDER"
    android:exported="true" > 
</provider>

设置写权限属性为android:writePermission,读写权限为android:permission。我们仍使用ProPermissionClient来访问provider接口,则出现权限错误:

我们在ProPermissionClient的AndroidManifest.xml中加上权限声明即可:

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

Provider的URI权限

前面,我们定义的整个provider的权限,但实际使用中,provider可以只开放部分URI的权限,例如本例,我们可以只开发content://cn.wei.flowingflying.propermission.PrivProvider/hello路径下权限,不允许访问其他路径,如下声明:

<provider android:name=".PrivProvider" 
    android:authorities="cn.wei.flowingflying.propermission.PrivProvider" 
    android:readPermission="wei.permission.READ_CONTENTPROVIDER" 
    android:exported="true" > 
    <path-permission android:pathPrefix="/hello" android:readPermission="READ_HELLO_CONTENTPROVIDER" />
</provider>

我们可以针对其中某个或某部分URI,单独进行权限设置。除了android:pathPrefix,还可以有android:path和android:pathPatten,例如android:pathPattern="/hello/.*"(注意,通配符*之前有个‘.’)。

在ProPermissionClient如果要读取content:content://cn.wei.flowingflying.propermission.PrivProvider/hello/1则需要声明整个provider的权限wei.permission.READ_CONTENTPROVIDER或者该路径的权限READ_HELLO_CONTENTPROVIDER。

Provider的granting

全局granting

ProPermissionClient具有读取content provider的权限,它去调用另一个应用C的activity,例子中这个另一个应用C为ProPermissionGrant,但是这个例子没有读取content provider的权限,ProPermissionClient可以将自己的权限通过intent传递给应用C,让其也具有访问content provider的权限。

对于应用A,相关的content provider为:

<provider android:name=".PrivProvider" 
     android:authorities="cn.wei.flowingflying.propermission.PrivProvider" 
     android:readPermission="wei.permission.READ_CONTENTPROVIDER" 
     android:grantUriPermissions="true" 
     android:exported="true" />

对于应用B,其具有wei.permission.READ_CONTENTPROVIDER的权限,而应用C不具备,应用B通过intent调用应用C的代码如下:

Intent intent = new Intent(this,ReadProvider.class); 
intent.setClassName("com.example.propermissiongrant", "com.example.propermissiongrant.MainActivity");
intent.setData(Uri.parse("content://cn.wei.flowingflying.propermission.PrivProvider/world/1"));
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);  //传递权限 
startActivity(intent);

所调用的C的activity具备访问content provider的权限。

如果我们将provider的属性android:grantUriPermissions设置为false,则不允许通过接受传递的权限方式进行访问,即B所调用的C的activity不能读content provider,报错如下:

部分URI的granting

有时候,我们只希望部分的URI允许grant权限访问,而不是开放整个provider,如下:

<provider android:name=".PrivProvider" 
     android:authorities="cn.wei.flowingflying.propermission.PrivProvider" 
     android:readPermission="wei.permission.READ_CONTENTPROVIDER" 
     android:exported="true" >  
     <grant-uri-permission android:pathPrefix="/hello" />
</provider>

我们将之允许前缀为hello的部分URI访问。一旦我们设置了grant-uri-permission,则全局的android:grantUriPermissions属性将无效,无论设置true还是flase,也都是只允许grant-uri-permission是声明的部分uri可以被grant权限访问。

本博所涉及的例子代码,可以在Pro Android学习:permission例子中下载。

相关链接: 我的Android开发相关文章

【转】 Pro Android学习笔记(六六):安全和权限(3):Provider权限的更多相关文章

  1. Pro Android学习笔记 ActionBar(1):Home图标区

     Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...

  2. 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...

  3. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  4. 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode

    目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...

  5. 【转】 Pro Android学习笔记(五六):配置变化

    目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...

  6. 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式

    可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...

  7. 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

    目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...

  8. 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版

    目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...

  9. 【转】 Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单

    目录(?)[-] 利用XML创建菜单 XML的有关属性 onClick事件 Pop-up菜单 利用XML创建菜单 在代码中对每个菜单项进行设置,繁琐且修改不灵活,不能适配多国语言的要求,可以利用资源进 ...

  10. 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单

    目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...

随机推荐

  1. Python菜鸟之路:Python基础(二)

    一.温故而知新 1. 变量命名方式 旧的方式: username = 'xxxx' password = 'oooo' 新的方式: username, password = 'xxxx', 'oooo ...

  2. JavaScript中的this用法

    最近看了许多JavaScript源代码,发现this经常出现,于是对this这个非常特殊的关键词标识符进行总结. 题外话: 1.当函数被调用时,一个activation record[过程活动记录 - ...

  3. JAVA事件监听机制与实现

    事件监听机制的实现:参考图:事件模型_ActionEvent 为了节省资源,系统无法对某个事件进行实时的监听.故实现的机制是当发生某个事件后,处理代码将被自动运行,类似钩子一般.(回调函数) 事件有许 ...

  4. C语言伪随机数的注意事项

    不要将srand(time(NULL))或srand(time(0))放到循环中,因为我们两次调用srand()函数设置随机数种子之间的时间间隔不超过1s,等价于使用了一个固定的随机数种子,会出现相同 ...

  5. Spring源码解析-核心类之XmlBeanDefinitionReader

    XmlBeanDefinitionReader XML配置文件的读取是 Spring 中重要的功能,因为 Spring 的大部分功能都是以配置作为切入点的,那么我们可以从 XmlBeanDefinit ...

  6. Blog迁移至Jekyll

    后续的Blog都将在 http://zhwbqd.github.io/ 为您呈现

  7. Win7.窗口自动滚动回到屏幕

    PS:笔记本 ThinkPad E440 1.前提:窗口 的一部分位于在屏幕的外面,此窗口处于激活的状态 操作:鼠标放置在窗口内部,鼠标继续往屏幕外部移动,鼠标没有任何其他事件(只有 MouseMov ...

  8. 红米note.线刷

    1.第一代 红米note 时间:20180121 这次 线刷之后,摄像头还是模糊,扫描小一点的二维码的时候 还是一片模模糊糊... 2.ZC:我下载的“通用刷机工具”名为:MiFlash2017-12 ...

  9. Spark官网

    Components Spark applications run as independent sets of processes on a cluster, coordinated by the ...

  10. 三 Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性

    Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRe ...