Mô-đun MediaProvider

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) 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 sẽ thực thi mô hình bảo mật bộ nhớ có phạm vi được giới thiệu trong Android 10, bao gồm cả việc chỉnh sửa siêu dữ liệu vị trí nhạy cảm. Bạn có thể cập nhật mô-đun này, cho phép Android phản hồi nhanh hơn đối với 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 nghe nhìn mới nhanh hơn (mang lại sự 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 cách sử dụng phần đầu tiên của loại MIME của tệp. Ví dụ: hệ điều hành biết rằng cả image/pngimage/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 phần mở rộng của tệp (và không sử dụng phát hiện nội dung để tránh các vấn đề về 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ạ Debian Linux và Android ở nguồn trên.

  • 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).

Các 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 các điểm cải tiến sau:

  • Cải thiện hoạt động lập chỉ mục. Giờ đây, mô-đun MediaProvider 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. 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 lọc nhanh nội dung nghe nhìn dựa trên cột này.

    • Lập chỉ mục siêu dữ liệu về 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 duy nhất cho hộp thoại 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 những thay đổi đã xảy ra kể từ một điểm đồng bộ hoá 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ừ các vùng chứa PNG và WebP.

  • Cải tiến SystemUI để ghi siêu dữ liệu DateTimeOriginal 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 những 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 phần 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, ngoại trừ logic liên quan đến MTP. Ngoài ra, frameworks/base/core/java/android/provider/MediaStore.java hiện nằm 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 các chế độ tuỳ chỉnh (tức là nếu tuỳ chỉnh MediaProvider, bạn phải đảm bảo rằng quá trình triển khai của bạn đáp ứng phần phụ thuộc liên kết với chế độ tuỳ chỉnh).

  • Khi sử dụng các định dạng tệp đa phương tiện tuỳ chỉnh hoặc không chuẩn (ví dụ: định dạng do một ứng dụng Camera dành riêng cho nhà cung cấp tạo ra), bạn phải đăng ký từng định dạng tuỳ chỉnh bằng 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 nhóm thiết bị lưu trữ tuỳ chỉnh (chẳng hạn như các khe cắm thẻ SD và cổng USB) được dùng trong quá trình triển khai StorageManagerService, hãy đặt cờ VolumeInfo.MOUNT_FLAG_INDEXABLE.

  • Khi sử dụng một chế độ triển khai MTP tuỳ chỉnh (không phải AOSP), hãy đảm bảo rằng chế độ triển khai chỉ dựa vào các API công khai và API hệ thống để cho phép chế độ 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 những thiết bị lưu trữ đượ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 mối liên kết từ đuôi tệp duy nhất đến một loại MIME. Bạn nên tuân theo quy trình đăng ký 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/*audio/*, MediaProvider sẽ tiếp tục tham khảo MediaMetadataRetriever. Sử dụng Trình trích xuất nội dung nghe nhìn Android 10 để trả về siêu dữ liệu cho các định dạng tuỳ chỉnh.

    • Đối với các tệp image/*, MediaProvider tiếp tục chuẩn hoá trên 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 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 ổ đĩa do StorageManager.getStorageVolumes() trả về, trong đó StorageVolume.getMediaStoreVolumeName() không có giá trị rỗng. Bạn có thể tuỳ chỉnh danh sách các ổ đĩa được trả về để ảnh hưởng đến nội dung được lập chỉ mục, nhưng bạn không nên đưa các ổ đĩa tạm thời vào (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 dựa trên 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á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 kiểm thử trong gói CtsProviderTestCases của Bộ kiểm tra tính tương thích (CTS) với Android.

  • Để xác minh chức năng của các thành phần bên trong MediaProvider, hãy sử dụng các kiểm thử trong MediaProviderTests.

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

atest --test-mapping packages/providers/MediaProvider