Mô-đun MediaProvider tối ưu hoá siêu dữ liệu được lập chỉ mục (âm thanh, video và hình ảnh từ thẻ SD và thiết bị USB), đồng thời cung cấp dữ liệu đó cho các ứng dụng thông qua API công khai MediaStore. Để duy trì quyền riêng tư của người dùng, mô-đun MediaProvider thực thi mô hình bảo mật bộ nhớ có giới hạn được giới thiệu trong Android 10, bao gồm cả việc loại bỏ siêu dữ liệu vị trí nhạy cảm. Mô-đun này có thể cập nhật, cho phép Android phản hồi nhanh hơn các vấn đề bảo mật (bảo vệ dữ liệu nhạy cảm của người dùng) và thêm các định dạng nội dung đa phương tiện mới nhanh hơn (cung cấp tính nhất quán cho cả người dùng và nhà phát triển).
Các thay đổi trong Android 10
Android 10 đã giới thiệu một số điểm cải tiến liên quan đến việc xác định và trích xuất dữ liệu từ các tệp nội dung nghe nhìn, cụ thể là:
Xác định loại nội dung tệp bằng phần đầu tiên thuộc loại MIME của tệp. Ví dụ: hệ điều hành biết rằng cả
image/png
vàimage/x-newly-invented-format
đều là hình ảnh, do đó có thể mô tả chính xác các quyền liên quan cho người dùng cuối.Xác định loại MIME chỉ bằng cách sử dụng đuôi tệp (và không sử dụng tính năng nắm bắt nội dung để tránh các vấn đề bảo mật).
Xác định loại MIME của một tệp tuỳ ý bằng cách kết hợp các ánh xạ ngược dòng của Debian Linux và Android.
Trả về dữ liệu có liên quan từ các tệp
video/*
vàaudio/*
(thông quaMediaMetadataRetriever
) và tệpimage/*
(thông quaExifInterface
).
Các thay đổi trong Android 11
Trong Android 11, mô-đun MediaProvider dựa trên các thay đổi đã thực hiện trong Android 10 với các điểm cải tiến sau:
Cải tiến tính năng lập chỉ mục. Mô-đun MediaProvider hiện lập chỉ mục siêu dữ liệu bằng cách điều chỉnh siêu dữ liệu có sẵn với các API công khai của MediaStore. Các thay đổi bao gồm:
Cột
is_favorite
và đối sốQUERY_ARG_MATCH_FAVORITE
mới để cho phép các ứng dụng kiểu thư viện nhanh chóng lọc nội dung nghe nhìn dựa trên cột này.Lập chỉ mục siêu dữ liệu hệ màu.
Cột "is_trashed" mới và đối số
QUERY_ARG_MATCH_TRASHED
để cho phép các ứng dụng kiểu thư viện lọc dựa trên cột này.Các API mới cho phép sửa đổi hàng loạt nhiều mục bằng một lời nhắc hộp thoại người dùng, bao gồm
createDeleteRequest()
,createFavoriteRequest()
,createTrashRequest()
vàcreateWriteRequest()
.Cột
GENERATION_ADDED
vàGENERATION_MODIFIED
mới giúp bạn phát hiện nhanh chóng và đáng tin cậy các thay đổi xảy ra kể từ điểm đồng bộ hoá trước đó.API công khai
GROUP BY
mới để dùng với các cột siêu dữ liệu bổ sung không được đề cập ở trên.
Cải tiến
ExifInterface
để trích xuất siêu dữ liệu từ các vùng chứa PNG và WebP.Cải tiến
SystemUI
để ghi siêu dữ liệuDateTimeOriginal
trong ảnh chụp màn hình.
Ngoài ra, giờ đây, bạn có thể tuỳ chỉnh MediaProvider bằng cách thêm các định dạng nội dung nghe nhìn mới, đánh dấu thiết bị lưu trữ cần được lập chỉ mục và thậm chí thay thế ngăn xếp MTP. Để biết thông tin chi tiết, hãy xem bài viết Tuỳ chỉnh.
Ranh giới mô-đun
Android 11 di chuyển tất cả mã trong packages/providers/MediaProvider
sang một vị trí mới, với ngoại lệ đáng chú ý là logic liên quan đến MTP. Ngoài ra, frameworks/base/core/java/android/provider/MediaStore.java
hiện ở bên trong ranh giới mô-đun tại packages/providers/MediaProvider
.
Định dạng gói
Mô-đun MediaProvider ở định dạng APK-in-APEX.
Phần phụ thuộc
Các phần phụ thuộc MediaProvider có liên quan đến tuỳ chỉnh (nghĩa là nếu tuỳ chỉnh MediaProvider, bạn phải đảm bảo phương thức triển khai của mình đáp ứng phần phụ thuộc có liên quan đến việc tuỳ chỉnh).
Khi sử dụng các định dạng tệp nội dung nghe nhìn tuỳ chỉnh hoặc không chuẩn (ví dụ: định dạng do ứng dụng Máy ảnh của nhà cung cấp tạo ra), bạn phải đăng ký từng định dạng tuỳ chỉnh với
MimeUtils
và mô-đun Trình trích xuất nội dung nghe nhìn để cho phép MediaProvider lập chỉ mục.Để đảm bảo MediaProvider lập chỉ mục một tập hợp thiết bị lưu trữ tuỳ chỉnh (như khe thẻ SD và cổng USB) dùng trong quá trình triển khai
StorageManagerService
, hãy đặt cờVolumeInfo.MOUNT_FLAG_INDEXABLE
.Khi sử dụng phương thức triển khai MTP tuỳ chỉnh (không phải AOSP), hãy đảm bảo phương thức triển khai chỉ dựa vào các API công khai và hệ thống để cho phép phương thức triển khai tương tác với MediaStore.
Tuỳ chỉnh
Giờ đây, bạn có thể thêm các định dạng nội dung nghe nhìn mới, ảnh hưởng đến việc thiết bị lưu trữ nào được lập chỉ mục và thay thế ngăn xếp MTP.
Định dạng nội dung nghe nhìn tuỳ chỉnh. Đối với mỗi định dạng nội dung nghe nhìn tuỳ chỉnh mới, bạn phải cung cấp một ánh xạ từ đuôi tệp duy nhất đến một loại MIME. Bạn nên làm theo quy trình đăng ký của IANA.
Bạn không thể xác định lại một tiện ích hoặc loại MIME đã được xác định trong AOSP.
Đối với các tệp
video/*
vàaudio/*
, MediaProvider tiếp tục tư vấn choMediaMetadataRetriever
. Hãy sử dụng Trình trích xuất nội dung đa phương tiện của Android 10 để trả về siêu dữ liệu cho các định dạng tuỳ chỉnh.Đối với tệp
image/*
, MediaProvider tiếp tục chuẩn hoá trênExif
cho siêu dữ liệu. Bạn có thể mở rộngandroid.media.ExifInterface
để trích xuất và trả về siêu dữ liệuExif
cho mọi định dạng hình ảnh tuỳ chỉnh.
Cờ lập chỉ mục thiết bị lưu trữ. MediaProvider lập chỉ mục tất cả các phương tiện do
StorageManager.getStorageVolumes()
trả về, trong đóStorageVolume.getMediaStoreVolumeName()
không phải là giá trị rỗng. Bạn có thể tuỳ chỉnh danh sách các phương tiện được trả về để ảnh hưởng đến nội dung được lập chỉ mục, nhưng bạn không nên thêm các phương tiện nhớ tạm thời (chẳng hạn như ổ đĩa USB OTG).Thay thế ngăn xếp MTP. Android 11 đặt ngăn xếp MTP hoàn toàn bên ngoài ranh giới mô-đun và đảm bảo rằng ngăn xếp này hoạt động với các API công khai.
Thử nghiệm
Bạn có thể xác minh chức năng của MediaProvider bằng cách sử dụng các kiểm thử sau:
Để xác minh chức năng của các API công khai MediaStore, hãy sử dụng các chương trình kiểm thử trong gói
CtsProviderTestCases
của Bộ kiểm thử tính tương thích với Android (CTS).Để xác minh chức năng của các thành phần nội bộ MediaProvider, hãy sử dụng các chương trình kiểm thử trong
MediaProviderTests
.
Để chạy cả hai nhóm kiểm thử cùng lúc, hãy sử dụng lệnh atest
sau:
atest --test-mapping packages/providers/MediaProvider