Mô-đun MediaProvider

Mô-đun MediaProvider tối ưu hóa 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) và 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 lưu trữ có phạm vi được giới thiệu trong Android 10, bao gồm việc sắp xếp lại 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 trước 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 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).

Những thay đổi trong Android 10

Android 10 đã giới thiệu một số 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 phương tiện, cụ thể:

  • Xác định loại nội dung tệp bằng phần đầu tiên của loại MIME của tệp. Ví dụ: HĐH biết rằng cả image/pngimage/x-newly-invented-format đều là hình ảnh và do đó có thể mô tả chính xác các quyền có liên quan cho người dùng cuối.

  • Xác định loại MIME chỉ sử dụng phần mở rộng tệp (và không sử dụng tính năng đánh hơi 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 tùy ý bằng cách sử dụng kết hợp ánh xạ Debian Linux và Android ngược dòng .

  • Trả về dữ liệu liên quan từ các tệp video/*audio/* (thông qua MediaMetadataRetriever ) và các tệp image/* (thông qua ExifInterface ).

Những thay đổi trong Android 11

Trong Android 11, mô-đun MediaProvider được xây dựng dựa trên những thay đổi được thực hiện trong Android 10 với những cải tiến sau:

  • Cải tiến để 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 chiếu siêu dữ liệu có sẵn với các API công khai của MediaStore. Những thay đổi bao gồm:

    • Cột is_favorite mới và đối số QUERY_ARG_MATCH_FAVORITE mới để cho phép các ứng dụng kiểu thư viện lọc nhanh phương tiện dựa trên cột này.

    • Lập chỉ mục siêu dữ liệu không gian màu.

    • Cột 'is_trashed' mới và đối số QUERY_ARG_MATCH_TRASHED mới để 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 chỉ bằng một lời nhắc hộp thoại của người dùng, bao gồm createDeleteRequest() , createFavoriteRequest() , createTrashRequest()createWriteRequest() .

    • Các cột GENERATION_ADDEDGENERATION_MODIFIED mới để sử dụng trong việc 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ộ hóa trước đó.

    • API công khai GROUP BY mới để sử dụng với các cột siêu dữ liệu bổ sung không được đề cập ở trên.

  • Cải thiện ExifInterface để trích xuất siêu dữ liệu từ vùng chứa PNG và WebP.

  • Các cải tiến đối với SystemUI để ghi siêu dữ liệu DateTimeOriginal vào ảnh chụp màn hình.

Ngoài ra, giờ đây bạn có thể tùy chỉnh MediaProvider bằng cách thêm các định dạng phương tiện mới, đánh dấu thiết bị lưu trữ nào sẽ được lập chỉ mục và thậm chí thay thế ngăn xếp MTP. Để biết chi tiết, hãy xem Tùy 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, ngoại trừ logic liên quan đến MTP. Ngoài ra, frameworks/base/core/java/android/provider/MediaStore.java hiện nằm trong ranh giới mô-đun tại packages/providers/MediaProvider .

Định dạng gói

Mô-đun MediaProvider có định dạng APK-in-APEX.

phụ thuộc

Các phần phụ thuộc của MediaProvider có liên quan đến các tùy chỉnh (nghĩa là, nếu tùy chỉnh MediaProvider, bạn phải đảm bảo việc triển khai của mình đáp ứng phần phụ thuộc được liên kết với tùy chỉnh của bạn).

  • Khi sử dụng các định dạng tệp phương tiện tùy chỉnh hoặc không chuẩn (ví dụ: định dạng được tạo bởi ứng dụng Máy ảnh dành riêng cho nhà cung cấp), bạn phải đăng ký từng định dạng tùy chỉnh với MimeUtils và mô-đun Media Extractor để bật tính năng lập chỉ mục của MediaProvider.

  • Để đảm bảo MediaProvider lập chỉ mục một bộ thiết bị lưu trữ tùy chỉnh (chẳng hạn như khe cắm thẻ SD và cổng USB) được sử dụng khi triển khai StorageManagerService , hãy đặt cờ VolumeInfo.MOUNT_FLAG_INDEXABLE .

  • Khi sử dụng triển khai MTP tùy chỉnh (không phải AOSP), hãy đảm bảo việc triển khai chỉ dựa vào API công khai và API hệ thống để cho phép triển khai tương tác với MediaStore.

Tùy chỉnh

Giờ đây, bạn có thể thêm các định dạng phương tiện mới, tác động đến 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 phương tiện tùy chỉnh. Đối với mỗi định dạng phương tiện tùy chỉnh mới, bạn phải cung cấp ánh xạ từ phần mở rộng tệp duy nhất sang loại MIME. Chúng tôi thực sự khuyến khích bạn làm theo quy trình đăng ký IANA .

    • Bạn không thể xác định lại tiện ích mở rộng hoặc loại MIME đã được xác định trong AOSP.

    • Đối với các tệp video/*audio/* , MediaProvider tiếp tục tư vấn MediaMetadataRetriever . Sử dụng Trình trích xuất phương tiện Android 10 để trả về siêu dữ liệu cho các định dạng tùy chỉnh.

    • Đối với tệp image/* , MediaProvider tiếp tục chuẩn hóa Exif cho siêu dữ liệu. Bạn có thể mở rộng android.media.ExifInterface để trích xuất và trả về siêu dữ liệu Exif cho mọi định dạng hình ảnh tùy 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 tập được trả về bởi StorageManager.getStorageVolumes() trong đó StorageVolume.getMediaStoreVolumeName() không có giá trị rỗng. Bạn có thể tùy chỉnh danh sách các ổ đĩa được trả về để tác động đến những gì được lập chỉ mục, nhưng chúng tôi khuyên bạn không nên đưa các ổ đĩa tạm thời (chẳng hạn như ổ USBOTG).

  • 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 dựa trên các API công khai.

Kiểm tra

Bạn có thể xác minh chức năng của MediaProvider bằng các thử nghiệm sau:

  • Để xác minh chức năng của các API công khai MediaStore, hãy sử dụng các thử nghiệm trong gói CtsProviderTestCases của Bộ kiểm tra khả năng tương thích Android (CTS).

  • Để xác minh chức năng của nội bộ MediaProvider, hãy sử dụng các thử nghiệm trong MediaProviderTests .

Để chạy cả hai bộ thử nghiệm cùng nhau, hãy sử dụng lệnh atest sau:

atest --test-mapping packages/providers/MediaProvider