
ফটো পিকার একটি ব্রাউজেবল ইন্টারফেস প্রদান করে, যা ব্যবহারকারীর মিডিয়া লাইব্রেরিকে নতুন থেকে পুরানো তারিখ অনুসারে সাজিয়ে উপস্থাপন করে। প্রাইভেসি বেস্ট প্র্যাকটিসেস কোডল্যাবে যেমন দেখানো হয়েছে, ফটো পিকার ব্যবহারকারীদের জন্য একটি নিরাপদ ও বিল্ট-ইন উপায় প্রদান করে, যার মাধ্যমে তারা তাদের সম্পূর্ণ মিডিয়া লাইব্রেরির পরিবর্তে আপনার অ্যাপকে শুধুমাত্র নির্বাচিত কিছু ছবি ও ভিডিওতে অ্যাক্সেস দিতে পারে।
যেসব ব্যবহারকারীর ডিভাইসে উপযুক্ত ক্লাউড মিডিয়া প্রোভাইডার রয়েছে, তারা দূরবর্তী স্থানে সংরক্ষিত ফটো ও ভিডিও থেকেও নির্বাচন করতে পারেন। ক্লাউড মিডিয়া প্রোভাইডার সম্পর্কে আরও জানুন ।
এই টুলটি স্বয়ংক্রিয়ভাবে আপডেট হয়, ফলে কোনো কোড পরিবর্তন ছাড়াই সময়ের সাথে সাথে আপনার অ্যাপের ব্যবহারকারীরা বর্ধিত কার্যকারিতা লাভ করেন।
জেটপ্যাক অ্যাক্টিভিটি চুক্তি ব্যবহার করুন
ফটো পিকার ইন্টিগ্রেশন সহজ করার জন্য, androidx.activity লাইব্রেরির ১.৭.০ বা উচ্চতর সংস্করণ অন্তর্ভুক্ত করুন।
ফটো পিকার চালু করতে নিম্নলিখিত অ্যাক্টিভিটি রেজাল্ট কন্ট্রাক্টগুলো ব্যবহার করুন:
- একটিমাত্র ছবি বা ভিডিও নির্বাচন করতে
PickVisualMediaকরুন। - একাধিক ছবি বা ভিডিও নির্বাচন করতে
PickMultipleVisualMediaকরুন।
যদি কোনো ডিভাইসে ফটো পিকারটি উপলব্ধ না থাকে, তাহলে লাইব্রেরিটি স্বয়ংক্রিয়ভাবে এর পরিবর্তে ACTION_OPEN_DOCUMENT ইন্টেন্ট অ্যাকশনটি চালু করে। এই ইন্টেন্টটি অ্যান্ড্রয়েড ৪.৪ (এপিআই লেভেল ১৯) বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলিতে সমর্থিত। কোনো নির্দিষ্ট ডিভাইসে ফটো পিকারটি উপলব্ধ আছে কিনা তা আপনি 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() কল করুন। যেসব ডিভাইসে ফটো পিকার সমর্থিত নয়, সেখানে এই সীমাটি উপেক্ষা করা হয়।
ডিভাইসের প্রাপ্যতা
যেসব ডিভাইস নিম্নলিখিত শর্তগুলো পূরণ করে, সেগুলোতে ফটো পিকারটি পাওয়া যায়:
- অ্যান্ড্রয়েড ১১ (এপিআই লেভেল ৩০) বা তার উচ্চতর সংস্করণ চালান
- গুগল সিস্টেম আপডেটের মাধ্যমে মডিউলার সিস্টেম কম্পোনেন্টগুলোর পরিবর্তনসমূহ গ্রহণ করুন
পুরোনো ডিভাইস যেগুলোতে অ্যান্ড্রয়েড ৪.৪ (এপিআই লেভেল ১৯) থেকে অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) পর্যন্ত চলে এবং অ্যান্ড্রয়েড ১১ বা ১২ চালিত অ্যান্ড্রয়েড গো ডিভাইস যেগুলো গুগল প্লে সার্ভিসেস সমর্থন করে, সেগুলোতে ফটো পিকারের একটি ব্যাকপোর্টেড সংস্করণ ইনস্টল করা যায়। গুগল প্লে সার্ভিসেসের মাধ্যমে ব্যাকপোর্টেড ফটো পিকার মডিউলের স্বয়ংক্রিয় ইনস্টলেশন চালু করতে, আপনার অ্যাপের ম্যানিফেস্ট ফাইলের <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() ` মেথডটি কল করুন:
কোটলিন
val flag = Intent.FLAG_GRANT_READ_URI_PERMISSION context.contentResolver.takePersistableUriPermission(uri, flag)
জাভা
int flag = Intent.FLAG_GRANT_READ_URI_PERMISSION; context.contentResolver.takePersistableUriPermission(uri, flag);
ট্রান্সকোডিংয়ের মাধ্যমে HDR ভিডিও পরিচালনা করুন
অ্যান্ড্রয়েড ১৩ (এপিআই ৩৩)-এর মাধ্যমে হাই ডাইনামিক রেঞ্জ (এইচডিআর) ভিডিও ধারণ করার সুবিধা চালু করা হয়েছে। যদিও এইচডিআর একটি সমৃদ্ধ ভিজ্যুয়াল অভিজ্ঞতা প্রদান করে, কিছু পুরোনো অ্যাপ এই নতুন ফরম্যাটগুলো পরিচালনা করতে সক্ষম নাও হতে পারে, যার ফলে প্লেব্যাকের সময় অস্বাভাবিক রঙের উপস্থাপনার মতো সমস্যা দেখা দেয় (যেমন মুখমণ্ডলে সবুজ আভা)। এই সামঞ্জস্যের ঘাটতি পূরণের জন্য, ফটো পিকার একটি ট্রান্সকোডিং ফিচার প্রদান করে, যা অনুরোধকারী অ্যাপে ভিডিও সরবরাহ করার আগে স্বয়ংক্রিয়ভাবে এইচডিআর ভিডিওগুলোকে স্ট্যান্ডার্ড ডাইনামিক রেঞ্জ (এসডিআর) ফরম্যাটে রূপান্তর করতে পারে।
ফটো পিকার ট্রান্সকোডিং-এর মূল লক্ষ্য হলো আরও বিস্তৃত পরিসরের অ্যাপ্লিকেশনে একটি সামঞ্জস্যপূর্ণ এবং দৃষ্টিনন্দন মিডিয়া অভিজ্ঞতা নিশ্চিত করা, এমনকি সেইসব অ্যাপ্লিকেশনেও যেগুলিতে এখনও সুস্পষ্ট HDR সাপোর্ট নেই। HDR ভিডিওকে SDR-এ ট্রান্সকোড করার মাধ্যমে, ফটো পিকার অ্যাপের সামঞ্জস্যতা উন্নত করতে এবং একটি নির্বিঘ্ন ব্যবহারকারীর অভিজ্ঞতা প্রদান করতে চায়।
ফটো পিকার ট্রান্সকোডিং কীভাবে কাজ করে
ফটো পিকারের HDR ট্রান্সকোডিং ডিফল্টরূপে সক্রিয় থাকে না। এই বৈশিষ্ট্যটি সক্রিয় করতে, ফটো পিকার চালু করার সময় আপনার অ্যাপকে তার মিডিয়া ফরম্যাট পরিচালনার ক্ষমতা স্পষ্টভাবে ঘোষণা করতে হবে।
আপনার অ্যাপ ফটো পিকারকে তার মিডিয়া প্রসেসিং ক্ষমতা প্রদান করে। AndroidX Activity লাইব্রেরি ব্যবহার করে ফটো পিকার চালু করার সময় PickVisualMediaRequest.Builder এ mediaCapabilities যোগ করার মাধ্যমে এটি করা হয়। এই প্রক্রিয়াটি সহজ করার জন্য PickVisualMediaRequest.Builder এ setMediaCapabilitiesForTranscoding(capabilities: MediaCapabilities?) নামে একটি নতুন API যোগ করা হয়েছে।
আপনি MediaCapabilities ক্লাস ব্যবহার করে HDR ট্রান্সকোডিং আচরণ নিয়ন্ত্রণ করতে পারেন। একটি MediaCapabilities অবজেক্ট প্রদান করুন এবং নির্দিষ্ট করে দিন যে আপনার অ্যাপটি ঠিক কোন কোন HDR টাইপ সমর্থন করে (যেমন, TYPE_HLG10 , TYPE_HDR10 , TYPE_HDR10_PLUS , TYPE_DOLBY_VISION )।
ট্রান্সকোডিং সম্পূর্ণরূপে নিষ্ক্রিয় করতে, MediaCapabilities জন্য null পাস করুন। আপনার প্রদত্ত ক্যাপাবিলিটিতে স্পষ্টভাবে তালিকাভুক্ত নয় এমন যেকোনো 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 ট্রান্সকোডিংয়ের জন্য গুরুত্বপূর্ণ বিবেচ্য বিষয়সমূহ
- পারফরম্যান্স এবং স্টোরেজ: ট্রান্সকোডিং-এর জন্য প্রক্রিয়াকরণে সময় লাগে এবং একটি নতুন ফাইল তৈরি হয়, যা স্টোরেজের জায়গা খরচ করে।
- ভিডিওর দৈর্ঘ্যের সীমা: ব্যবহারকারীর অভিজ্ঞতা এবং স্টোরেজের সীমাবদ্ধতার মধ্যে ভারসাম্য রক্ষার জন্য, ভিডিওর দৈর্ঘ্য ১ মিনিটে সীমাবদ্ধ করা হয়েছে।
- ক্যাশ করা ফাইল ব্যবস্থাপনা: অতিরিক্ত স্টোরেজ ব্যবহার রোধ করার জন্য, নিষ্ক্রিয় রক্ষণাবেক্ষণের সময় ক্যাশ করা ট্রান্সকোডেড ফাইলগুলো পর্যায়ক্রমে মুছে ফেলা হয়।
- ডিভাইসে প্রাপ্যতা: ফটো পিকার ট্রান্সকোডিং অ্যান্ড্রয়েড ১৩ (এপিআই লেভেল ৩৩) এবং এর পরবর্তী সংস্করণগুলোতে সমর্থিত।
- AndroidX অ্যাক্টিভিটি ইন্টিগ্রেশন: নিশ্চিত করুন যে আপনি AndroidX অ্যাক্টিভিটি লাইব্রেরির সংস্করণ 1.11.0-alpha01 বা এর পরবর্তী কোনো alpha/beta/RC/stable রিলিজ ব্যবহার করছেন, কারণ এতে প্রয়োজনীয়
setMediaCapabilitiesForTranscodingAPI অন্তর্ভুক্ত রয়েছে।