- 语法
-
<provider android:authorities="list" android:directBootAware=["true" | "false"] android:enabled=["true" | "false"] android:exported=["true" | "false"] android:grantUriPermissions=["true" | "false"] android:icon="drawable resource" android:initOrder="integer" android:label="string resource" android:multiprocess=["true" | "false"] android:name="string" android:permission="string" android:process="string" android:readPermission="string" android:syncable=["true" | "false"] android:writePermission="string" > ... </provider>
- 包含在
-
<application>
- 可以包含
<meta-data>
<grant-uri-permission>
<intent-filter>
<path-permission>
- 描述
- 声明内容提供程序组件。内容提供程序是
ContentProvider
的子类,它提供对应用程序管理数据的结构化访问。您应用程序中的所有内容提供程序都必须在清单文件中的<provider>
元素中定义。否则,系统将无法识别它们,也不会运行它们。仅声明属于您应用程序的内容提供程序。不要声明您应用程序中使用的其他应用程序中的内容提供程序。
Android 系统根据内容提供程序的 内容 URI 中的一部分 authority 字符串存储内容提供程序的引用。例如,假设您想访问一个存储有关医疗保健专业人员信息的 内容提供程序。为此,您调用
ContentResolver.query()
方法,该方法会接收一个用于识别提供程序的 URI,以及其他参数content://com.example.project.healthcareprovider/nurses/rn
content:
方案 将 URI 标识为指向 Android 内容提供程序的内容 URI。authoritycom.example.project.healthcareprovider
用于识别提供程序本身。Android 系统会在其已知提供程序及其 authority 列表中查找 authority。子字符串nurses/rn
是一个 路径,内容提供程序使用它来识别提供程序数据的子集。当您在
<provider>
元素中定义提供程序时,您不会在android:name
参数中包含方案或路径,只包含 authority。有关使用和开发内容提供程序的信息,请参阅 内容提供程序。
- 属性
-
android:authorities
- 一个或多个 URI authority 列表,用于标识内容提供程序提供的数据。通过分号分隔多个 authority 的名称来列出多个 authority。为了避免冲突,请使用类似 Java 的命名约定作为 authority 名称,例如
com.example.provider.cartoonprovider
。通常情况下,它就是实现提供程序的ContentProvider
子类的名称没有默认值。必须指定至少一个 authority。
android:enabled
- 内容提供者是否可以由系统实例化。如果可以,则为
"true"
,否则为"false"
。默认值为"true"
。<application>
元素有它自己的enabled
属性,该属性适用于所有应用程序组件,包括内容提供者。如果<application>
和<provider>
属性都为"true"
,则内容提供者将被启用,这两个属性默认情况下都为"true"
。如果其中任何一个为"false"
,则提供者将被禁用。它无法被实例化。 android:directBootAware
内容提供者是否为直接启动感知,即它是否可以在用户解锁设备之前运行。
注意:在 直接启动 期间,您的应用程序中的内容提供者只能访问存储在设备保护存储中的数据。
默认值为
"false"
。android:exported
- 内容提供者是否可供其他应用程序使用。
-
"true"
:提供者可供其他应用程序使用。任何应用程序都可以使用提供者的内容 URI 来访问它,但必须遵守为提供者指定的权限。 -
"false"
:提供者不可供其他应用程序使用。将android:exported="false"
设置为将对提供者的访问权限限制为您的应用程序。只有与提供者具有相同用户 ID (UID) 的应用程序,或通过android:grantUriPermissions
元素暂时被授予访问提供者权限的应用程序才能访问它。
由于此属性是在 API 级别 17 中引入的,因此所有运行 API 级别 16 及更低版本的设备的行为就像此属性设置为
"true"
一样。如果您将android:targetSdkVersion
设置为 17 或更高版本,则对于运行 API 级别 17 及更高版本的设备,默认值为"false"
。您可以将
android:exported="false"
设置为,并仍然使用permission
属性设置权限来限制对提供者的访问。 -
android:grantUriPermissions
- 那些通常没有权限访问内容提供者数据的用户是否可以被授予访问权限,从而暂时克服由
readPermission
、writePermission
、permission
和exported
属性施加的限制。如果可以授予权限,则为
"true"
,否则为"false"
。如果为"true"
,则可以授予对内容提供者的任何数据的权限。如果为"false"
,则只能授予对<grant-uri-permission>
子元素(如果有)中列出的数据子集的权限。默认值为"false"
。授予权限是为应用程序组件提供一次性访问受权限保护的数据的一种方式。例如,当电子邮件包含附件时,邮件应用程序可能会调用相应的查看器来打开它,即使查看器没有查看所有内容提供者数据的常规权限。
在这种情况下,权限是通过
FLAG_GRANT_READ_URI_PERMISSION
和FLAG_GRANT_WRITE_URI_PERMISSION
标志在激活组件的Intent
对象中授予的。例如,邮件应用程序可能会将FLAG_GRANT_READ_URI_PERMISSION
放入传递给Context.startActivity()
的Intent
中。该权限特定于Intent
中的 URI。如果您启用了此功能(通过将此属性设置为
"true"
或通过定义<grant-uri-permission>
子元素),请在从提供者中删除受保护的 URI 时调用Context.revokeUriPermission()
。另请参阅
<grant-uri-permission>
元素。 android:icon
- 代表内容提供者的图标。此属性设置为对包含图像定义的可绘制资源的引用。如果没有设置,则使用为整个应用程序指定的图标。有关更多信息,请参阅
<application>
元素的icon
属性。 android:initOrder
- 相对于托管在同一进程中的其他内容提供者,内容提供者实例化的顺序。当内容提供者之间存在依赖关系时,为每个提供者设置此属性可以确保它们按依赖关系所需的顺序创建。该值是一个整数,数字越大,越先初始化。
android:label
- 提供内容的用户可读标签。如果没有设置此属性,则使用为整个应用程序设置的标签。有关更多信息,请参阅
<application>
元素的label
属性。标签通常设置为对字符串资源的引用,以便它可以像用户界面中的其他字符串一样进行本地化。但是,为了方便您在开发应用程序时,它也可以设置为原始字符串。
android:multiprocess
- 如果应用程序在多个进程中运行,此属性决定是否创建多个内容提供者实例。如果为
"true"
,则应用程序的每个进程都有自己的内容提供者对象。如果为"false"
,则应用程序的进程只共享一个内容提供者对象。默认值为"false"
。将此标志设置为
"true"
可以通过减少进程间通信的开销来提高性能,但它也会增加每个进程的内存占用量。 android:name
- 实现内容提供者的类的名称,它是
ContentProvider
的子类。这通常是一个完全限定的类名,例如"com.example.project.TransportationProvider"
。但是,作为一种简写,如果名称的第一个字符是句点,它将附加到<manifest>
元素中指定的包名。没有默认值。必须指定名称。
android:permission
- 客户端必须具有的权限,才能读取或写入内容提供者的数据。此属性是为读取和写入设置单个权限的便捷方法。但是,
readPermission
、writePermission
和grantUriPermissions
属性优先于此属性。如果也设置了
readPermission
属性,它将控制查询内容提供者的访问权限。如果设置了writePermission
属性,它将控制修改提供者数据的访问权限。 android:process
- 内容提供者运行的进程的名称。通常,应用程序的所有组件都在为应用程序创建的默认进程中运行。它与应用程序包具有相同的名称。
<application>
元素的process
属性可以为所有组件设置不同的默认值。但是每个组件都可以使用它自己的process
属性覆盖默认值,让您可以在多个进程中传播应用程序。如果分配给此属性的名称以冒号 (
:
) 开头,则在需要时会创建一个对应用程序私有的新进程,并且活动将在该进程中运行。如果进程名称以小写字母开头,则活动将在具有该名称的全局进程中运行,前提是它有权这样做。这允许不同应用程序中的组件共享一个进程,从而减少资源使用量。
android:readPermission
客户端必须具有的权限,才能查询内容提供者。
如果提供者将
android:grantUriPermissions
设置为"true"
,或者给定的客户端满足<grant-uri-permission>
子元素的条件,则该客户端可以暂时获得对内容提供者数据的读取访问权限。另请参阅
permission
和writePermission
属性。android:syncable
- 内容提供者控制下的数据是否可以与服务器上的数据同步。如果可以,则为
"true"
,否则为"false"
。 android:writePermission
客户端需要更改内容提供者控制的数据的权限。
如果提供者将
android:grantUriPermissions
设置为"true"
,或者给定的客户端满足<grant-uri-permission>
子元素的条件,则该客户端可以暂时获得写入访问权限,以修改内容提供者的数据。另请参阅
permission
和readPermission
属性。
- 在中引入
- API 级别 1
- 另请参阅
- 内容提供程序
此页面上的内容和代码示例受 内容许可 中描述的许可证约束。Java 和 OpenJDK 是 Oracle 和/或其附属公司的商标或注册商标。
上次更新时间:2023 年 5 月 4 日世界协调时间。
[{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"缺少我需要的信息" },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"太复杂/步骤太多" },{ "type": "thumb-down", "id": "outOfDate", "label":"已过时" },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"示例/代码问题" },{ "type": "thumb-down", "id": "otherDown", "label":"其他" }]
[{ "type": "thumb-up", "id": "easyToUnderstand", "label":"易于理解" },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"解决了我的问题" },{ "type": "thumb-up", "id": "otherUp", "label":"其他" }]
{ "lastModified": "上次更新时间:2023 年 5 月 4 日世界协调时间。", "confidential": False }