`
huaxin803
  • 浏览: 115575 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 内容提供器---创建内容提供器(实现内容提供器权限)

 
阅读更多
在“安全和权限”的专题中全面详细的描述了有关Android系统的权限和访问。“数据存储”的专题也描述了安全和权限对各种存储类型的影响。因此以下简要介绍几个重点内容:

1. 默认情况下,保存在设备内部存储器上的数据文件是你的应用程序和提供器私有的;

2. 你创建的SQLiteDatabase数据库对你的应用程序和提供器是私有的;

3. 默认情况下,保存在外部存储器中数据文件是共有的,你不能使用内容提供器来限制访问外部存储器中的文件,因为其他的应用程序能够使用其他的API调用来读/写它们;

4. 针对设备上内部存储器的打开或创建文件或SQLite数据库的方法调用,隐含的会把读/写访问都分配给其他应用程序。如果你使用一个内部文件或数据库作为你的提供器的资源库,并且给予它“world-readable”或“world-writeable”的访问权限,那么你在它清单文件中给提供器设置的权限将不会保护你的数据。对于内部存储器中的文件和数据库的默认访问时“私有的”,针对你的提供器的存储器,你不应该改变这种默认设置。

如果你想要使用内容提供器的权限来控制对你的数据的访问,那么你就应该把你的数据保存在内部文件、SQLite数据库或云端(如远程服务器)中,并且应该保持这些文件和数据库对你的应用程序私有。

实现权限

即使底层数据是私有的,所有的应用程序也能够针对你的提供器进行读写操作,因为默认情况下,你的提供器没有权限设置。要改变这种情况,在你的清单文件中使用<provider>元素的属性或子元素给你的提供器设置权限。你能够设置应用于整个提供器的权限,或者针对某个表的权限,甚至是针对某个记录的,或者三者皆有。

你能够在清单文件中用一个或多个<permission>元素给你的提供器定义权限。要使权限对你的提供器唯一,就要对android:name属性使用Java风格的作用域。例如,设置读权限:com.example.app.provider.permission.READ_PROVIDER.

下面描述了提供器权限的作用域,从应用于整个提供器的权限开始,逐步变的更细的权限。更细作用域的权限总是优先于比它作用域大的权限:

1. 单一的提供器级别的读写权限

控制整个提供器读写访问的一个权限,这个权限在<provider>元素的android:permission属性中指定。

2. 分开的提供器级别的读写权限

针对整个提供器,有一个读权限和一个写权限。你可以分别使用<provider>元素的android:readPermission和android:writePermission属性来指定。它们优先于通过android:permission属性权限要求。

3. 路径级别的权限

针对你的提供器的一个内容资源标识的读、写或读写权限。你用<provider>元素的<permission>子元素来指定你想要控制的每个URI。对于你指定的每个内容资源标识,你能够指定读写权限、读权限、或写权限,或者所有三个权限。读和写的权限要优先于读写权限。同时,路径级别的权限也优先于提供给器级别的权限。

4. 临时权限

即使应用程序没有通常要求的权限,但是也可以给应用程序授予临时访问的权限级别。这种临时访问权限的特征减少了应用程序必须在清单文件中申请权限的数量。当你打开临时权限时,应用程序只对那些持续访问的数据才需要提供器的“持久”权限。

在你想要允许一个外部的图片查看器应用程序来显示提供器中的图片附件时,实现一个电子邮件提供器和应用程序就需要考虑这种临时权限。要让这个图片查看器不需要任何权限就能够进行必要的访问,就要给这些资源标识的图片设置临时权限。你的电子邮件应用程序就需要这样的设计,以便在用户想要显示一张照片时,邮件应用程序能够发送一个包含照片的资源标识(URI)和权限标记的Intent对象给这个图片查看器。然后,这个图片查看器就能查询电子邮件提供器,获取照片,即使这个查看器没有通常的提供器的读权限。

要打开临时权限,即可以设置<provider>元素的android:grantUriPermissions属性,也可以给<provider>元素添加一个或多个<grant-uri-permission>子元素。如果你使用了临时权限,那么无论何时删除提供器与临时权限关联的资源标识(URI),都要调用Context.revokeUriPermission()方法。

临时权限的属性(android:grantUriPermissions)值决定了你的提供有多少内容是可访问的。如果这个属性被设置为true,那么系统将给整个提供器授予临时权限,它会覆盖由提供器级别或路径级别所申请其他任何权限。

如果属性android:grantUriPermissions被设置为false,那么你就必须给<provider>元素添加<grant-uri-permission>子元素。每个子元素指定要授予临时访问权限的一个或多个内容资源标识。

要把临时访问权限委托给一个应用程序,Intent对象中必须包含FLAG_GRANT_READ_URI_PERMISSION或FLAG_GRANT_WRITE_URI_PERMISSION标识,或二者都要。用setFlags()方法设置这些标记。

如果android:grantUriPermissions属性没有出现,那么就会假设它的值是false。

分享到:
评论

相关推荐

    Android项目实战--手机卫士26--内容提供者与内容观察者

    在Android开发中,内容提供者(Content Provider)和内容观察者(Content Observer)是两个非常重要的组件,它们在数据共享和实时数据更新方面扮演着关键角色。本篇将深入探讨这两个概念及其在“手机卫士”这样的...

    Android课程设计--便捷备忘录

    Android应用主要由四大组件构成:活动(Activity)、服务(Service)、广播接收器(BroadcastReceiver)和内容提供者(ContentProvider)。在这个备忘录应用中,活动是用户界面的核心,它负责显示和处理用户的交互。...

    Android自定义锁屏实现----仿正点闹钟滑屏解锁

    在Android开发中,自定义锁屏界面是一种常见的需求,它能提供独特的用户体验并增强应用程序的交互性。"Android自定义锁屏实现----仿正点闹钟滑屏解锁"这一主题,旨在教你如何创建一个类似“正点闹钟”应用中的滑动...

    Android拨号器---熟练控件与布局的应用

    本篇内容将深入探讨如何利用Android SDK中的控件和布局来创建一个功能完善的拨号器应用,即"MyDialer"。 【描述】虽然描述为空,但根据标题和标签,我们可以推测这篇博客文章可能详细讲解了如何分析Android官方拨号...

    Android 利用commons-net-3.3实现ftp上传下载Demo

    在Android开发中,有时我们需要与远程服务器进行数据交互,例如上传或下载文件。FTP(File Transfer Protocol)是一种广泛使用的协议,允许用户从远程服务器传输文件。本教程将深入讲解如何利用Apache Commons Net库...

    android实现悬浮窗功能,无需权限

    在Android开发中,实现一个无需额外权限的悬浮窗功能是一个常见的需求,特别是在打造辅助工具或者个性化应用时。本文将详细讲解如何在Android系统4.4(API Level 19)及以上版本实现这样的功能,主要涉及的技术点是...

    Android SDK (SDK Platforms)-android-22.zip

    1. **Android SDK**:全称为Android Software Development Kit,是Google为开发者提供的一个工具集,用于创建、测试和调试Android应用程序。它包括各种工具、库、文档和模拟器,帮助开发者完成整个开发流程。 2. **...

    高教类课件:Android应用程序设计--AndroidStudio版

    这门课程涵盖了Android开发的基础到高级知识,为学生提供了全面的学习路径,使他们能够创建功能丰富的移动应用程序。 在Android Studio中,开发者可以利用其强大的集成开发环境(IDE)来编写、调试和优化代码。...

    Android-Android-FileBrowser-FilePicker一个Android文件浏览和选择控件

    在Android开发中,系统并没有提供内置的文件选择器,因此,开发者往往需要自己实现这样的功能。Android-FileBrowser-FilePicker 就为此目的而设计,它简化了文件选择和浏览的实现过程,提供了良好的用户体验。 **...

    Android-XMPP-openfire-实现IM

    - **源码解析**:MyXmpp可能是这个项目提供的示例代码,包含了Android客户端的具体实现,例如XMPP连接、消息处理、用户认证等模块。 - **学习重点**:理解MyXmpp中的关键类和方法,如`XmppManager`(负责连接和...

    usb-serial-for-android

    总结,"usb-serial-for-android"为Android开发者提供了一个强大的工具,使得Android设备能方便地与各种串口设备进行数据交互。通过理解和掌握这个库,开发者可以轻松地构建起Android设备与其他硬件的桥梁,拓展...

    android-sun-jarsign-support-1.1.jar

    “android-sun-jarsign-support-1.1.jar”是一个用于支持Android应用程序签名的工具库,它包含了Sun Microsystems提供的JAR签名实现。在Android开发中,当开发者使用此库时,可以便捷地为APK文件添加签名,确保应用...

    android ffmpeg-android-java-2a627f6ecd

    5. **权限管理**:Android应用使用FFmpeg可能需要请求读写存储、网络等权限,需要在AndroidManifest.xml中添加相应的权限声明。 6. **音视频处理API**:理解FFmpeg的关键函数和结构体,如avformat_open_input()用于...

    Android手机安全卫士--splash实现

    在"Android手机安全卫士--splash实现"这个主题中,我们将深入探讨如何为一个专注于手机安全的Android应用创建一个吸引人的Splash Screen,并进行必要的初始化设置。 1. **Splash Screen设计原则** - 用户体验:...

    Android Studio Linux(android-studio-ide-141.1890965-linux.zip )

    无论你是初学者还是经验丰富的开发者,都可以借助Android Studio实现高效且便捷的Android应用开发。通过不断学习和实践,你将能充分利用其各种工具和特性,提升开发效率,创造出优秀的Android应用。

    android串口通信源码(android-serialport-api)

    总结,"android-serialport-api"为Android串口通信提供了一种便捷的实现方式,虽然代码年代较早,但其设计思想和实现机制对于理解Android串口通信仍然十分有价值。通过深入研究此项目,开发者可以更好地掌握Android...

    Android SDK (SDK Platforms)-android-23.zip

    5. **Fingerprint API**:提供了对硬件指纹识别器的支持,使得应用可以实现安全的身份验证。 **SDK Platforms中的文件** 解压后,这个压缩包通常会包含以下内容: 1. `system-images` 文件夹:包含了模拟器使用的...

    android使用JAIN jar包实现SIP协议栈

    通过本文的介绍,我们了解到如何在Android 6.0环境下使用Telestax提供的JAIN SIP Stack for Android来实现SIP协议栈。虽然这一过程可能会遇到一些技术挑战,但随着实践的深入和技术的发展,这些问题都将得到妥善解决...

    android-support-v4/v7 26 27 28三个版本下载

    在Android开发中,`android-support`库是Google为了支持老版本Android系统以及提供额外功能而推出的框架。这个库包括了多个模块,其中`v4`和`v7`是两个非常重要的部分。`android-support-v4`库是为了保证在Android ...

    Android SDK (SDK Platforms)-android-26.zip

    API Level 26对应的是Android 8.0,包含了系统的类库、API接口和系统服务,开发者可以调用这些接口来实现应用功能。 3. **Android Oreo (8.0)**:这是Android操作系统的第八个主要版本,发布于2017年。它的主要特性...

Global site tag (gtag.js) - Google Analytics