![फ़ोटो पिकर का डायलॉग बॉक्स, आपके डिवाइस पर मौजूद मीडिया फ़ाइलों के साथ दिखता है. ऐप्लिकेशन के साथ शेयर करने के लिए कोई फ़ोटो चुनें.](https://developer.android.com/static/images/training/data-storage/photo-picker-multiselect.gif?authuser=9&hl=hi)
फ़ोटो पिकर ऐसा ब्राउज़ किया जा सकने वाला इंटरफ़ेस उपलब्ध कराता है जिसकी मदद से, अपनी मीडिया लाइब्रेरी वाले उपयोगकर्ता को, सबसे नई से सबसे पुरानी तारीख के हिसाब से क्रम में लगाया गया है. जैसा कि यहां दिखाया गया है निजता से जुड़े सबसे सही तरीके कोडलैब, फ़ोटो पिकर, उपयोगकर्ताओं को सुरक्षित अनुभव देता है. साथ ही, इससे आपके ऐप्लिकेशन को पूरी मीडिया लाइब्रेरी के बजाय, सिर्फ़ चुनिंदा इमेज और वीडियो के लिए.
ऐसे उपयोगकर्ता जिनके डिवाइस पर क्लाउड मीडिया सेवा देने वाली ज़रूरी शर्तें पूरी करते हैं, वे भी ये काम कर सकते हैं कहीं से भी सेव की गई फ़ोटो और वीडियो में से चुनें. क्लाउड मीडिया के बारे में ज़्यादा जानें सेवा देने वाली कंपनियां.
यह टूल अपने-आप अपडेट हो जाता है. इससे आपके ऐप्लिकेशन के समय-समय पर, अपने उपयोगकर्ताओं को कोड में बदलाव करने की ज़रूरत नहीं होती.
Jetpack गतिविधि के अनुबंध इस्तेमाल करना
फ़ोटो पिकर को इंटिग्रेट करने की प्रोसेस को आसान बनाने के लिए, इमेज पिकर का 1.7.0 या इसके बाद वाला वर्शन
androidx.activity
लाइब्रेरी.
फ़ोटो पिकर लॉन्च करने के लिए, गतिविधि के नतीजे के इन समझौतों का इस्तेमाल करें:
PickVisualMedia
कोई एक इमेज या वीडियो चुनने के लिए.PickMultipleVisualMedia
एक से ज़्यादा इमेज या वीडियो चुनने के लिए.
अगर किसी डिवाइस पर फ़ोटो पिकर उपलब्ध नहीं है, तो
अपने-आप
ACTION_OPEN_DOCUMENT
इंटेंट कार्रवाई का इस्तेमाल करें. यह इंटेंट, Android 4.4 चलाने वाले डिवाइसों पर काम करता है
(एपीआई लेवल 19) या उसके बाद का वर्शन. यह पुष्टि की जा सकती है कि फ़ोटो पिकर उपलब्ध है या नहीं
अपने मौजूदा डिवाइस पर
isPhotoPickerAvailable()
.
कोई एक मीडिया आइटम चुनें
किसी एक मीडिया आइटम को चुनने के लिए, PickVisualMedia
पर की गई गतिविधि के नतीजे का इस्तेमाल करें
जैसा कि नीचे दिए गए कोड स्निपेट में दिखाया गया है:
Kotlin
// 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)))
Java
// 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());
एक से ज़्यादा मीडिया आइटम चुनें
एक से ज़्यादा मीडिया आइटम चुनने के लिए, चुनने लायक मीडिया फ़ाइलों की ज़्यादा से ज़्यादा संख्या सेट करें. जैसा कि नीचे दिए गए कोड स्निपेट में दिखाया गया है.
Kotlin
// 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))
Java
// 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());
प्लैटफ़ॉर्म, उपयोगकर्ता से तय की गई ज़्यादा से ज़्यादा फ़ाइलों की संख्या तय करता है
फ़ोटो पिकर में चुनें. इस सीमा को ऐक्सेस करने के लिए, कॉल करें
getPickImagesMaxLimit()
.
जिन डिवाइसों पर फ़ोटो पिकर की सुविधा काम नहीं करती उन पर इस सीमा को अनदेखा कर दिया जाता है.
डिवाइस पर उपलब्धता
फ़ोटो पिकर उन डिवाइसों पर उपलब्ध है जो नीचे दी गई शर्तें पूरी करते हैं:
- Android 11 (एपीआई लेवल 30) या उसके बाद का वर्शन काम करता हो
- इसमें बदलाव पाएं मॉड्यूलर सिस्टम कॉम्पोनेंट के ज़रिए Google के सिस्टम अपडेट
पुराने डिवाइस जो Android 4.4 (एपीआई लेवल 19) से लेकर Android 10 (एपीआई लेवल 29) तक के वर्शन पर काम करते हैं
और Android 11 या 12 वर्शन पर चलने वाले ऐसे Android Go डिवाइस जिन पर
Google Play services, फ़ोटो पिकर का बैकपोर्ट किया गया वर्शन इंस्टॉल कर सकती है. यहां की यात्रा पर हूं
इसकी मदद से, बैकपोर्ट किया गया फ़ोटो पिकर मॉड्यूल अपने-आप इंस्टॉल होने की सुविधा चालू करें
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>
मीडिया फ़ाइल का ऐक्सेस बनाए रखना
डिफ़ॉल्ट रूप से, सिस्टम आपके ऐप्लिकेशन को मीडिया फ़ाइलों का ऐक्सेस तब तक देता है, जब तक कि डिवाइस
रीस्टार्ट हुआ या आपका ऐप्लिकेशन बंद हो जाएगा. अगर आपका ऐप्लिकेशन लंबे समय तक चलने वाले काम करता है, जैसे
अगर बैकग्राउंड में कोई बड़ी फ़ाइल अपलोड की जा रही है, तो हो सकता है कि आपको
लंबे समय तक बनी रहती है. ऐसा करने के लिए,
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);