- cú pháp:
-
<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>
- có trong:
-
<application>
- có thể chứa:
<meta-data>
<grant-uri-permission>
<intent-filter>
<path-permission>
- mô tả:
-
Khai báo thành phần của nhà cung cấp nội dung. Nhà cung cấp nội dung (content provider) là một lớp con của
ContentProvider
cung cấp quyền truy cập có cấu trúc vào dữ liệu do ứng dụng quản lý. Tất cả nhà cung cấp nội dung trong ứng dụng của bạn đều phải được định nghĩa trong một phần tử<provider>
trong tệp kê khai; nếu không, hệ thống sẽ không nhận ra và không chạy các lớp đó.Bạn chỉ khai báo nhà cung cấp nội dung nằm trong ứng dụng của bạn. Bạn không nên khai báo nhà cung cấp nội dung trong các ứng dụng khác mà bạn sử dụng trong ứng dụng của mình.
Hệ thống Android lưu trữ các tệp tham chiếu đến nhà cung cấp nội dung theo chuỗi authority, một phần trong URI nội dung của nhà cung cấp. Ví dụ: giả sử bạn muốn truy cập vào nhà cung cấp nội dung lưu trữ thông tin về chăm sóc sức khỏe chuyên nghiệp. Để thực hiện việc này, bạn cần gọi phương thức
ContentResolver.query()
, đối số này cùng với các đối số khác cần có một URI để xác định nhà cung cấp:content://com.example.project.healthcareprovider/nurses/rn
Lược đồ (scheme)
content:
xác định URI là một URI nội dung trỏ đến một nhà cung cấp nội dung Android. Authoritycom.example.project.healthcareprovider
tự xác định nhà cung cấp; hệ thống Android tra cứu authority trong danh sách nhà cung cấp đã biết và authority tương ứng. Chuỗi connurses/rn
là một đường dẫn mà nhà cung cấp nội dung có thể sử dụng để xác định các tập hợp con trong dữ liệu của nhà cung cấp.Hãy lưu ý rằng khi bạn xác định nhà cung cấp trong phần tử
<provider>
, bạn sẽ không đưa lược đồ hoặc đường dẫn đó vào đối sốandroid:name
mà chỉ đưa authority vào.Để biết thông tin về cách sử dụng và phát triển nhà cung cấp nội dung, hãy xem hướng dẫn về API, Nhà cung cấp nội dung.
- thuộc tính:
-
android:authorities
-
Danh sách một hoặc nhiều authority URI xác định dữ liệu do nhà cung cấp nội dung cung cấp.
Nhiều authority có tên trong danh sách bằng cách phân tách tên bằng dấu chấm phẩy.
Để tránh xung đột, tên authority nên sử dụng quy ước đặt tên kiểu Java (chẳng hạn như
com.example.provider.cartoonprovider
). Thông thường, đó là tên của lớp conContentProvider
triển khai nhà cung cấpKhông có tuỳ chọn mặc định. Bạn phải chỉ định ít nhất một quyền.
android:enabled
- Hệ thống có thể khởi tạo nhà cung cấp nội dung hay không — "
true
" nếu có thể và "false
" nếu không thể. Giá trị mặc định là "true
".Phần tử
<application>
có thuộc tínhenabled
riêng áp dụng cho tất cả thành phần của ứng dụng, bao gồm cả nhà cung cấp nội dung. Thuộc tính<application>
và<provider>
đều phải là "true
" (vì cả hai đều theo mặc định) để nhà cung cấp nội dung được bật. Nếu là "false
", tức là nhà cung cấp này đã bị vô hiệu hoá; thì không thể tạo thực thể. android:directBootAware
Nhà cung cấp nội dung có nhận biết việc khởi động trực tiếp hay không; nghĩa là có thể chạy trước khi người dùng mở khoá thiết bị hay không.
Lưu ý: Trong phương thức Direct Boot (Khởi động trực tiếp), nhà cung cấp nội dung trong ứng dụng của bạn chỉ có thể truy cập vào dữ liệu được lưu trữ trong bộ nhớ bảo vệ thiết bị.
Giá trị mặc định là
"false"
.android:exported
-
Liệu các ứng dụng khác có dùng được nhà cung cấp nội dung hay không:
-
true
: Ứng dụng khác dùng được nhà cung cấp này. Mọi ứng dụng đều có thể dùng URI nội dung của nhà cung cấp để truy cập, tuỳ thuộc vào các quyền được chỉ định cho nhà cung cấp. -
false
: Nhà cung cấp không hỗ trợ các ứng dụng khác. Đặtandroid:exported="false"
để giới hạn quyền truy cập của nhà cung cấp vào các ứng dụng của bạn. Chỉ những ứng dụng có cùng mã nhận dạng người dùng (UID) với nhà cung cấp hoặc các ứng dụng tạm thời được cấp quyền truy cập vào nhà cung cấp đó thông quaandroid:grantUriPermissions
mới có quyền truy cập.
Vì thuộc tính này được giới thiệu trong API cấp 17, nên tất cả thiết bị chạy API cấp 16 trở xuống đều hoạt động như thể bạn đã đặt thuộc tính này là
"true"
. Nếu bạn đặtandroid:targetSdkVersion
thành 17 trở lên, thì giá trị mặc định sẽ là"false"
đối với thiết bị chạy API cấp 17 trở lên.Bạn có thể thiết lập
android:exported="false"
nhưng vẫn giới hạn quyền truy cập của nhà cung cấp bằng cách đặt các quyền bằng thuộc tínhpermission
. -
android:grantUriPermissions
- Cho dù những người thường xuyên không có quyền truy cập vào dữ liệu của nhà cung cấp nội dung có thể được cấp quyền làm như vậy hay không, hãy tạm thời vượt qua hạn chế do thuộc tính
readPermission
,writePermission
,permission
vàexported
đặt ra — "true
" nếu quyền có thể được cấp và "false
" nếu không. Nếu có "true
", bạn có thể cấp quyền cho bất kỳ dữ liệu nào của nhà cung cấp nội dung. Nếu "false
", quyền chỉ có thể được cấp cho các tập hợp con của dữ liệu được liệt kê trong các phần tử phụ<grant-uri-permission>
, nếu có. Giá trị mặc định là "false
".Cấp quyền là một cách cấp cho một thành phần của ứng dụng quyền truy cập một lần vào dữ liệu được bảo vệ bằng quyền. Ví dụ: khi một thông báo email có chứa tệp đính kèm, ứng dụng thư có thể kêu gọi người xem thích hợp mở tệp đó, mặc dù người xem không có quyền chung để xem tất cả dữ liệu của nhà cung cấp nội dung.
Trong những trường hợp như vậy,
vàFLAG_GRANT_READ_URI_PERMISSION
sẽ gắn cờ trong đối tượng Ý định (Intent) để kích hoạt thành phần đó. Ví dụ: ứng dụng thư có thể đặtFLAG_GRANT_WRITE_URI_PERMISSION
FLAG_GRANT_READ_URI_PERMISSION
trong Ý định được chuyển đếnContext.startActivity()
. Quyền này chỉ dành riêng cho URI trong Ý định.Nếu bật tính năng này, bằng cách đặt thuộc tính này thành "
true
" hoặc bằng cách xác định<grant-uri-permission>
các phần tử phụ, bạn phải gọi
khi một URI ở trong cùng bị xoá khỏi nhà cung cấp.Context.revokeUriPermission()
Ngoài ra, hãy xem phần tử
<grant-uri-permission>
. android:icon
- Biểu tượng thể hiện nhà cung cấp nội dung.
Bạn phải đặt thuộc tính này làm tệp đối chiếu đến một tài nguyên có thể vẽ và chứa định nghĩa hình ảnh. Nếu bạn không đặt chính sách này, hệ thống sẽ sử dụng biểu tượng đã chỉ định cho toàn bộ ứng dụng (xem thuộc tính
icon
của phần tử<application>
). android:initOrder
- Thứ tự tạo thực thể của nhà cung cấp nội dung có liên quan đến các nhà cung cấp nội dung khác lưu trữ trong cùng một quy trình. Khi có các phần phụ thuộc giữa các nhà cung cấp nội dung, việc đặt thuộc tính này cho từng nhà cung cấp sẽ đảm bảo rằng thuộc tính được tạo theo thứ tự bắt buộc của các phần phụ thuộc đó. Giá trị là một số nguyên đơn giản, số nào cao hơn sẽ được khởi chạy trước.
android:label
- Nhãn người dùng có thể đọc được cho nội dung bạn cung cấp.
Nếu bạn không đặt thuộc tính này, thì nhãn được đặt cho toàn bộ ứng dụng sẽ được sử dụng (xem thuộc tính
label
của phần tử<application>
).Nhãn phải được đặt là một tham chiếu đến tài nguyên chuỗi để có thể bản địa hoá nhãn như các chuỗi khác trong giao diện người dùng. Tuy nhiên, để thuận tiện trong khi bạn đang phát triển ứng dụng, ứng dụng này cũng có thể được đặt dưới dạng chuỗi thô.
android:multiprocess
- Nếu ứng dụng chạy trong nhiều quá trình, thuộc tính này sẽ xác định xem có nhiều phiên bản của nhà cung cấp nội dung được tạo hay không. Nếu là
true
, mỗi quy trình của ứng dụng sẽ có đối tượng nhà cung cấp nội dung riêng. Nếufalse
, các quy trình của ứng dụng chỉ chia sẻ một đối tượng nhà cung cấp nội dung. Giá trị mặc định làfalse
.Việc đặt cờ này thành
true
có thể cải thiện hiệu quả hoạt động bằng cách giảm mức hao tổn giao tiếp liên quy trình, nhưng cũng làm tăng mức sử dụng bộ nhớ của mỗi quy trình. android:name
- Tên của lớp triển khai nhà cung cấp nội dung, một lớp con của
ContentProvider
. Đây phải là một tên lớp đủ điều kiện (chẳng hạn như "com.example.project.TransportationProvider
"). Tuy nhiên, nếu viết tắt ký tự đầu tiên của tên bằng một dấu chấm, tên gói sẽ được bổ sung như chỉ định trong phần tử<manifest>
.Không có tuỳ chọn mặc định. Bạn phải chỉ định tên.
android:permission
- Tên của một quyền mà ứng dụng khách phải đọc hoặc ghi dữ liệu của nhà cung cấp nội dung. Thuộc tính này là một cách thuận tiện để đặt một quyền duy nhất cho cả chế độ đọc và ghi. Tuy nhiên, các thuộc tính
readPermission
,writePermission
vàgrantUriPermissions
sẽ được ưu tiên hơn lựa chọn này. Nếu bạn cũng đặt thuộc tínhreadPermission
, thuộc tính này sẽ kiểm soát quyền truy cập để truy vấn nhà cung cấp nội dung. Nếu bạn đặt thuộc tínhwritePermission
, thuộc tính này sẽ kiểm soát quyền truy cập để sửa đổi dữ liệu của nhà cung cấp.Để biết thêm thông tin về các quyền, hãy xem mục Quyền trong phần giới thiệu và một tài liệu riêng có tên Bảo mật và quyền.
android:process
- Tên của quy trình mà nhà cung cấp nội dung sẽ chạy. Thường thì tất cả thành phần của ứng dụng sẽ chạy trong quy trình mặc định được tạo cho ứng dụng. Quy trình này có cùng tên với gói ứng dụng. Thuộc tính
process
của phần tử<application>
có thể đặt một giá trị mặc định khác cho tất cả thành phần. Tuy nhiên, mỗi thành phần có thể ghi đè giá trị mặc định bằng thuộc tínhprocess
riêng, cho phép bạn trải rộng ứng dụng của mình trên nhiều quy trình.Nếu tên gán cho thuộc tính này bắt đầu bằng dấu hai chấm (":"), thì một quy trình mới (dành riêng cho ứng dụng) sẽ được tạo khi cần và hoạt động sẽ chạy trong quy trình đó. Nếu tên quy trình bắt đầu bằng một ký tự viết thường, thì hoạt động sẽ chạy trong một quy trình chung của tên đó, miễn là có quyền làm như vậy. Điều này cho phép các thành phần trong nhiều ứng dụng chia sẻ một quy trình, giúp giảm mức sử dụng tài nguyên.
android:readPermission
Quyền mà ứng dụng khách phải truy vấn nhà cung cấp nội dung.
Nếu nhà cung cấp đặt
android:grantUriPermissions
thànhtrue
hoặc nếu một ứng dụng khách cụ thể đáp ứng các điều kiện của phần tử con<grant-uri-permission>
, thì ứng dụng có thể nhận được quyền đọc tạm thời đối với dữ liệu của nhà cung cấp nội dung.Ngoài ra, hãy xem thuộc tính
permission
vàwritePermission
.android:syncable
- Dữ liệu thuộc sự kiểm soát của nhà cung cấp nội dung có được đồng bộ hoá với dữ liệu trên máy chủ hay không — "
true
" nếu được đồng bộ hoá và "false
" nếu không. android:writePermission
Một quyền mà ứng dụng khách phải có để thay đổi dữ liệu do nhà cung cấp nội dung kiểm soát.
Nếu nhà cung cấp đặt
android:grantUriPermissions
thànhtrue
hoặc nếu một ứng dụng khách cụ thể đáp ứng các điều kiện của phần tử con<grant-uri-permission>
, thì ứng dụng có thể nhận được quyền ghi tạm thời để chỉnh sửa dữ liệu của nhà cung cấp nội dung.Ngoài ra, hãy xem thuộc tính
permission
vàreadPermission
.
- ra mắt từ:
- API cấp 1
- xem thêm:
- Nhà cung cấp nội dung
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2022-09-13 UTC.
[{
"type": "thumb-down",
"id": "missingTheInformationINeed",
"label":"Thiếu thông tin tôi cần"
},{
"type": "thumb-down",
"id": "tooComplicatedTooManySteps",
"label":"Quá phức tạp/quá nhiều bước"
},{
"type": "thumb-down",
"id": "outOfDate",
"label":"Đã lỗi thời"
},{
"type": "thumb-down",
"id": "translationIssue",
"label":"Vấn đề về bản dịch"
},{
"type": "thumb-down",
"id": "samplesCodeIssue",
"label":"Vấn đề về mẫu/mã"
},{
"type": "thumb-down",
"id": "otherDown",
"label":"Khác"
}]
[{
"type": "thumb-up",
"id": "easyToUnderstand",
"label":"Dễ hiểu"
},{
"type": "thumb-up",
"id": "solvedMyProblem",
"label":"Giúp tôi giải quyết được vấn đề"
},{
"type": "thumb-up",
"id": "otherUp",
"label":"Khác"
}]