הכלי לבחירת תמונות מספק ממשק שניתן לדפדף בו, שמציג למשתמש את ספריית המדיה שלו, ממוינת לפי תאריך מהחדש לישן. כפי שמוצג ב-Codelab של השיטות המומלצות לשמירה על הפרטיות, הכלי לבחירת תמונות מספק למשתמשים דרך בטוחה ומובנית לתת לאפליקציה גישה רק לתמונות ולסרטונים שנבחרו, במקום לכל ספריית המדיה שלהם.
משתמשים שיש להם במכשיר ספקי מדיה בענן שעומדים בדרישות יכולים גם לבחור תמונות וסרטונים שמאוחסנים מרחוק. מידע נוסף על ספקי מדיה בענן
הכלי מתעדכן באופן אוטומטי, ומציע פונקציונליות מורחבת למשתמשי האפליקציה לאורך זמן בלי צורך בשינויים בקוד.
שימוש בחוזים של Jetpack Activity
כדי לפשט את השילוב של הכלי לבחירת תמונות, צריך לכלול את גרסה 1.7.0 ואילך של הספרייה androidx.activity.
כדי להפעיל את הכלי לבחירת תמונות, משתמשים בחוזים הבאים של תוצאות הפעילות:
אם הכלי לבחירת תמונות לא זמין במכשיר, הספרייה מפעילה באופן אוטומטי את פעולת ה-Intent ACTION_OPEN_DOCUMENT. ה-Intent הזה נתמך במכשירים עם Android מגרסה 4.4 (רמת API 19) ואילך. כדי לבדוק אם הכלי לבחירת תמונות זמין במכשיר מסוים, אפשר לשלוח קריאה אל 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) עד 10 (רמת API 29) ובמכשירי Android Go עם Android בגרסאות 11 או 12 שתומכים ב-Google Play Services, אפשר להתקין גרסה של הכלי לבחירת תמונות שהוסבה לגרסאות מוקדמות יותר (backporting). כדי להפעיל את ההתקנה האוטומטית של מודול הכלי לבחירת תמונות שהוסב לגרסאות מוקדמות יותר באמצעות Google Play Services, מוסיפים את הרשומה הבאה לתג <application> בקובץ המניפסט של האפליקציה:
<!-- 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>
שמירת הגישה לקובצי מדיה
כברירת מחדל, המערכת נותנת לאפליקציה גישה לקובצי מדיה עד שמפעילים מחדש את המכשיר או עד שהאפליקציה מפסיקה לפעול. אם האפליקציה מבצעת עבודה ארוכת טווח, כמו העלאת קובץ גדול ברקע, יכול להיות שתצטרכו שהגישה הזו תימשך לפרק זמן ארוך יותר. כדי לעשות את זה, צריך לבצע קריאה ל-method 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) נוספה היכולת לצלם סרטונים בטווח דינמי גבוה (HDR). למרות ש-HDR מציע חוויה ויזואלית עשירה יותר, יכול להיות שאפליקציות ישנות יותר לא יוכלו להתמודד עם הפורמטים החדשים האלה, מה שיוביל לבעיות כמו עיבוד צבע לא טבעי במהלך ההפעלה (למשל, פנים בגוון ירוק). כדי לפתור את בעיית התאימות הזו, הכלי לבחירת תמונות מציע תכונה של המרת קידוד שיכולה להמיר באופן אוטומטי סרטוני HDR לפורמט טווח דינמי סטנדרטי (SDR) לפני שהם נשלחים לאפליקציה שביקשה אותם.
המטרה העיקרית של המרת קידוד בכלי לבחירת תמונות היא להבטיח חוויית מדיה עקבית ומדויקת מבחינה חזותית במגוון רחב יותר של אפליקציות, גם כאלה שעדיין לא תומכות ב-HDR באופן מפורש. המרת סרטוני HDR ל-SDR בכלי לבחירת תמונות נועדה לשפר את התאימות של האפליקציה ולספק חוויית משתמש חלקה.
איך פועלת המרת קידוד בכלי לבחירת תמונות
המרת קידוד HDR בכלי לבחירת תמונות לא מופעלת כברירת מחדל. כדי להפעיל את התכונה הזו, האפליקציה צריכה להצהיר באופן מפורש על היכולות שלה לטיפול בפורמטים של מדיה כשהיא מפעילה את הכלי לבחירת תמונות.
האפליקציה מספקת לכלי לבחירת תמונות את היכולות שלה לעיבוד מדיה. כדי לעשות את זה, מוסיפים את mediaCapabilities ל-PickVisualMediaRequest.Builder כשמפעילים את הכלי לבחירת תמונות באמצעות ספריית הפעילות של AndroidX. כדי לאפשר את זה, הוספנו ל-PickVisualMediaRequest.Builder ממשק API חדש, setMediaCapabilitiesForTranscoding(capabilities: MediaCapabilities?).
אתם יכולים לשלוט בהתנהגות של המרת קידוד HDR באמצעות המחלקה MediaCapabilities.
צריך לספק אובייקט MediaCapabilities שמציין בדיוק באילו סוגי HDR האפליקציה תומכת (למשל, TYPE_HLG10, TYPE_HDR10, TYPE_HDR10_PLUS, TYPE_DOLBY_VISION).
כדי להשבית את המרת הקידוד לגמרי, קובעים (pass) את הערך 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
- ביצועים ואחסון: המרת קידוד לוקחת זמן עיבוד ויוצרת קובץ חדש, שצורכת נפח אחסון.
- מגבלת אורך הסרטון: כדי לאזן בין חוויית המשתמש לבין מגבלות האחסון, אורך הסרטון מוגבל לדקה אחת.
- ניהול קבצים במטמון: קבצים שעברו המרה ונשמרו במטמון נמחקים מדי פעם במהלך תחזוקה בזמן חוסר פעילות, כדי למנוע שימוש מוגזם בנפח אחסון נדרש.
- זמינות במכשירים: המרת קידוד בכלי לבחירת תמונות נתמכת ב-Android מגרסה 13 (רמת API 33) ואילך.
- שילוב פעילות ב-AndroidX: ודאו שאתם משתמשים בגרסה 1.11.0-alpha01 או בגרסת אלפא/בטא/RC/יציבה מאוחרת יותר של ספריית הפעילות של AndroidX, כי היא כוללת את ה-API הנדרש של
setMediaCapabilitiesForTranscoding.