
เครื่องมือเลือกรูปภาพมีอินเทอร์เฟซที่เรียกดูได้ซึ่งแสดงคลังสื่อของผู้ใช้โดยจัดเรียงตามวันที่จากใหม่สุดไปเก่าสุด ดังที่แสดงในโค้ดแล็บแนวทางปฏิบัติแนะนำด้านความเป็นส่วนตัว เครื่องมือเลือกรูปภาพเป็นวิธีที่มีอยู่แล้วในตัวที่ปลอดภัยสำหรับให้ผู้ใช้มอบสิทธิ์ให้แอปของคุณเข้าถึงได้เฉพาะรูปภาพและวิดีโอที่เลือกไว้เท่านั้น แทนที่จะเข้าถึงคลังสื่อทั้งหมด
ผู้ใช้ที่มีผู้ให้บริการสื่อระบบคลาวด์ที่มีสิทธิ์ในอุปกรณ์จะเลือกรูปภาพและวิดีโอที่จัดเก็บไว้จากระยะไกลได้เช่นกัน ดูข้อมูลเพิ่มเติมเกี่ยวกับผู้ให้บริการสื่อบนระบบคลาวด์
เครื่องมือจะอัปเดตโดยอัตโนมัติเพื่อมอบฟังก์ชันเพิ่มเติมให้แก่ผู้ใช้แอปเมื่อเวลาผ่านไปโดยไม่ต้องเปลี่ยนแปลงโค้ดเลย
ใช้สัญญากิจกรรม Jetpack
เพื่อให้การผสานรวมเครื่องมือเลือกรูปภาพทำได้ง่ายขึ้น ให้รวมไลบรารี androidx.activity
เวอร์ชัน 1.7.0 ขึ้นไป
ใช้สัญญาผลลัพธ์กิจกรรมต่อไปนี้เพื่อเปิดเครื่องมือเลือกรูปภาพ
PickVisualMedia
เพื่อเลือกรูปภาพหรือวิดีโอรายการเดียวPickMultipleVisualMedia
เพื่อเลือกรูปภาพหรือวิดีโอหลายรายการ
หากเครื่องมือเลือกรูปภาพไม่พร้อมใช้งานในอุปกรณ์ คลังภาพจะเรียกใช้การดำเนินการตาม Intent ของ ACTION_OPEN_DOCUMENT
โดยอัตโนมัติแทน อุปกรณ์ที่ใช้ Android 4.4 (API ระดับ 19) ขึ้นไปรองรับ Intent นี้ คุณสามารถตรวจสอบว่าเครื่องมือเลือกรูปภาพพร้อมใช้งานในอุปกรณ์หนึ่งๆ หรือไม่โดยเรียกใช้ isPhotoPickerAvailable()
เลือกรายการสื่อรายการเดียว
หากต้องการเลือกรายการสื่อรายการเดียว ให้ใช้สัญญาPickVisualMedia
กิจกรรมผลลัพธ์
ตามที่แสดงในข้อมูลโค้ดต่อไปนี้
ยอดดู
// Registers a photo picker activity launcher in single-select mode. val pickMedia = registerForActivityResult(PickVisualMedia()) { uri -> // Callback is invoked after the user selects a media item or closes the // photo picker. if (uri != null) { Log.d("PhotoPicker", "Selected URI: $uri") } else { Log.d("PhotoPicker", "No media selected") } } // Include only one of the following calls to launch(), depending on the types // of media that you want to let the user choose from. // Launch the photo picker and let the user choose images and videos. pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageAndVideo)) // Launch the photo picker and let the user choose only images. pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageOnly)) // Launch the photo picker and let the user choose only videos. pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.VideoOnly)) // Launch the photo picker and let the user choose only images/videos of a // specific MIME type, such as GIFs. val mimeType = "image/gif" pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.SingleMimeType(mimeType)))
ยอดดู
// Registers a photo picker activity launcher in single-select mode. ActivityResultLauncher<PickVisualMediaRequest> pickMedia = registerForActivityResult(new PickVisualMedia(), uri -> { // Callback is invoked after the user selects a media item or closes the // photo picker. if (uri != null) { Log.d("PhotoPicker", "Selected URI: " + uri); } else { Log.d("PhotoPicker", "No media selected"); } }); // Include only one of the following calls to launch(), depending on the types // of media that you want to let the user choose from. // Launch the photo picker and let the user choose images and videos. pickMedia.launch(new PickVisualMediaRequest.Builder() .setMediaType(PickVisualMedia.ImageAndVideo.INSTANCE) .build()); // Launch the photo picker and let the user choose only images. pickMedia.launch(new PickVisualMediaRequest.Builder() .setMediaType(PickVisualMedia.ImageOnly.INSTANCE) .build()); // Launch the photo picker and let the user choose only videos. pickMedia.launch(new PickVisualMediaRequest.Builder() .setMediaType(PickVisualMedia.VideoOnly.INSTANCE) .build()); // Launch the photo picker and let the user choose only images/videos of a // specific MIME type, such as GIFs. String mimeType = "image/gif"; pickMedia.launch(new PickVisualMediaRequest.Builder() .setMediaType(new PickVisualMedia.SingleMimeType(mimeType)) .build());
เขียน
// Registers a photo picker activity launcher in single-select mode. val pickMedia = rememberLauncherForActivityResult(PickVisualMedia()) { uri -> // Callback is invoked after the user selects a media item or closes the // photo picker. if (uri != null) { Log.d("PhotoPicker", "Selected URI: $uri") } else { Log.d("PhotoPicker", "No media selected") } } // Include only one of the following calls to launch(), depending on the types // of media that you want to let the user choose from. // Launch the photo picker and let the user choose images and videos. pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageAndVideo)) // Launch the photo picker and let the user choose only images. pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageOnly)) // Launch the photo picker and let the user choose only videos. pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.VideoOnly)) // Launch the photo picker and let the user choose only images/videos of a // specific MIME type, such as GIFs. val mimeType = "image/gif" pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.SingleMimeType(mimeType)))
เลือกรายการสื่อหลายรายการ
หากต้องการเลือกรายการสื่อหลายรายการ ให้กำหนดจำนวนไฟล์สื่อสูงสุดที่เลือกได้ ดังที่แสดงในข้อมูลโค้ดต่อไปนี้
ยอดดู
// Registers a photo picker activity launcher in multi-select mode. // In this example, the app lets the user select up to 5 media files. val pickMultipleMedia = registerForActivityResult(PickMultipleVisualMedia(5)) { uris -> // Callback is invoked after the user selects media items or closes the // photo picker. if (uris.isNotEmpty()) { Log.d("PhotoPicker", "Number of items selected: ${uris.size}") } else { Log.d("PhotoPicker", "No media selected") } } // For this example, launch the photo picker and let the user choose images // and videos. If you want the user to select a specific type of media file, // use the overloaded versions of launch(), as shown in the section about how // to select a single media item. pickMultipleMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageAndVideo))
ยอดดู
// Registers a photo picker activity launcher in multi-select mode. // In this example, the app lets the user select up to 5 media files. ActivityResultLauncher<PickVisualMediaRequest> pickMultipleMedia = registerForActivityResult(new PickMultipleVisualMedia(5), uris -> { // Callback is invoked after the user selects media items or closes the // photo picker. if (!uris.isEmpty()) { Log.d("PhotoPicker", "Number of items selected: " + uris.size()); } else { Log.d("PhotoPicker", "No media selected"); } }); // For this example, launch the photo picker and let the user choose images // and videos. If you want the user to select a specific type of media file, // use the overloaded versions of launch(), as shown in the section about how // to select a single media item. pickMultipleMedia.launch(new PickVisualMediaRequest.Builder() .setMediaType(PickVisualMedia.ImageAndVideo.INSTANCE) .build());
เขียน
// Registers a photo picker activity launcher in multi-select mode. // In this example, the app lets the user select up to 5 media files. val pickMultipleMedia = rememberLauncherForActivityResult(PickMultipleVisualMedia(5)) { uris -> // Callback is invoked after the user selects media items or closes the // photo picker. if (uris.isNotEmpty()) { Log.d("PhotoPicker", "Number of items selected: ${uris.size}") } else { Log.d("PhotoPicker", "No media selected") } } // For this example, launch the photo picker and let the user choose images // and videos. If you want the user to select a specific type of media file, // use the overloaded versions of launch(), as shown in the section about how // to select a single media item. pickMultipleMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageAndVideo))
แพลตฟอร์มจะจำกัดจำนวนไฟล์สูงสุดที่คุณขอให้ผู้ใช้เลือกในเครื่องมือเลือกรูปภาพ หากต้องการเข้าถึงขีดจํากัดนี้ ให้โทรไปที่ getPickImagesMaxLimit()
ระบบจะไม่สนใจขีดจำกัดนี้ในอุปกรณ์ที่ไม่รองรับเครื่องมือเลือกรูปภาพ
อุปกรณ์ที่พร้อมจำหน่าย
เครื่องมือเลือกรูปภาพพร้อมใช้งานในอุปกรณ์ที่มีคุณสมบัติตรงตามเกณฑ์ต่อไปนี้
- ใช้ Android 11 (API ระดับ 30) ขึ้นไป
- รับการเปลี่ยนแปลงของคอมโพเนนต์ของระบบโมดูลผ่านการอัปเดตระบบของ Google
อุปกรณ์รุ่นเก่าที่ใช้ Android 4.4 (API ระดับ 19) ถึง Android 10 (API ระดับ 29) และอุปกรณ์ Android Go ที่ใช้ Android 11 หรือ 12 ซึ่งรองรับบริการ Google Play สามารถติดตั้งเครื่องมือเลือกรูปภาพเวอร์ชันที่พอร์ตไปยังเวอร์ชันเก่าได้ หากต้องการเปิดใช้การติดตั้งโมดูลเครื่องมือเลือกรูปภาพที่พอร์ตไปยังเวอร์ชันเก่าโดยอัตโนมัติผ่านบริการ Google Play ให้เพิ่มรายการต่อไปนี้ลงในแท็ก <application>
ในไฟล์ Manifest ของแอป
<!-- Trigger Google Play services to install the backported photo picker module. -->
<service android:name="com.google.android.gms.metadata.ModuleDependencies"
android:enabled="false"
android:exported="false"
tools:ignore="MissingClass">
<intent-filter>
<action android:name="com.google.android.gms.metadata.MODULE_DEPENDENCIES" />
</intent-filter>
<meta-data android:name="photopicker_activity:0:required" android:value="" />
</service>
เก็บสิทธิ์เข้าถึงไฟล์สื่อไว้
โดยค่าเริ่มต้น ระบบจะให้สิทธิ์เข้าถึงไฟล์สื่อแก่แอปของคุณจนกว่าอุปกรณ์จะรีสตาร์ทหรือจนกว่าแอปจะหยุดทำงาน หากแอปทำงานต่อเนื่องเป็นเวลานาน เช่น การอัปโหลดไฟล์ขนาดใหญ่ในเบื้องหลัง คุณอาจต้องเก็บสิทธิ์เข้าถึงนี้ไว้เป็นเวลานานขึ้น โดยเรียกใช้วิธี takePersistableUriPermission()
ดังนี้
Kotlin
val flag = Intent.FLAG_GRANT_READ_URI_PERMISSION context.contentResolver.takePersistableUriPermission(uri, flag)
Java
int flag = Intent.FLAG_GRANT_READ_URI_PERMISSION; context.contentResolver.takePersistableUriPermission(uri, flag);
จัดการวิดีโอ HDR ด้วยการแปลง
Android 13 (API 33) เปิดตัวความสามารถในการบันทึกวิดีโอ High Dynamic Range (HDR) แม้ว่า HDR จะมอบประสบการณ์การรับชมที่สมบูรณ์ยิ่งขึ้น แต่แอปเก่าบางแอปอาจไม่พร้อมรองรับรูปแบบใหม่เหล่านี้ จึงทำให้เกิดปัญหาต่างๆ เช่น การแสดงสีที่ไม่สมจริงระหว่างการเล่น (เช่น ใบหน้าสีเขียว) เครื่องมือเลือกรูปภาพจึงมีฟีเจอร์การแปลงไฟล์ที่สามารถแปลงวิดีโอ HDR เป็นรูปแบบ Standard Dynamic Range (SDR) โดยอัตโนมัติก่อนที่จะส่งไปยังแอปที่ขอ
เป้าหมายหลักของการแปลงไฟล์ของเครื่องมือเลือกรูปภาพคือเพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งานสื่อที่สม่ำเสมอและถูกต้องในแอปพลิเคชันต่างๆ อีกมากมาย แม้แต่แอปพลิเคชันที่ยังรองรับ HDR ไม่ได้ก็ตาม เครื่องมือเลือกรูปภาพจะเปลี่ยนรูปแบบวิดีโอ HDR เป็น SDR เพื่อปรับปรุงความเข้ากันได้ของแอปและมอบประสบการณ์การใช้งานที่ราบรื่นให้แก่ผู้ใช้
วิธีการทำงานของการแปลงไฟล์ของเครื่องมือเลือกรูปภาพ
ระบบไม่ได้เปิดใช้การแปลง HDR ของเครื่องมือเลือกรูปภาพโดยค่าเริ่มต้น หากต้องการเปิดใช้ฟีเจอร์นี้ แอปของคุณต้องประกาศความสามารถในการจัดการรูปแบบสื่ออย่างชัดเจนเมื่อเปิดเครื่องมือเลือกรูปภาพ
แอปของคุณให้ความสามารถในการประมวลผลสื่อแก่เครื่องมือเลือกรูปภาพ ซึ่งทำได้เมื่อเปิดเครื่องมือเลือกรูปภาพโดยใช้ไลบรารีกิจกรรม AndroidX โดยเพิ่ม mediaCapabilities
ลงใน PickVisualMediaRequest.Builder
เราได้เพิ่ม API ใหม่ setMediaCapabilitiesForTranscoding(capabilities: MediaCapabilities?)
ลงใน PickVisualMediaRequest.Builder
เพื่อให้การดำเนินการนี้สะดวกขึ้น
คุณควบคุมลักษณะการแปลงไฟล์ HDR ได้โดยใช้คลาส MediaCapabilities
ระบุออบเจ็กต์ MediaCapabilities
ที่ระบุประเภท HDR ที่แน่นอนที่แอปรองรับ (เช่น TYPE_HLG10
, TYPE_HDR10
, TYPE_HDR10_PLUS
,
TYPE_DOLBY_VISION
)
หากต้องการปิดใช้การแปลงทั้งหมด ให้ส่ง null
สำหรับ
MediaCapabilities
ระบบจะถือว่า HDR ประเภทใดก็ตามที่ไม่ได้ระบุไว้อย่างชัดเจนในความสามารถที่ระบุไม่รองรับ API นี้ใช้ได้ใน Android 13 (API ระดับ 33) ขึ้นไป และมีคำอธิบายประกอบเป็น @RequiresApi(Build.VERSION_CODES.TIRAMISU)
import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia
import androidx.annotation.RequiresApi
import android.os.Build
import android.util.Log
import android.provider.MediaStore
// Registers a photo picker activity launcher.
val pickMedia = registerForActivityResult(PickVisualMedia()) { uri ->
// Callback invoked after media selected or picker activity closed.
if (uri != null) {
Log.d("photo picker", "Selected URI: $uri")
} else {
Log.d("photo picker", "No media selected")
}
}
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
fun launchPhotoPickerWithTranscodingSupport() {
val mediaCapabilities = MediaCapabilities.Builder()
.addSupportedHdrType(MediaCapabilities.HdrType.TYPE_HLG10)
.build()
// Launch the photo picker and let the user choose only videos with
// transcoding enabled.
pickMedia.launch(PickVisualMediaRequest.Builder()
.setMediaType(PickVisualMedia.VideoOnly)
.setMediaCapabilitiesForTranscoding(mediaCapabilities)
.build())
}
การแปลงไฟล์โดยเครื่องมือเลือกรูปภาพจะอิงตามทั้งความสามารถของสื่อของแอปและวิดีโอที่เลือก ระบบจะแสดงผล URI ของวิดีโอที่แปลงแล้วหากมีการดำเนินการแปลง
ข้อควรพิจารณาที่สำคัญสำหรับการแปลง HDR
- ประสิทธิภาพและพื้นที่เก็บข้อมูล: การแปลงไฟล์ต้องใช้เวลาในการประมวลผลและสร้างไฟล์ใหม่ ซึ่งจะกินพื้นที่เก็บข้อมูล
- ขีดจำกัดความยาววิดีโอ: วิดีโอมีความยาวได้สูงสุด 1 นาทีเพื่อรักษาสมดุลระหว่างประสบการณ์ของผู้ใช้และข้อจำกัดด้านพื้นที่เก็บข้อมูล
- การจัดการไฟล์ที่แคชไว้: ระบบจะล้างไฟล์ที่แคชไว้ซึ่งได้รับการเปลี่ยนรูปแบบเป็นระยะๆ ในระหว่างการบำรุงรักษาที่ไม่ได้ใช้งานเพื่อป้องกันการใช้พื้นที่เก็บข้อมูลมากเกินไป
- ความพร้อมให้บริการของอุปกรณ์: เครื่องมือเลือกรูปภาพรองรับการแปลงไฟล์ใน Android 13 (API ระดับ 33) ขึ้นไป
- การผสานรวมกิจกรรม AndroidX: ตรวจสอบว่าคุณใช้ไลบรารีกิจกรรม AndroidX เวอร์ชัน 1.11.0-alpha01 หรือรุ่นอัลฟ่า/เบต้า/RC/เวอร์ชันเสถียรที่ใหม่กว่า เนื่องจากมี
setMediaCapabilitiesForTranscoding
API ที่จำเป็น