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) đồng thời cung cấp dữ liệu đó cho các ứng dụng thông qua MediaStore công khai API. Để duy trì quyền riêng tư của người dùng, mô-đun MediaProvider thực thi bộ nhớ có giới hạn nguồn tài trợ mô hình được ra mắt 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, giú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 chóng 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 ra mắt một số điểm cải tiến liên quan đến việc nhận dạng và trích xuất dữ liệu từ các tệp đa phương tiệ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/pngimage/x-newly-invented-format là hình ảnh nên 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ỉ sử dụng đuôi tệp (và không sử dụng phát hiện 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 sử dụng tổ hợp phiên bản ngược dòng của hệ điều hành Debian Linux và Android ánh xạ.

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

Các thay đổi trong Android 11

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

  • Cải tiến quá trình lập chỉ mục. Mô-đun MediaProvider hiện lập chỉ mục siêu dữ liệu theo điều chỉnh siêu dữ liệu có sẵn dựa trên các API công khai của MediaStore. Thay đổi bao gồm:

    • Cột is_favorite mới và đối số QUERY_ARG_MATCH_FAVORITE để bật 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 của hệ màu.

    • Mới có tên là "is_Thùng rác" và đối số QUERY_ARG_MATCH_TRASHED để bật ứ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ặt hàng với một người dùng duy nhất câu lệnh của hộp thoại, bao gồm createDeleteRequest(), createFavoriteRequest(), createTrashRequest()createWriteRequest().

    • Cột GENERATION_ADDEDGENERATION_MODIFIED mới để sử dụng nhanh chóng và phát hiện một cách đáng tin cậy những thay đổi đã xảy ra điểm đồng bộ hoá.

    • 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 phải đề cập ở trên.

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

  • Cải tiến đối với SystemUI để ghi siêu dữ liệu DateTimeOriginal trên màn hình ả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ữ nào sẽ được lập chỉ mục và thậm chí thay thế MTP ngăn xếp. Để 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 đến một vị trí mới, ngoại lệ đáng chú ý của 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 có đị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 (tức là tức 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 liên quan đến chế độ tuỳ chỉnh của bạn).

  • Khi sử dụng đị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 ứng dụng Máy ảnh của nhà cung cấp cụ thể tạo ra), bạn phải đăng ký từng tuỳ chỉnh bằng MimeUtils và mô-đun Media Extractor (Trình trích xuất nội dung đa phương tiện) để bật tính năng lập chỉ mục bằng MediaProvider.

  • Để đả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ư thẻ SD) khe cắm và cổng USB) dùng trong quá trình triển khai StorageManagerService, thiết lập 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 bạn đã 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.

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 ánh xạ từ đuôi tệp duy nhất đến loại MIME. Chúng tôi đặc biệt khuyến khích bạn thực hiện theo thông tin đă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/*audio/*, MediaProvider tiếp tục tư vấn MediaMetadataRetriever. 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 đị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 được trả về chậm nhất vào StorageManager.getStorageVolumes(), trong đó StorageVolume.getMediaStoreVolumeName() không rỗng. Bạn có thể tuỳ chỉnh danh sách các tập được trả về để ảnh hưởng đến nội dung được lập chỉ mục, nhưng bạn không nên bao gồm cả các ổ đĩa tạm thời (chẳng hạn như ổ đĩa USB OTG).

  • Thay thế ngăn xếp MTP. Android 11 đặt MTP hoàn toàn nằm ngoài ranh giới mô-đun và đảm bảo chúng 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á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 bài 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 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