- 语法
-
<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 的一部分)存储对内容提供器的引用。例如,假设您想要访问一个存储医疗保健专业人员信息的内容提供器。为此,您需要调用
ContentResolver.query()
方法,该方法接受一个标识提供器的 URI 以及其他参数。content://com.example.project.healthcareprovider/nurses/rn
content:
方案将 URI 标识为指向 Android 内容提供器的内容 URI。授权com.example.project.healthcareprovider
标识提供器本身。Android 系统在其已知提供器及其授权列表中查找该授权。子字符串nurses/rn
是一个路径,内容提供器使用它来标识提供器数据的子集。当您在
<provider>
元素中定义提供器时,android:name
参数中不包含方案或路径,只包含授权。有关使用和开发内容提供器的信息,请参阅内容提供器。
- 属性
-
android:authorities
- 一个或多个 URI 授权列表,用于标识内容提供器提供的数据。通过用分号分隔名称来列出多个授权。为避免冲突,请对授权名称使用 Java 风格的命名约定,例如
com.example.provider.cartoonprovider
。通常,它是实现提供器的ContentProvider
子类的名称。没有默认值。必须指定至少一个授权。
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"
。授予权限是一种让应用组件一次性访问受权限保护的数据的方式。例如,当电子邮件包含附件时,邮件应用可能会调用相应的查看器打开它,即使该查看器没有查看内容提供器所有数据的通用权限。
在这种情况下,权限由激活组件的
Intent
对象中的FLAG_GRANT_READ_URI_PERMISSION
和FLAG_GRANT_WRITE_URI_PERMISSION
标志授予。例如,邮件应用可能会将FLAG_GRANT_READ_URI_PERMISSION
放入传递给Context.startActivity()
的Intent
中。该权限特定于Intent
中的 URI。如果您通过将此属性设置为
"true"
或通过定义<grant-uri-permission>
子元素来启用此功能,则当提供器中删除受保护的 URI 时,请调用Context.revokeUriPermission()
。另请参阅
<grant-uri-permission>
元素。 android:icon
- 表示内容提供器的图标。此属性设置为指向包含图像定义的 drawable 资源的引用。如果未设置,则使用为整个应用指定的图标。有关更多信息,请参阅
<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
属性覆盖默认值,从而允许您将应用分布在多个进程中。如果分配给此属性的名称以冒号 (
:
) 开头,则会在需要时创建一个新的、应用私有的进程,并且 Activity 将在该进程中运行。如果进程名称以小写字符开头,则 Activity 将在该名称的全局进程中运行,前提是它具有这样做的权限。这允许不同应用中的组件共享一个进程,从而减少资源使用。
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
- 另请参阅
- 内容提供器
<provider>
本页上的内容和代码示例受内容许可中所述许可的约束。Java 和 OpenJDK 是 Oracle 和/或其关联公司的商标或注册商标。
最后更新时间:世界协调时间 2025-02-10。
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-02-10 UTC."],[],[]]