ผู้ให้บริการสื่อในระบบคลาวด์จะให้เนื้อหาสื่อในระบบคลาวด์เพิ่มเติมแก่เครื่องมือเลือกรูปภาพของ Android ผู้ใช้สามารถเลือกรูปภาพหรือวิดีโอที่ผู้ให้บริการสื่อในระบบคลาวด์จัดหาให้เมื่อแอปใช้ ACTION_PICK_IMAGES หรือ ACTION_GET_CONTENT เพื่อขอไฟล์สื่อจากผู้ใช้ นอกจากนี้ ผู้ให้บริการสื่อในระบบคลาวด์
ยังให้ข้อมูลเกี่ยวกับ อัลบั้ม ซึ่งสามารถเรียกดูได้ใน
เครื่องมือเลือกรูปภาพของ Android
ก่อนเริ่มต้น
โปรดคำนึงถึงรายการต่อไปนี้ก่อนเริ่มสร้างผู้ให้บริการสื่อในระบบคลาวด์
การมีสิทธิ์
Android กำลังดำเนินการโปรแกรมนำร่องเพื่ออนุญาตให้แอปที่ OEM เสนอชื่อเป็นผู้ให้บริการสื่อในระบบคลาวด์ได้ ในขณะนี้ มีเพียงแอปที่ OEM เสนอชื่อเท่านั้นที่มีสิทธิ์เข้าร่วมโปรแกรมนี้เพื่อเป็นผู้ให้บริการสื่อในระบบคลาวด์สำหรับ Android OEM แต่ละรายเสนอชื่อแอปได้สูงสุด 3 แอป เมื่อได้รับอนุมัติแล้ว แอปเหล่านี้จะเข้าถึงได้ในฐานะผู้ให้บริการสื่อในระบบคลาวด์ในอุปกรณ์ที่ใช้พลังงานจาก GMS Android ซึ่งติดตั้งแอปเหล่านี้ไว้
Android จะเก็บรักษารายชื่อผู้ให้บริการคลาวด์ที่มีสิทธิ์ทั้งหมดไว้ที่ฝั่งเซิร์ฟเวอร์ OEM แต่ละราย สามารถเลือกผู้ให้บริการคลาวด์เริ่มต้นได้โดยใช้การวางซ้อนที่กำหนดค่าได้ แอปที่เสนอชื่อต้องเป็นไปตามข้อกำหนดทางเทคนิคทั้งหมดและผ่านการทดสอบคุณภาพทั้งหมด หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับกระบวนการและ ข้อกำหนดของโปรแกรมนำร่องสำหรับผู้ให้บริการสื่อในระบบคลาวด์ของ OEM โปรดกรอกแบบฟอร์มสอบถาม
ตัดสินใจว่าคุณต้องสร้างผู้ให้บริการสื่อในระบบคลาวด์หรือไม่
ผู้ให้บริการสื่อในระบบคลาวด์มีไว้เพื่อเป็นแอปหรือบริการที่เป็นแหล่งข้อมูลหลักของผู้ใช้สำหรับการสำรองและดึงรูปภาพและวิดีโอจากระบบคลาวด์ หากแอปของคุณมีไลบรารีเนื้อหาที่เป็นประโยชน์ แต่โดยทั่วไปแล้วไม่ได้ใช้เป็นโซลูชันพื้นที่เก็บข้อมูลรูปภาพ คุณควรพิจารณาสร้างผู้ให้บริการเอกสารแทน
ผู้ให้บริการคลาวด์ที่ใช้งานอยู่ 1 รายต่อโปรไฟล์
ผู้ให้บริการสื่อในระบบคลาวด์ที่ใช้งานอยู่พร้อมกันได้สูงสุด 1 รายต่อโปรไฟล์ Android แต่ละโปรไฟล์ ผู้ใช้อาจนำแอปผู้ให้บริการสื่อในระบบคลาวด์ที่เลือกออกหรือเปลี่ยนแอปได้ทุกเมื่อจากการตั้งค่าเครื่องมือเลือกรูปภาพ
โดยค่าเริ่มต้น เครื่องมือเลือกรูปภาพของ Android จะพยายามเลือกผู้ให้บริการคลาวด์โดยอัตโนมัติ
- หากมีผู้ให้บริการคลาวด์ที่มีสิทธิ์เพียงรายเดียวในอุปกรณ์ ระบบจะเลือกแอปดังกล่าวเป็นผู้ให้บริการปัจจุบันโดยอัตโนมัติ
หากมีผู้ให้บริการคลาวด์ที่มีสิทธิ์มากกว่า 1 รายในอุปกรณ์ และมีผู้ให้บริการรายหนึ่งตรงกับค่าเริ่มต้นที่ OEM เลือกไว้ ระบบจะเลือกแอปที่ OEM เลือก
หากมีผู้ให้บริการคลาวด์ที่มีสิทธิ์มากกว่า 1 รายในอุปกรณ์ และไม่มีผู้ให้บริการรายใดตรงกับค่าเริ่มต้นที่ OEM เลือกไว้ ระบบจะไม่เลือกแอปใดๆ
สร้างผู้ให้บริการสื่อในระบบคลาวด์
แผนภาพต่อไปนี้แสดงลำดับเหตุการณ์ทั้งก่อนและระหว่าง
เซสชันการเลือกรูปภาพระหว่างแอป Android, เครื่องมือเลือกรูปภาพของ Android,
ของอุปกรณ์ในเครื่อง MediaProviderและ CloudMediaProvider
- ระบบจะเริ่มต้นผู้ให้บริการคลาวด์ที่ผู้ใช้ต้องการและซิงค์ข้อมูลเมตาของสื่อกับแบ็กเอนด์ของเครื่องมือเลือกรูปภาพของ Android เป็นระยะ
- เมื่อแอป Android เปิดใช้เครื่องมือเลือกรูปภาพ ก่อนที่จะแสดงตารางกริดของรายการในเครื่องหรือในระบบคลาวด์ที่ผสานรวมแล้วให้ผู้ใช้เห็น เครื่องมือเลือกรูปภาพจะทำการซิงค์แบบเพิ่มทีละรายการกับผู้ให้บริการคลาวด์ซึ่งมีความไวต่อเวลาในการตอบสนอง เพื่อให้มั่นใจว่าผลลัพธ์เป็นข้อมูลล่าสุดเท่าที่จะเป็นไปได้ หลังจากได้รับคำตอบหรือเมื่อถึงกำหนดเวลาแล้ว กริดเครื่องมือเลือกรูปภาพจะแสดงรูปภาพทั้งหมดที่เข้าถึงได้ โดยรวมรูปภาพที่จัดเก็บไว้ในเครื่องในอุปกรณ์ของคุณกับรูปภาพที่ซิงค์จากระบบคลาวด์
- ขณะที่ผู้ใช้เลื่อนดู เครื่องมือเลือกรูปภาพจะดึงภาพขนาดย่อของสื่อจากผู้ให้บริการสื่อในระบบคลาวด์เพื่อแสดงใน UI
- เมื่อผู้ใช้ทำเซสชันเสร็จสมบูรณ์และผลลัพธ์มีรายการสื่อในระบบคลาวด์ เครื่องมือเลือกรูปภาพจะขอตัวอธิบายไฟล์สำหรับเนื้อหา สร้าง URI และให้สิทธิ์เข้าถึงไฟล์แก่แอปพลิเคชันที่เรียก
- ตอนนี้แอปสามารถเปิด URI และมีสิทธิ์เข้าถึงเนื้อหาสื่อแบบอ่านอย่างเดียว โดยค่าเริ่มต้น ระบบจะปกปิดข้อมูลเมตาที่ละเอียดอ่อน เครื่องมือเลือกรูปภาพใช้ประโยชน์จากระบบไฟล์ FUSE เพื่อประสานงานการแลกเปลี่ยนข้อมูลระหว่างแอป Android กับผู้ให้บริการสื่อในระบบคลาวด์
ปัญหาที่พบบ่อย
ต่อไปนี้คือข้อควรพิจารณาที่สำคัญบางประการที่ควรคำนึงถึงเมื่อพิจารณาการใช้งาน
หลีกเลี่ยงไฟล์ที่ซ้ำกัน
เนื่องจากเครื่องมือเลือกรูปภาพของ Android ไม่มีวิธีตรวจสอบสถานะสื่อในระบบคลาวด์ CloudMediaProvider จึงต้องระบุ MEDIA_STORE_URI ในแถวเคอร์เซอร์ของไฟล์ที่อยู่ในระบบคลาวด์และในอุปกรณ์ในเครื่อง มิเช่นนั้นผู้ใช้จะเห็นไฟล์ที่ซ้ำกันในเครื่องมือเลือกรูปภาพ
เพิ่มประสิทธิภาพขนาดรูปภาพสำหรับการแสดงตัวอย่าง
ไฟล์ที่แสดงผลจาก onOpenPreview ต้องไม่ใช่รูปภาพความละเอียดเต็มและต้องเป็นไปตาม Size ที่มีการขอ รูปภาพที่มีขนาดใหญ่เกินไปจะทำให้ UI ใช้เวลาโหลดนาน และรูปภาพที่มีขนาดเล็กเกินไปอาจเป็นพิกเซลแตกหรือเบลอตามขนาดหน้าจอของอุปกรณ์
จัดการการวางแนวที่ถูกต้อง
หากภาพขนาดย่อที่แสดงผลใน onOpenPreview ไม่มีข้อมูล EXIF ควรแสดงผลในแนวที่ถูกต้องเพื่อไม่ให้ภาพขนาดย่อหมุนผิดแนวในกริดตัวอย่าง
ป้องกันการเข้าถึงโดยไม่ได้รับอนุญาต
ตรวจสอบ MANAGE_CLOUD_MEDIA_PROVIDERS_PERMISSION ก่อนแสดงผลข้อมูลไปยังผู้เรียกจาก ContentProvider ซึ่งจะป้องกันไม่ให้แอปที่ไม่ได้รับอนุญาตเข้าถึงข้อมูลในระบบคลาวด์
คลาส CloudMediaProvider
คลาส CloudMediaProvider
ซึ่งได้มาจาก android.content.ContentProvider มีเมธอดต่างๆ เช่น เมธอดที่แสดงในตัวอย่างต่อไปนี้
Kotlin
abstract class CloudMediaProvider : ContentProvider() {
@NonNull
abstract override fun onGetMediaCollectionInfo(@NonNull bundle: Bundle): Bundle
@NonNull
override fun onQueryAlbums(@NonNull bundle: Bundle): Cursor = TODO("Implement onQueryAlbums")
@NonNull
abstract override fun onQueryDeletedMedia(@NonNull bundle: Bundle): Cursor
@NonNull
abstract override fun onQueryMedia(@NonNull bundle: Bundle): Cursor
@NonNull
abstract override fun onOpenMedia(
@NonNull string: String,
@Nullable bundle: Bundle?,
@Nullable cancellationSignal: CancellationSignal?
): ParcelFileDescriptor
@NonNull
abstract override fun onOpenPreview(
@NonNull string: String,
@NonNull point: Point,
@Nullable bundle: Bundle?,
@Nullable cancellationSignal: CancellationSignal?
): AssetFileDescriptor
@Nullable
override fun onCreateCloudMediaSurfaceController(
@NonNull bundle: Bundle,
@NonNull callback: CloudMediaSurfaceStateChangedCallback
): CloudMediaSurfaceController? = null
}
Java
public abstract class CloudMediaProvider extends android.content.ContentProvider {
@NonNull
public abstract android.os.Bundle onGetMediaCollectionInfo(@NonNull android.os.Bundle);
@NonNull
public android.database.Cursor onQueryAlbums(@NonNull android.os.Bundle);
@NonNull
public abstract android.database.Cursor onQueryDeletedMedia(@NonNull android.os.Bundle);
@NonNull
public abstract android.database.Cursor onQueryMedia(@NonNull android.os.Bundle);
@NonNull
public abstract android.os.ParcelFileDescriptor onOpenMedia(@NonNull String, @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException;
@NonNull
public abstract android.content.res.AssetFileDescriptor onOpenPreview(@NonNull String, @NonNull android.graphics.Point, @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException;
@Nullable
public android.provider.CloudMediaProvider.CloudMediaSurfaceController onCreateCloudMediaSurfaceController(@NonNull android.os.Bundle, @NonNull android.provider.CloudMediaProvider.CloudMediaSurfaceStateChangedCallback);
}
คลาส CloudMediaProviderContract
นอกเหนือจากคลาสการใช้งาน CloudMediaProvider หลักแล้ว เครื่องมือเลือกรูปภาพของ Android ยังรวมคลาส CloudMediaProviderContract ไว้ด้วย
คลาสนี้สรุปความสามารถในการทำงานร่วมกันระหว่างเครื่องมือเลือกรูปภาพกับผู้ให้บริการสื่อในระบบคลาวด์ ซึ่งครอบคลุมแง่มุมต่างๆ เช่น MediaCollectionInfo สำหรับการดำเนินการซิงค์ข้อมูล คอลัมน์ Cursor ที่คาดไว้ และส่วนเพิ่มเติม Bundle
Kotlin
object CloudMediaProviderContract {
const val EXTRA_ALBUM_ID = "android.provider.extra.ALBUM_ID"
const val EXTRA_LOOPING_PLAYBACK_ENABLED = "android.provider.extra.LOOPING_PLAYBACK_ENABLED"
const val EXTRA_MEDIA_COLLECTION_ID = "android.provider.extra.MEDIA_COLLECTION_ID"
const val EXTRA_PAGE_SIZE = "android.provider.extra.PAGE_SIZE"
const val EXTRA_PAGE_TOKEN = "android.provider.extra.PAGE_TOKEN"
const val EXTRA_PREVIEW_THUMBNAIL = "android.provider.extra.PREVIEW_THUMBNAIL"
const val EXTRA_SURFACE_CONTROLLER_AUDIO_MUTE_ENABLED = "android.provider.extra.SURFACE_CONTROLLER_AUDIO_MUTE_ENABLED"
const val EXTRA_SYNC_GENERATION = "android.provider.extra.SYNC_GENERATION"
const val MANAGE_CLOUD_MEDIA_PROVIDERS_PERMISSION = "com.android.providers.media.permission.MANAGE_CLOUD_MEDIA_PROVIDERS"
const val PROVIDER_INTERFACE = "android.content.action.CLOUD_MEDIA_PROVIDER"
object MediaColumns {
const val DATE_TAKEN_MILLIS = "date_taken_millis"
const val DURATION_MILLIS = "duration_millis"
const val HEIGHT = "height"
const val ID = "id"
const val IS_FAVORITE = "is_favorite"
const val MEDIA_STORE_URI = "media_store_uri"
const val MIME_TYPE = "mime_type"
const val ORIENTATION = "orientation"
const val SIZE_BYTES = "size_bytes"
const val STANDARD_MIME_TYPE_EXTENSION = "standard_mime_type_extension"
const val STANDARD_MIME_TYPE_EXTENSION_ANIMATED_WEBP = 3 // 0x3
const val STANDARD_MIME_TYPE_EXTENSION_GIF = 1 // 0x1
const val STANDARD_MIME_TYPE_EXTENSION_MOTION_PHOTO = 2 // 0x2
const val STANDARD_MIME_TYPE_EXTENSION_NONE = 0 // 0x0
const val SYNC_GENERATION = "sync_generation"
const val WIDTH = "width"
}
object AlbumColumns {
const val DATE_TAKEN_MILLIS = "date_taken_millis"
const val DISPLAY_NAME = "display_name"
const val ID = "id"
const val MEDIA_COUNT = "album_media_count"
const val MEDIA_COVER_ID = "album_media_cover_id"
}
object MediaCollectionInfo {
const val ACCOUNT_CONFIGURATION_INTENT = "account_configuration_intent"
const val ACCOUNT_NAME = "account_name"
const val LAST_MEDIA_SYNC_GENERATION = "last_media_sync_generation"
const val MEDIA_COLLECTION_ID = "media_collection_id"
}
}
Java
public final class CloudMediaProviderContract {
public static final String EXTRA_ALBUM_ID = "android.provider.extra.ALBUM_ID";
public static final String EXTRA_LOOPING_PLAYBACK_ENABLED = "android.provider.extra.LOOPING_PLAYBACK_ENABLED";
public static final String EXTRA_MEDIA_COLLECTION_ID = "android.provider.extra.MEDIA_COLLECTION_ID";
public static final String EXTRA_PAGE_SIZE = "android.provider.extra.PAGE_SIZE";
public static final String EXTRA_PAGE_TOKEN = "android.provider.extra.PAGE_TOKEN";
public static final String EXTRA_PREVIEW_THUMBNAIL = "android.provider.extra.PREVIEW_THUMBNAIL";
public static final String EXTRA_SURFACE_CONTROLLER_AUDIO_MUTE_ENABLED = "android.provider.extra.SURFACE_CONTROLLER_AUDIO_MUTE_ENABLED";
public static final String EXTRA_SYNC_GENERATION = "android.provider.extra.SYNC_GENERATION";
public static final String MANAGE_CLOUD_MEDIA_PROVIDERS_PERMISSION = "com.android.providers.media.permission.MANAGE_CLOUD_MEDIA_PROVIDERS";
public static final String PROVIDER_INTERFACE = "android.content.action.CLOUD_MEDIA_PROVIDER";
}
// Columns available for every media item
public static final class CloudMediaProviderContract.MediaColumns {
public static final String DATE_TAKEN_MILLIS = "date_taken_millis";
public static final String DURATION_MILLIS = "duration_millis";
public static final String HEIGHT = "height";
public static final String ID = "id";
public static final String IS_FAVORITE = "is_favorite";
public static final String MEDIA_STORE_URI = "media_store_uri";
public static final String MIME_TYPE = "mime_type";
public static final String ORIENTATION = "orientation";
public static final String SIZE_BYTES = "size_bytes";
public static final String STANDARD_MIME_TYPE_EXTENSION = "standard_mime_type_extension";
public static final int STANDARD_MIME_TYPE_EXTENSION_ANIMATED_WEBP = 3; // 0x3
public static final int STANDARD_MIME_TYPE_EXTENSION_GIF = 1; // 0x1
public static final int STANDARD_MIME_TYPE_EXTENSION_MOTION_PHOTO = 2; // 0x2
public static final int STANDARD_MIME_TYPE_EXTENSION_NONE = 0; // 0x0
public static final String SYNC_GENERATION = "sync_generation";
public static final String WIDTH = "width";
}
// Columns available for every album item
public static final class CloudMediaProviderContract.AlbumColumns {
public static final String DATE_TAKEN_MILLIS = "date_taken_millis";
public static final String DISPLAY_NAME = "display_name";
public static final String ID = "id";
public static final String MEDIA_COUNT = "album_media_count";
public static final String MEDIA_COVER_ID = "album_media_cover_id";
}
// Media Collection metadata that is cached by the OS to compare sync states.
public static final class CloudMediaProviderContract.MediaCollectionInfo {
public static final String ACCOUNT_CONFIGURATION_INTENT = "account_configuration_intent";
public static final String ACCOUNT_NAME = "account_name";
public static final String LAST_MEDIA_SYNC_GENERATION = "last_media_sync_generation";
public static final String MEDIA_COLLECTION_ID = "media_collection_id";
}
onGetMediaCollectionInfo
ระบบปฏิบัติการใช้เมธอด onGetMediaCollectionInfo() เพื่อ
ประเมินความถูกต้องของรายการสื่อในระบบคลาวด์ที่แคชไว้และกำหนดการซิงค์ที่จำเป็นกับผู้ให้บริการสื่อในระบบคลาวด์ onGetMediaCollectionInfo() ถือเป็นเมธอดที่สำคัญต่อประสิทธิภาพการทำงาน เนื่องจากระบบปฏิบัติการอาจเรียกใช้เมธอดนี้บ่อยครั้ง จึงจำเป็นอย่างยิ่งที่จะต้องหลีกเลี่ยงการดำเนินการที่ใช้เวลานานหรือผลข้างเคียงที่อาจส่งผลเสียต่อประสิทธิภาพการทำงาน ระบบปฏิบัติการจะแคชการตอบกลับก่อนหน้าจากเมธอดนี้และเปรียบเทียบกับการตอบกลับในภายหลังเพื่อกำหนดการดำเนินการที่เหมาะสม
Kotlin
abstract fun onGetMediaCollectionInfo(extras: Bundle): Bundle
Java
@NonNull
public abstract Bundle onGetMediaCollectionInfo(@NonNull Bundle extras);
แพ็กเกจ MediaCollectionInfo ที่แสดงผลจะมีค่าคงที่ต่อไปนี้
onQueryMedia
เมธอด onQueryMedia() ใช้เพื่อป้อนข้อมูลลงในกริดรูปภาพหลักใน
เครื่องมือเลือกรูปภาพในมุมมองต่างๆ การเรียกเหล่านี้อาจมีความไวต่อเวลาในการตอบสนอง และอาจเรียกใช้เป็นส่วนหนึ่งของการซิงค์เชิงรุกในเบื้องหลัง หรือระหว่างเซสชันเครื่องมือเลือกรูปภาพเมื่อจำเป็นต้องมีสถานะการซิงค์แบบเต็มหรือแบบเพิ่มทีละรายการ อินเทอร์เฟซผู้ใช้ของเครื่องมือเลือกรูปภาพจะไม่รอการตอบกลับเพื่อแสดงผลลัพธ์อย่างไม่มีกำหนด และอาจหมดเวลาคำขอเหล่านี้เพื่อวัตถุประสงค์ของอินเทอร์เฟซผู้ใช้ เคอร์เซอร์ที่แสดงผลจะยังคงพยายามประมวลผลลงในฐานข้อมูลของเครื่องมือเลือกรูปภาพสำหรับเซสชันในอนาคต
เมธอดนี้จะแสดงผล Cursor ที่แสดงรายการสื่อทั้งหมดในคอลเล็กชันสื่อ ซึ่งกรองตามส่วนเพิ่มเติมที่ระบุและจัดเรียงตามลำดับเวลาแบบย้อนกลับของ MediaColumns#DATE_TAKEN_MILLIS (รายการล่าสุดก่อน)
แพ็กเกจ CloudMediaProviderContract ที่แสดงผลจะมีค่าคงที่ต่อไปนี้
EXTRA_ALBUM_IDEXTRA_LOOPING_PLAYBACK_ENABLEDEXTRA_MEDIA_COLLECTION_IDEXTRA_PAGE_SIZEEXTRA_PAGE_TOKENEXTRA_PREVIEW_THUMBNAILEXTRA_SURFACE_CONTROLLER_AUDIO_MUTE_ENABLEDEXTRA_SYNC_GENERATIONMANAGE_CLOUD_MEDIA_PROVIDERS_PERMISSIONPROVIDER_INTERFACE
ผู้ให้บริการสื่อในระบบคลาวด์ต้องตั้งค่า CloudMediaProviderContract#EXTRA_MEDIA_COLLECTION_ID เป็นส่วนหนึ่งของ Bundle ที่แสดงผล การไม่ตั้งค่านี้ถือเป็นข้อผิดพลาดและทำให้ Cursor ที่แสดงผลไม่ถูกต้อง หากผู้ให้บริการสื่อในระบบคลาวด์จัดการตัวกรองใดๆ ในส่วนเพิ่มเติมที่ระบุไว้ ผู้ให้บริการจะต้องเพิ่มคีย์ลงใน ContentResolver#EXTRA_HONORED_ARGS เป็นส่วนหนึ่งของ Cursor#setExtras ที่แสดงผล
onQueryDeletedMedia
เมธอด onQueryDeletedMedia() ใช้เพื่อให้แน่ใจว่าระบบจะนำรายการที่ลบในบัญชีระบบคลาวด์ออกจากอินเทอร์เฟซผู้ใช้ของเครื่องมือเลือกรูปภาพอย่างถูกต้อง การเรียกเหล่านี้อาจเริ่มต้นขึ้นเป็นส่วนหนึ่งของรายการต่อไปนี้เนื่องจากอาจมีความไวต่อเวลาในการตอบสนอง
- การซิงค์เชิงรุกในเบื้องหลัง
- เซสชันเครื่องมือเลือกรูปภาพ (เมื่อจำเป็นต้องมีสถานะการซิงค์แบบเต็มหรือแบบเพิ่มทีละรายการ)
อินเทอร์เฟซผู้ใช้ของเครื่องมือเลือกรูปภาพให้ความสำคัญกับประสบการณ์การใช้งานของผู้ใช้ที่ตอบสนองได้ดีและจะไม่รอการตอบกลับอย่างไม่มีกำหนด ระบบอาจหมดเวลาเพื่อรักษาการโต้ตอบที่ราบรื่น Cursor ที่แสดงผลจะยังคงพยายามประมวลผลลงในฐานข้อมูลของเครื่องมือเลือกรูปภาพสำหรับเซสชันในอนาคต
เมธอดนี้จะแสดงผล Cursor ที่แสดงรายการสื่อที่ลบทั้งหมดในคอลเล็กชันสื่อทั้งหมดภายในเวอร์ชันผู้ให้บริการปัจจุบันตามที่แสดงผลโดย onGetMediaCollectionInfo() รายการเหล่านี้สามารถกรองตามส่วนเพิ่มเติมได้
ผู้ให้บริการสื่อในระบบคลาวด์ต้องตั้งค่า
CloudMediaProviderContract#EXTRA_MEDIA_COLLECTION_ID เป็นส่วนหนึ่งของ
Cursor#setExtras ที่แสดงผล การไม่ตั้งค่านี้ถือเป็นข้อผิดพลาดและทำให้ Cursor ไม่ถูกต้อง หากผู้ให้บริการจัดการตัวกรองใดๆ ในส่วนเพิ่มเติมที่ระบุไว้ ผู้ให้บริการจะต้องเพิ่มคีย์ลงใน ContentResolver#EXTRA_HONORED_ARGS
onQueryAlbums
เมธอด onQueryAlbums() ใช้เพื่อดึงรายการอัลบั้มในระบบคลาวด์ที่
พร้อมใช้งานในผู้ให้บริการคลาวด์และข้อมูลเมตาที่เกี่ยวข้อง ดูรายละเอียดเพิ่มเติมได้ที่
CloudMediaProviderContract.AlbumColumns
เมธอดนี้จะแสดงผล Cursor ที่แสดงรายการอัลบั้มทั้งหมดในคอลเล็กชันสื่อ ซึ่งกรองตามส่วนเพิ่มเติมที่ระบุและจัดเรียงตามลำดับเวลาแบบย้อนกลับของ AlbumColumns#DATE_TAKEN_MILLIS (รายการล่าสุดก่อน) ผู้ให้บริการสื่อในระบบคลาวด์ต้องตั้งค่า CloudMediaProviderContract#EXTRA_MEDIA_COLLECTION_ID เป็นส่วนหนึ่งของ Cursor ที่แสดงผล การไม่ตั้งค่านี้ถือเป็นข้อผิดพลาดและทำให้ Cursor ที่แสดงผลไม่ถูกต้อง หากผู้ให้บริการจัดการตัวกรองใดๆ ในส่วนเพิ่มเติมที่ระบุไว้ ผู้ให้บริการจะต้องเพิ่มคีย์ลงใน ContentResolver#EXTRA_HONORED_ARGS เป็นส่วนหนึ่งของ Cursor ที่แสดงผล
onOpenMedia
เมธอด onOpenMedia() ควรแสดงผลสื่อขนาดเต็มที่ระบุโดย
mediaId ที่ระบุ หากเมธอดนี้บล็อกขณะดาวน์โหลดเนื้อหาลงในอุปกรณ์ คุณควรตรวจสอบ CancellationSignal ที่ระบุไว้เป็นระยะเพื่อยกเลิกคำขอที่ถูกละทิ้ง
onOpenPreview
เมธอด onOpenPreview() ควรแสดงผลภาพขนาดย่อที่มี
size ที่ระบุสำหรับรายการที่มี mediaId ที่ระบุ ภาพขนาดย่อควรอยู่ใน CloudMediaProviderContract.MediaColumns#MIME_TYPE เดิมและคาดว่าจะมีค่าความละเอียดต่ำกว่ารายการที่แสดงผลโดย onOpenMedia มาก หากเมธอดนี้ถูกบล็อกขณะดาวน์โหลดเนื้อหาลงในอุปกรณ์ คุณควรตรวจสอบ CancellationSignal ที่ระบุไว้เป็นระยะเพื่อยกเลิกคำขอที่ถูกละทิ้ง
onCreateCloudMediaSurfaceController
เมธอด onCreateCloudMediaSurfaceController() ควรแสดงผล
CloudMediaSurfaceController ที่ใช้สำหรับการแสดงตัวอย่างรายการสื่อ หรือ
null หากไม่รองรับการแสดงตัวอย่าง
CloudMediaSurfaceController จะจัดการการแสดงตัวอย่างรายการสื่อ
ในอินสแตนซ์ Surface ที่ระบุ เมธอดของคลาสนี้มีไว้เพื่อทำงานแบบไม่พร้อมกันและไม่ควรบล็อกโดยการดำเนินการที่ใช้ทรัพยากรมาก อินสแตนซ์ CloudMediaSurfaceController รายการเดียวมีหน้าที่แสดงรายการสื่อหลายรายการที่เชื่อมโยงกับพื้นผิวหลายรายการ
CloudMediaSurfaceController รองรับรายการการเรียกกลับของวงจรการทำงานต่อไปนี้
onConfigChangeonDestroyonMediaPauseonMediaPlayonMediaSeekToonPlayerCreateonPlayerReleaseonSurfaceChangedonSurfaceCreatedonSurfaceDestroyed