- 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. Trình cung cấp nội dung 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ý. Mọi trình cung cấp nội dung trong ứng dụng của bạn đều phải được xác định trong phần tử<provider>
của tệp kê khai. Nếu không, hệ thống sẽ không nhận ra và không chạy các trình cung cấp đó.Chỉ khai báo trình cung cấp nội dung thuộc ứng dụng của bạn. Đừng khai báo trình cung cấp nội dung trong các ứng dụng khác mà bạn dùng trong ứng dụng đó.
Hệ thống Android lưu trữ các tệp tham chiếu đến trình cung cấp nội dung theo chuỗi đơn vị quản lý, một phần trong URI nội dung của trình cung cấp. Ví dụ: giả sử bạn muốn truy cập vào trình cung cấp nội dung lưu trữ thông tin về chuyên gia chăm sóc sức khoẻ. Để thực hiện việc này, bạn sẽ gọi phương thức
ContentResolver.query()
. Phương thức này sẽ nhận một URI xác định trình cung cấp, ngoài các đối số khác:content://com.example.project.healthcareprovider/nurses/rn
Giao thức
content:
xác định URI là một URI nội dung trỏ đến một trình cung cấp nội dung Android. Đơn vị quản lýcom.example.project.healthcareprovider
xác định chính trình cung cấp đó. Hệ thống Android tra cứu đơn vị quản lý trong danh sách trình cung cấp đã biết và đơn vị quản lý tương ứng. Chuỗi connurses/rn
là một đường dẫn mà trình cung cấp nội dung dùng để xác định các tập hợp con của dữ liệu trình cung cấp.Khi xác định trình cung cấp trong phần tử
<provider>
, bạn không được đưa giao thức hoặc đường dẫn đó vào đối sốandroid:name
mà chỉ đưa đơn vị quản lý vào.Để biết thông tin về cách sử dụng và phát triển trình cung cấp nội dung, hãy xem bài viết Trình cung cấp nội dung.
- thuộc tính:
-
android:authorities
-
Danh sách một hoặc nhiều đơn vị quản lý URI xác định dữ liệu do trình cung cấp nội dung cung cấp.
Liệt kê nhiều đơn vị quản lý bằng cách dùng dấu chấm phẩy phân tách tên của đơn vị quản lý.
Để tránh xung đột, hãy dùng quy ước đặt tên kiểu Java cho tên của đơn vị quản lý, chẳng hạn như
com.example.provider.cartoonprovider
. Thông thường, đó là tên của lớp conContentProvider
triển khai trình cung cấpKhông có giá trị mặc định. Bạn phải chỉ định ít nhất một đơn vị quản lý.
android:enabled
- Liệu hệ thống có thể tạo thực thể cho trình cung cấp nội dung hay không. Giá trị này sẽ là
"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 mọi thành phần của ứng dụng, bao gồm cả trình cung cấp nội dung. Cả hai thuộc tính<application>
và<provider>
đều phải có giá trị"true"
, vì cả hai đều được bật trình cung cấp nội dung theo mặc định. Nếu giá trị là"false"
, thì trình cung cấp sẽ bị vô hiệu hoá. Không thể tạo thực thể. android:directBootAware
Liệu trình cung cấp nội dung có nhận biết khi khởi động trực tiếp hay không – tức là trình cung cấp đó có thể chạy trước khi người dùng mở khoá thiết bị không.
Lưu ý: Trong phương thức Direct Boot (Khởi động trực tiếp), trì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ớ được bảo vệ của 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 trình cung cấp nội dung hay không.
-
"true"
: các ứng dụng khác dùng được trình cung cấp này. Mọi ứng dụng đều có thể dùng URI nội dung của trình cung cấp để truy cập, tuỳ thuộc vào các quyền được chỉ định cho trình cung cấp này. -
"false"
: các ứng dụng khác không dùng được trình cung cấp này. Đặtandroid:exported="false"
để chỉ cho phép các ứng dụng của bạn truy cập vào trình cung cấp này. Chỉ những ứng dụng có cùng mã nhận dạng người dùng (UID) với trình cung cấp này, hoặc các ứng dụng tạm thời được cấp quyền truy cập vào trình cung cấp này thông qua phần tửandroid:grantUriPermissions
mới có quyền truy cập.
Vì thuộc tính này được ra mắt trong API cấp 17, nên mọi 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ể đặt
android:exported="false"
mà vẫn giới hạn quyền truy cập vào trình cung cấp của mình bằng cách đặt các quyền bằng thuộc tínhpermission
. -
android:grantUriPermissions
- Cho dù những người dùng thường không có quyền truy cập vào dữ liệu của trình cung cấp nội dung vẫn có thể được cấp quyền truy cập, hãy tạm thời khắc phục những hạn chế do thuộc tính
readPermission
,writePermission
,permission
vàexported
đặt ra.Giá trị sẽ là
"true"
nếu có thể cấp quyền và"false"
nếu không thể. Nếu giá trị là"true"
, bạn có thể cấp quyền cho bất kỳ dữ liệu nào của trình cung cấp nội dung. Nếu giá trị là"false"
, bạn chỉ có thể cấp quyền cho những tập hợp con dữ liệu được liệt kê trong các phần tử con<grant-uri-permission>
, nếu có. Giá trị mặc định là"false"
.Cấp quyền là phương thức 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ư 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 đó, ngay cả khi người xem không có quyền chung để xem tất cả dữ liệu của trình cung cấp nội dung.
Trong những trường hợp như vậy, quyền sẽ được cấp bằng cờ
FLAG_GRANT_READ_URI_PERMISSION
vàFLAG_GRANT_WRITE_URI_PERMISSION
trong đối tượngIntent
kích hoạt thành phần đó. Ví dụ: ứng dụng thư có thể đặtFLAG_GRANT_READ_URI_PERMISSION
trongIntent
được chuyển choContext.startActivity()
. Quyền này dành riêng cho URI trongIntent
.Nếu bạn 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 các phần tử con<grant-uri-permission>
, hãy gọiContext.revokeUriPermission()
khi một URI ở trong cùng bị xoá khỏi trình cung cấp.Xem thêm phần tử
<grant-uri-permission>
. android:icon
- Biểu tượng thể hiện trình cung cấp nội dung.
Thuộc tính này được đặt làm tham 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 thuộc tính này, hệ thống sẽ dùng biểu tượng được chỉ định cho toàn bộ ứng dụng. Để biết thêm thông tin, hãy xem thuộc tính
icon
của phần tử<application>
. android:initOrder
- Thứ tự tạo thực thể cho trình cung cấp nội dung, so với các trì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 trình cung cấp nội dung, việc đặt thuộc tính này cho từng trì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, số nào cao hơn sẽ được khởi động trước.
android:label
- Nhãn mà người dùng đọc được cho nội dung bạn cung cấp.
Nếu bạn không đặt thuộc tính này, nhãn được đặt chung cho ứng dụng sẽ được dùng. Để biết thêm thông tin, hãy xem thuộc tính
label
của phần tử<application>
.Nhãn thường được đặt làm tham chiếu đến tài nguyên chuỗi để có thể được bản địa hoá như các chuỗi khác trong giao diện người dùng. Tuy nhiên, để thuận tiện trong quá trình phát triển ứng dụng, bạn cũng có thể đặt nhãn này làm 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ếu"false"
, 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 suất 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 trình cung cấp nội dung, một lớp con của
ContentProvider
. Tên này thường là tên lớp đủ điều kiện, chẳng hạn như"com.example.project.TransportationProvider"
. Tuy nhiên, ở dạng viết tắt, nếu ký tự đầu tiên của tên là một dấu chấm, thì hệ thống sẽ nối thêm tên gói được chỉ định trong phần tử<manifest>
.Không có giá trị 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ính
readPermission
, thuộc tính này sẽ kiểm soát quyền truy cập để truy vấn trì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 trình cung cấp.Để biết thêm thông tin về các quyền, hãy xem phần Quyền trên trang tổng quan về tệp kê khai ứng dụng và bài viết Mẹo bảo mật.
android:process
- Tên của quy trình mà trình cung cấp nội dung 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 mọi 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 hoạt động có quyền làm vậy. Điều này cho phép các thành phần trong nhiều ứng dụng dùng chung một quy trình, qua đó giúp giảm mức sử dụng tài nguyên.
android:readPermission
Quyền mà ứng dụng phải có để truy vấn trình cung cấp nội dung.
Nếu nhà cung cấp đặt
android:grantUriPermissions
thành"true"
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.Hãy xem thêm thuộc tính
permission
vàwritePermission
.android:syncable
- Liệu có thể đồng bộ hoá dữ liệu thuộc quyền kiểm soát của trình cung cấp nội dung với dữ liệu trên máy chủ hay không. Giá trị này sẽ là
"true"
nếu có thể và"false"
nếu không thể. android:writePermission
Quyền mà ứng dụng cần để thực hiện thay đổi đối với dữ liệu do trình cung cấp nội dung kiểm soát.
Nếu trình cung cấp này đặt
android:grantUriPermissions
thành"true"
hoặc nếu một ứng dụng 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 để sửa đổi dữ liệu của trì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:
- Trì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: 2024-08-22 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"
}]
{"lastModified": "C\u1eadp nh\u1eadt l\u1ea7n g\u1ea7n \u0111\u00e2y nh\u1ea5t: 2024-08-22 UTC."}
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2024-08-22 UTC."]]