- 語法:
-
<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
引數中加入配置或路徑,而只加入主機名稱。如要瞭解如何使用及開發內容供應器,請參閱內容供應器 API 指南。
- 屬性:
-
android:authorities
- 包含一或多個 URI 主機名稱的清單,用於識別內容供應器提供的資料。如有多個主機名稱,則以半形分號區隔列出。為了避免衝突,主機名稱應使用 Java 式命名慣例 (例如
com.example.provider.cartoonprovider
)。通常這是實作供應器的ContentProvider
子類別名稱。這項屬性沒有預設值。且至少須指定一個主機名稱。
android:enabled
- 表示內容供應器是否可由系統執行個體化。如果可以,則為「
true
」;如果不可以,則為「false
」。預設值是「true
」。<application>
元素有專屬的enabled
屬性,適用於包括內容供應器在內的所有應用程式元件。<application>
和<provider>
屬性都必須是「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"
。您可以透過
permission
屬性設定權限,這樣就能設定android:exported="false"
,同時限制供應器的存取權。 -
android:grantUriPermissions
- 指出通常無權存取內容供應器資料者是否能夠獲得存取權,暫時略過
readPermission
、writePermission
、permission
和exported
屬性設下的限制。「true
」表示可以獲得權限,「false
」表示無法獲得權限。如果設為「true
」,表示可以授予內容供應器所有資料的權限。如果設為「false
」,則只能授予<grant-uri-permission>
子元素 (如果有) 中所列資料子集的存取權。預設值是「false
」。如要為應用程式元件授予一次性存取權,讓該元件存取受權限保護的資料,其中一個方法就是直接授予權限。舉例來說,如果電子郵件包含附件,郵件應用程式可能會呼叫適當的檢視器來開啟附件,即使該檢視器沒有查看內容供應器所有資料的一般權限也一樣。
在這類情況下,權限是透過啟動元件的意圖物件所含的
和FLAG_GRANT_READ_URI_PERMISSION
標記授予。舉例來說,郵件應用程式可能會在傳遞至FLAG_GRANT_WRITE_URI_PERMISSION
Context.startActivity()
的意圖中放置FLAG_GRANT_READ_URI_PERMISSION
。該權限是意圖所含 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 和/或其關係企業的商標或註冊商標。
上次更新時間:2022-09-18 (世界標準時間)。
[{
"type": "thumb-down",
"id": "missingTheInformationINeed",
"label":"缺少我需要的資訊"
},{
"type": "thumb-down",
"id": "tooComplicatedTooManySteps",
"label":"過於複雜/步驟過多"
},{
"type": "thumb-down",
"id": "outOfDate",
"label":"過時"
},{
"type": "thumb-down",
"id": "translationIssue",
"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":"其他"
}]