【转】 Pro Android学习笔记(六六):安全和权限(3):Provider权限
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【转】 Pro Android学习笔记(六六):安全和权限(3):Provider权限,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3782字,纯文字阅读大概需要6分钟。
内容图文
![【转】 Pro Android学习笔记(六六):安全和权限(3):Provider权限](/upload/InfoBanner/zyjiaocheng/1105/e46a28a326be4e34836d888bc895c0ae.jpg)
访问其他应用的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开发相关文章
原文:http://www.cnblogs.com/blongfree/p/5048038.html
内容总结
以上是互联网集市为您收集整理的【转】 Pro Android学习笔记(六六):安全和权限(3):Provider权限全部内容,希望文章能够帮你解决【转】 Pro Android学习笔记(六六):安全和权限(3):Provider权限所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。