Photo Library Permission হল একটি অনুমতি যা অ্যাপ্লিকেশনের জন্য ব্যবহারকারীর ডিভাইসে সংরক্ষিত ফটো এবং ভিডিও অ্যাক্সেস করার জন্য প্রয়োজন। গ্যালারি থেকে ছবি নির্বাচন, মিডিয়া ফাইল সংরক্ষণ এবং ফটো অ্যালবাম পরিচালনার জন্য এটি প্রয়োজন। Apple Developer Documentation, 2024 অনুযায়ী, iOS 14 থেকে শুরু করে, অ্যাপ্লিকেশনগুলিকে একসঙ্গে সব ফটোতে নয়, বরং সীমিত লাইব্রেরিতে অ্যাক্সেসের অনুরোধ করতে হবে।
মূল পয়েন্ট
Photo Library Permission হল একটি সিস্টেম অনুমতি যা ডিভাইসে সংরক্ষিত মিডিয়া ফাইলগুলিতে অ্যাপ্লিকেশনের অ্যাক্সেস নিয়ন্ত্রণ করে। এটি পড়া (ফটো এবং ভিডিও দেখা ও নির্বাচন) এবং লেখা (গ্যালারিতে নতুন ফাইল সংরক্ষণ) উভয়ই কভার করে। মোবাইল প্ল্যাটফর্মগুলি মিডিয়া লাইব্রেরিকে সংবেদনশীল ডেটা হিসাবে বিবেচনা করে কারণ ফটোতে ব্যক্তিগত এবং গোপনীয় তথ্য থাকতে পারে।
Android 13 (API 33)-এ, Google একক READ_EXTERNAL_STORAGE অনুমতিকে তিনটি পৃথক অনুমতিতে বিভক্ত করেছে: READ_MEDIA_IMAGES ফটোর জন্য, READ_MEDIA_VIDEO ভিডিওর জন্য এবং READ_MEDIA_AUDIO অডিওর জন্য। এটি ব্যবহারকারীদের শুধুমাত্র একটি নির্দিষ্ট ধরনের মিডিয়া ফাইলে অ্যাক্সেস প্রদান করতে দেয়। iOS-এ, iOS 14 থেকে শুরু করে, PhotoKit ব্যবহারকারীদের সম্পূর্ণ লাইব্রেরি খোলার পরিবর্তে নির্দিষ্ট ফটো নির্বাচন করার সুবিধা দেয়।
Counterpoint Research (2024) অনুযায়ী, সোশ্যাল নেটওয়ার্ক, যোগাযোগ এবং ফটো এডিটর বিভাগে 70% এরও বেশি মোবাইল অ্যাপ্লিকেশন Photo Library Permission-এর অনুরোধ করে। একই সময়ে, 32% ব্যবহারকারী গ্যালারি অ্যাক্সেস অস্বীকার করে যদি তারা না বোঝে যে অ্যাপ্লিকেশনটির তাদের ফটো কেন প্রয়োজন। Apple এবং Google সম্পূর্ণ অ্যাক্সেসের অনুরোধ না করে পৃথক ফাইল নির্বাচনের জন্য সিস্টেম PhotoPicker ব্যবহার করার পরামর্শ দেয়।
Android-এ গ্যালারি অ্যাক্সেস Android 13 প্রকাশের সাথে সাথে উল্লেখযোগ্যভাবে পরিবর্তিত হয়েছে। একটি একক READ_EXTERNAL_STORAGE অনুমতির পরিবর্তে, প্রতিটি মিডিয়া প্রকারের জন্য granular অনুমতি চালু করা হয়েছে, যা ব্যবহারকারীদের আরও নিয়ন্ত্রণ দেয়।
Android 13 থেকে শুরু করে, ফটো অ্যাক্সেসের জন্য READ_MEDIA_IMAGES এবং ভিডিও অ্যাক্সেসের জন্য READ_MEDIA_VIDEO ব্যবহার করা হয়। READ_EXTERNAL_STORAGE অনুমতি আর মিডিয়া ফাইলগুলিতে অ্যাক্সেস প্রদান করে না — এটি শুধুমাত্র শেয়ার্ড স্টোরেজ থেকে নন-মিডিয়া ফাইল পড়ার জন্য রাখা হয়েছে। ম্যানিফেস্টে ঘোষণাটি এইরকম দেখায়:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
Android 12 এবং নিচের সাথে পশ্চাদগামী সামঞ্জস্যের জন্য, আপনাকে READ_EXTERNAL_STORAGE-ও ঘোষণা করতে হবে। তবে, Android 13 নতুন granular অনুমতি উপস্থিত থাকলে এই অনুমতি স্বয়ংক্রিয়ভাবে উপেক্ষা করে। পুরানো অনুমতি নতুন সংস্করণে লুকানোর জন্য ম্যানিফেস্টে android:maxSdkVersion="32" বৈশিষ্ট্য ব্যবহার করুন। এটি Android 13+ চালিত ডিভাইসে অপ্রয়োজনীয় অনুরোধ প্রতিরোধ করে।
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
Android-এ Photo Library Permission-এর জন্য রানটাইম অনুরোধ Activity Result API-এর মাধ্যমে করা হয়। ছবি অ্যাক্সেসের অনুরোধের উদাহরণ:
private val photoPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
if (granted) {
loadGalleryImages()
} else {
showPermissionDenied()
}
}
fun pickPhoto() {
val permission = if (Build.version.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
Manifest.permission.READ_MEDIA_IMAGES
} else {
Manifest.permission.READ_EXTERNAL_STORAGE
}
if (ContextCompat.checkSelfPermission(this, permission)
== PackageManager.PERMISSION_GRANTED) {
loadGalleryImages()
} else {
photoPermissionLauncher.launch(permission)
}
}
iOS-এ গ্যালারি অ্যাক্সেস PhotoKit ফ্রেমওয়ার্ক এবং Info.plist-এ NSPhotoLibraryUsageDescription ও NSPhotoLibraryAddUsageDescription কী-এর মাধ্যমে পরিচালিত হয়। iOS 14 থেকে শুরু করে, ব্যবহারকারীরা শুধুমাত্র নির্বাচিত ফটোতে অ্যাক্সেস প্রদান করতে পারেন (Limited Photo Library)।
লাইব্রেরি থেকে ফটো পড়ার জন্য NSPhotoLibraryUsageDescription প্রয়োজন, যখন লেখার (ফটো সংরক্ষণ) জন্য NSPhotoLibraryAddUsageDescription প্রয়োজন। অ্যাপ্লিকেশন যদি শুধুমাত্র মিডিয়া সংরক্ষণ করে কিন্তু পড়ে না, তাহলে দ্বিতীয় কী যথেষ্ট।
<key>NSPhotoLibraryUsageDescription</key>
<string>প্রোফাইল ছবি নির্বাচন এবং স্ন্যাপশট প্রকাশের জন্য অ্যাপের ফটোতে অ্যাক্সেস প্রয়োজন।</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>প্রক্রিয়াকৃত ফটো আপনার গ্যালারিতে সংরক্ষণের জন্য অ্যাপের অ্যাক্সেস প্রয়োজন।</string>
iOS-এ ফটো অ্যাক্সেসের অনুরোধ PHPhotoLibrary.requestAuthorization-এর মাধ্যমে করা হয়। iOS 14 থেকে শুরু করে, .limited স্ট্যাটাস নির্দেশ করে যে ব্যবহারকারী ফটোর একটি সীমিত সেটে অ্যাক্সেস দিয়েছেন।
import PhotosUI
func requestPhotoLibraryAccess() {
PHPhotoLibrary.requestAuthorization { status in
DispatchQueue.main.async {
switch status {
case .authorized:
self.loadPhotoLibrary()
case .limited:
self.loadSelectedPhotos()
case .denied, .restricted:
self.showSettingsAlert()
case .notDetermined:
break
}
}
}
}
private func loadPhotoLibrary() {
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let assets = PHAsset.fetchAssets(with: .image, options: fetchOptions)
// অনুরোধের ফলাফল পরিচালনা
}
iOS 14+ এ .limited স্ট্যাটাস মানে ব্যবহারকারী শুধুমাত্র কয়েকটি নির্বাচিত ফটোতে অ্যাক্সেস দিয়েছেন। অ্যাপ্লিকেশন PHPhotoLibrary.shared().presentLimitedLibraryPicker কল করে সিস্টেম ডায়ালগের মাধ্যমে বর্ধিত অ্যাক্সেসের অনুরোধ করতে পারে। এই ডায়ালগটি শুধুমাত্র তখনই দেখানোর পরামর্শ দেওয়া হয় যখন ব্যবহারকারী স্পষ্টভাবে এমন একটি বৈশিষ্ট্যের অনুরোধ করে যার জন্য অতিরিক্ত ফটো প্রয়োজন।
PhotoPicker হল একটি সিস্টেম কম্পোনেন্ট যা মিডিয়া ফাইল নির্বাচনের জন্য এবং এটির সম্পূর্ণ লাইব্রেরি অ্যাক্সেস করার অনুমতির প্রয়োজন হয় না। Android 13 এবং iOS 14 থেকে শুরু করে, Google এবং Apple Photo Library Permission-এর অনুরোধ করার পরিবর্তে PhotoPicker ব্যবহার করার পরামর্শ দেয় যদি অ্যাপ্লিকেশনটির শুধুমাত্র এক বা কয়েকটি ফটো নির্বাচন করার প্রয়োজন হয়।
Android 13+ এ, বিল্ট-ইন PhotoPicker (ActivityResultContracts.PickVisualMedia) ব্যবহারকারীদের সম্পূর্ণ গ্যালারিতে অ্যাক্সেস না দিয়ে ফটো বা ভিডিও নির্বাচন করতে দেয়। অ্যাপ্লিকেশনটি শুধুমাত্র নির্বাচিত ফাইলগুলির URI পায়। PhotoPicker ম্যানিফেস্টে কোনো অনুমতি ঘোষণা না করেই কাজ করে।
private val pickMedia =
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
if (uri != null) {
// নির্বাচিত ফাইলের URI, সম্পূর্ণ লাইব্রেরিতে অ্যাক্সেস ছাড়া
showImage(uri)
}
}
fun selectPhoto() {
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
iOS 14+ এ PHPickerViewController চালু করা হয়েছে — একটি সিস্টেম পিকার যারও সম্পূর্ণ লাইব্রেরি অ্যাক্সেসের প্রয়োজন হয় না। PHPicker একটি পৃথক প্রক্রিয়ায় চলে এবং অ্যাপ্লিকেশনের লাইব্রেরিতে তার অ্যাক্সেস থাকে না। এটি বেশিরভাগ পরিস্থিতির জন্য ফটো নির্বাচনের পছন্দের উপায়।
import PhotosUI
func presentPhotoPicker() {
var config = PHPickerConfiguration()
config.selectionLimit = 1
config.filter = .images
let picker = PHPickerViewController(configuration: config)
picker.delegate = self
present(picker, animated: true)
}
PhotoPicker উপযুক্ত নয় যদি অ্যাপ্লিকেশনটির ব্যাপক অপারেশনের জন্য সম্পূর্ণ লাইব্রেরি অ্যাক্সেসের প্রয়োজন হয়: ব্যাকআপ, ক্লাউড সিঙ্ক্রোনাইজেশন, গ্যালারি অ্যাপ্লিকেশন, ফাইল ম্যানেজার। এই ক্ষেত্রে, আপনাকে Photo Library Permission-এর অনুরোধ করতে হবে এবং সীমিত অ্যাক্সেস (Limited) পরিচালনা করতে হবে। iOS-এর জন্য, .limited স্ট্যাটাস পরিচালনা এবং ব্যবহারকারীদের অ্যাক্সেস বাড়ানোর বিকল্প প্রদান করা বাধ্যতামূলক।
সেরা অভ্যাস Photo Library Permission-এর সাথে কাজ করার জন্য প্রত্যাখ্যানের সংখ্যা কমাতে এবং প্ল্যাটফর্মের গোপনীয়তার প্রয়োজনীয়তা মেনে চলতে সাহায্য করে।
এক বা একাধিক ফটো নির্বাচনের জন্য, সিস্টেম PhotoPicker বা PHPicker ব্যবহার করুন। এই কম্পোনেন্টগুলির অনুমতির প্রয়োজন হয় না এবং সেরা ব্যবহারকারীর অভিজ্ঞতা প্রদান করে। সম্পূর্ণ গ্যালারি অ্যাক্সেসের অনুরোধ শুধুমাত্র তখনই করুন যদি অ্যাপ্লিকেশনের কার্যকারিতার জন্য সম্পূর্ণ মিডিয়া লাইব্রেরি অ্যাক্সেসের প্রয়োজন হয়। Google এবং Apple তাদের ডেভেলপার ডকুমেন্টেশনে স্পষ্টভাবে এই পদ্ধতির পরামর্শ দেয়।
অ্যাপ্লিকেশনটির যদি সত্যিই সম্পূর্ণ গ্যালারি অ্যাক্সেসের প্রয়োজন হয়, তবে ব্যাখ্যা সহ একটি প্রাথমিক স্ক্রিন দেখান। ব্যাখ্যা করুন কেন সব ফটো প্রয়োজন শুধু একটি নয়। উদাহরণস্বরূপ, একটি ব্যাকআপ অ্যাপ্লিকেশনকে ব্যাখ্যা করা উচিত যে এটি কপি তৈরি করতে সমস্ত মিডিয়া ফাইল স্ক্যান করবে। পূর্ব-অনুমতি স্ক্রিন সীমিত অ্যাক্সেস প্রক্রিয়ার কারণে iOS-এর জন্য বিশেষভাবে গুরুত্বপূর্ণ।
অ্যাপ্লিকেশনটি যদি শুধুমাত্র ফটো সংরক্ষণ করে কিন্তু পড়ে না (উদাহরণস্বরূপ, একটি ফটো এডিটর যা ফলাফল সংরক্ষণ করে), তবে শুধুমাত্র গ্যালারিতে লেখার অনুমতি অনুরোধ করুন। Android-এ, এটি WRITE_EXTERNAL_STORAGE (Android 12 এবং নিচের জন্য) বা অনুমতি ছাড়া MediaStore API (Android 10+ এর জন্য)। iOS-এ, NSPhotoLibraryUsageDescription ছাড়া NSPhotoLibraryAddUsageDescription ব্যবহার করুন।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Android 10 (API 29) থেকে শুরু করে, MediaStore-এর মাধ্যমে ফটো সংরক্ষণের জন্য WRITE_EXTERNAL_STORAGE অনুমতির প্রয়োজন নেই। সিস্টেম স্পষ্ট অনুমতি ছাড়া লেখার জন্য শেয়ার্ড স্টোরেজে অ্যাক্সেস প্রদান করে। অন্যান্য ব্যবহারকারীদের ফাইল পড়ার জন্য এখনও উপযুক্ত অনুমতি প্রয়োজন।
READ_EXTERNAL_STORAGE হল শেয়ার্ড স্টোরেজ থেকে সব ফাইল পড়ার পুরানো অনুমতি (Android 12 পর্যন্ত)। READ_MEDIA_IMAGES হল শুধুমাত্র ছবি পড়ার জন্য নতুন granular অনুমতি (Android 13+)। ব্যবহারকারীরা ভিডিও এবং অডিওতে অ্যাক্সেস অস্বীকার করে শুধুমাত্র ফটোতে অ্যাক্সেস দিতে পারেন।
.limited স্ট্যাটাস মানে ব্যবহারকারী অ্যাক্সেসের জন্য কিছু ফটো নির্বাচন করেছেন। অ্যাপ্লিকেশন PHPhotoLibrary.shared().presentLimitedLibraryPicker-এর মাধ্যমে সিস্টেম এক্সটেনশন ডায়ালগ প্রদর্শন করতে পারে। এই ডায়ালগটি শুধুমাত্র ব্যবহারকারীর স্পষ্ট অনুরোধে দেখানোর পরামর্শ দেওয়া হয়, উদাহরণস্বরূপ, “আরও ফটো যোগ করুন” বাটনে ট্যাপ করার সময়।
হ্যাঁ, Photo Library Permission-এর সাথে, অ্যাপ্লিকেশন EXIF ডেটা পড়তে পারে, যার মধ্যে জিওট্যাগ, ক্যাপচার তারিখ এবং ক্যামেরা মডেল অন্তর্ভুক্ত। iOS-এ, জিওট্যাগ অ্যাক্সেস করার জন্য অতিরিক্ত অবস্থান অনুমতি প্রয়োজন হতে পারে, কারণ Apple GPS স্থানাঙ্ককে গোপনীয় ডেটা হিসাবে বিবেচনা করে।
সিস্টেম পিকার ব্যবহার করুন: iOS-এ PHPicker filter = .videos সহ, Android-এ PickVisualMedia VideoOnly সহ। Android-এ, আপনি MediaStore.Video.Media.EXTERNAL_CONTENT_URI সহ Intent(Intent.ACTION_PICK)-ও ব্যবহার করতে পারেন, কিন্তু এর জন্য Android 13-এর নিচের সংস্করণে READ_EXTERNAL_STORAGE অনুমতি প্রয়োজন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন