AndroidManifest Permissions হল AndroidManifest.xml ফাইলে অনুমতির ঘোষণা যা নির্ধারণ করে যে একটি অ্যাপ্লিকেশন কোন সিস্টেম রিসোর্স এবং ডেটা অ্যাক্সেস করতে পারে। Android-এর জন্য প্রতিটি অনুমতি সংশ্লিষ্ট API ব্যবহার করার আগে ম্যানিফেস্টে ঘোষণা করা প্রয়োজন: ক্যামেরা এবং জিওলোকেশন থেকে SMS পাঠানো এবং পরিচিতি অ্যাক্সেস করা পর্যন্ত। Android Developer Documentation অনুসারে, প্রতিটি অনুমতি চারটি সুরক্ষা স্তরের একটিতে পড়ে: normal, dangerous, signature এবং special।
মূল পয়েন্ট
AndroidManifest Permissions হল Android-এর নিরাপত্তা ব্যবস্থা যা সুরক্ষিত ডেটা এবং সিস্টেম ফাংশনে অ্যাপ্লিকেশন অ্যাক্সেস নিয়ন্ত্রণ করে। প্রতিটি অ্যাপ্লিকেশনকে
Android অনুমতি মডেল বিবর্তনের বেশ কয়েকটি ধাপ অতিক্রম করেছে। Android 6.0 (API 23) এর আগে, সমস্ত অনুমতি ইনস্টলেশনের সময় প্রদান করা হত — ব্যবহারকারী সম্পূর্ণ তালিকা দেখত এবং অ্যাপ্লিকেশন ইনস্টল করতে সম্মত বা অস্বীকার করত। Android 6.0 থেকে শুরু করে, dangerous স্তরের অনুমতিগুলি রানটাইমে (Runtime Permissions) অনুরোধ করা হয়, যা ব্যবহারকারীকে আরও নমনীয় নিয়ন্ত্রণ দেয়।
অনুমতিগুলি চারটি সুরক্ষা স্তরে বিভক্ত: normal (ইনস্টলেশনে স্বয়ংক্রিয়ভাবে প্রদান), dangerous (রানটাইম অনুরোধ প্রয়োজন), signature (শুধুমাত্র একই সার্টিফিকেট দিয়ে স্বাক্ষরিত অ্যাপ্লিকেশনের জন্য উপলব্ধ) এবং special (সেটিংসে পৃথক সক্রিয়করণ প্রয়োজন)। প্রতিটি স্তরের নিজস্ব প্রদান এবং প্রত্যাহার প্রক্রিয়া রয়েছে।
Google I/O 2024 অনুসারে, Android 15 আরও গ্র্যানুলার অনুমতি চালু করার পরিকল্পনা করছে — ব্যবহারকারী পুরো মিডিয়া লাইব্রেরির পরিবর্তে শুধুমাত্র নির্দিষ্ট ফাইলগুলিতে অ্যাক্সেস দিতে পারবেন। এটি ডিফল্টরূপে প্রদত্ত ডেটার পরিমাণ কমানোর Android-এর প্রবণতা অব্যাহত রাখে।
iOS-এর বিপরীতে, যেখানে সমস্ত অনুমতি রানটাইমে অনুরোধ করা হয়, Android অনুমতিগুলিকে ইনস্টল-টাইম এবং রানটাইমে বিভক্ত করে। normal স্তর ব্যবহারকারীকে না জানিয়েই ইনস্টলেশনে স্বয়ংক্রিয়ভাবে প্রদান করা হয়। dangerous স্তরের iOS-এর মতো স্পষ্ট ডায়ালগ প্রয়োজন।
আরেকটি পার্থক্য: Android-এ, অনুমতিগুলি অনুমতি গ্রুপে সংগঠিত। যদি ব্যবহারকারী ক্যামেরা অ্যাক্সেসে সম্মত হন, অ্যাপ্লিকেশন স্বয়ংক্রিয়ভাবে মাইক্রোফোন অ্যাক্সেস পায় — তারা একই MICROPHONE গ্রুপে রয়েছে। iOS-এ, প্রতিটি অনুমতি গ্রুপ নির্বিশেষে স্বাধীনভাবে অনুরোধ করা হয়।
| Android সংস্করণ | অনুমতি মডেলে পরিবর্তন |
|---|---|
| Android 1.0–5.x | সমস্ত অনুমতি ইনস্টলেশনে প্রদান করা হয় |
| Android 6.0 (API 23) | dangerous স্তরের জন্য Runtime Permissions প্রবর্তন |
| Android 10 (API 29) | Scoped Storage — ফাইল সিস্টেমে সীমিত অ্যাক্সেস |
| Android 11 (API 30) | অটো-রিসেট অনুমতি — অব্যবহৃত অনুমতি রিসেট হয় |
| Android 14 (API 34) | মিডিয়া অ্যাক্সেসের জন্য রানটাইম অনুমতি (ছবি, ভিডিও, অডিও) |
Android অনুমতির জন্য চারটি সুরক্ষা স্তর সংজ্ঞায়িত করে, প্রতিটির নিজস্ব প্রদান নিয়ম রয়েছে। আসুন প্রতিটি স্তর বিস্তারিতভাবে দেখি।
Normal অনুমতিগুলি ব্যবহারকারীকে না জানিয়ে বা অনুরোধ না করেই অ্যাপ্লিকেশন ইনস্টলেশনে স্বয়ংক্রিয়ভাবে প্রদান করা হয়। এগুলি নিম্ন-ঝুঁকির ফাংশন কভার করে যা ব্যবহারকারীর গোপনীয়তার জন্য হুমকি নয়: INTERNET, ACCESS_NETWORK_STATE, VIBRATE, BLUETOOTH। ব্যবহারকারী কোনও সম্মতি ডায়ালগ দেখেন না — অনুমতি ইনস্টলেশনের পরেই প্রদান করা হয়েছে বলে গণ্য হয়।
Normal অনুমতির জন্য ডেভেলপারকে কোডে অনুরোধ পরিচালনা করার প্রয়োজন নেই — ম্যানিফেস্টে ঘোষণা করাই যথেষ্ট। তবে, Android 12+-এ, Google Play থেকে ইনস্টল করার সময়, ব্যবহারকারী সমস্ত normal অনুমতি তালিকাভুক্ত একটি «অনুমতি» ট্যাব দেখেন, যা স্বচ্ছতা বাড়ায়। Statista (2024) অনুসারে, Google Play-তে 90% এর বেশি অ্যাপ্লিকেশন সবচেয়ে সাধারণ normal অনুমতি হিসেবে INTERNET ব্যবহার করে।
Dangerous অনুমতিগুলি ডেটা এবং ফাংশনে অ্যাক্সেস কভার করে যা গোপনীয়তার সাথে আপস করতে পারে: ক্যামেরা, মাইক্রোফোন, জিওলোকেশন, পরিচিতি, SMS, ফোন, ক্যালেন্ডার, বডি সেন্সর। এই অনুমতিগুলির একটি দুই-পদক্ষেপ প্রক্রিয়া প্রয়োজন: ম্যানিফেস্টে ঘোষণা + ActivityCompat.requestPermissions()-এর মাধ্যমে রানটাইম অনুরোধ।
ব্যবহারকারী একটি dangerous অনুমতি অস্বীকার করতে পারেন, এবং অ্যাপ্লিকেশনকে এই পরিস্থিতি সঠিকভাবে পরিচালনা করতে হবে। Android 11+-এ, যদি ব্যবহারকারী দুবার অস্বীকার করেন, পরবর্তী অনুরোধগুলি সিস্টেম ডায়ালগ দেখায় না — সিস্টেম স্বয়ংক্রিয়ভাবে DENIED ফেরত দেয়। এই ক্ষেত্রে, অ্যাপ্লিকেশনকে ব্যবহারকারীকে সেটিংসে নির্দেশিত করা উচিত।
signature স্তর — অনুমতি স্বয়ংক্রিয়ভাবে প্রদান করা হয় যদি অ্যাপ্লিকেশন একই সার্টিফিকেট দিয়ে স্বাক্ষরিত হয় যা সিস্টেম বা অন্য একটি অ্যাপ্লিকেশন অনুমতিটি সংজ্ঞায়িত করেছে। সিস্টেম এবং কর্পোরেট অ্যাপ্লিকেশনের জন্য ব্যবহৃত হয়। উদাহরণ: BIND_ACCESSIBILITY_SERVICE — শুধুমাত্র সিস্টেম অ্যাপ্লিকেশনের জন্য উপলব্ধ।
special স্তর (SYSTEM_ALERT_WINDOW, WRITE_SETTINGS, REQUEST_INSTALL_PACKAGES, MANAGE_EXTERNAL_STORAGE) — সিস্টেম সেটিংসের মাধ্যমে ব্যবহারকারীর স্পষ্ট পদক্ষেপ প্রয়োজন। অ্যাপ্লিকেশন Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION) ব্যবহার করে সেটিংস পৃষ্ঠা খুলতে পারে। Google Play special অনুমতি ব্যবহার সীমাবদ্ধ করে এবং প্রকাশনার সময় ফর্মে যৌক্তিকতা প্রয়োজন।
Android 6.0 থেকে, সমস্ত dangerous অনুমতির রানটাইম অনুরোধ প্রয়োজন। আসুন Kotlin-এ রানটাইম অনুমতি নিয়ে সম্পূর্ণ কাজের চক্র দেখি।
যে API-র জন্য dangerous অনুমতি প্রয়োজন তা কল করার আগে, সর্বদা ContextCompat.checkSelfPermission()-এর মাধ্যমে বর্তমান স্থিতি পরীক্ষা করুন। যদি স্থিতি PERMISSION_GRANTED হয়, আপনি API কল করতে পারেন। যদি PERMISSION_DENIED হয়, আপনাকে ActivityResultContract RequestPermission (AndroidX) বা পুরোনো requestPermissions()-এর মাধ্যমে অনুমতি অনুরোধ করতে হবে।
একসাথে একাধিক অনুমতি অনুরোধ করতে ActivityResultContracts.RequestMultiplePermissions ব্যবহার করার পরামর্শ দেওয়া হয়। Google একটি ডায়ালগে সম্পর্কিত অনুমতি (যেমন, ভিডিও রেকর্ডিংয়ের জন্য ক্যামেরা + মাইক্রোফোন) গ্রুপ করার পরামর্শ দেয়, যাতে ব্যবহারকারী অনুরোধের সম্পূর্ণ প্রসঙ্গ দেখতে পান।
import android.Manifest
import android.content.pm.PackageManager
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
class CameraActivity : AppCompatActivity() {
private val requestPermissionLauncher =
registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
if (isGranted) {
openCamera()
} else {
explainWhyPermissionNeeded()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
checkCameraPermission()
}
private fun checkCameraPermission() {
when {
ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED -> {
openCamera()
}
shouldShowRequestPermissionRationale(
Manifest.permission.CAMERA
) -> {
showRationale()
}
else -> {
requestPermissionLauncher.launch(
Manifest.permission.CAMERA
)
}
}
}
}
যদি ব্যবহারকারী দুবার অস্বীকার করেন, Android অনুরোধটিকে «Never ask again» অবস্থায় নিয়ে যায়। এই ক্ষেত্রে, shouldShowRequestPermissionRationale() false ফেরত দেয় এবং সিস্টেম ডায়ালগ দেখানো হবে না। অ্যাপ্লিকেশনকে Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)-এর মাধ্যমে ব্যবহারকারীকে সিস্টেম সেটিংসে নির্দেশিত করা উচিত।
গুরুত্বপূর্ণ: প্রথম অস্বীকৃতির পরপরই সেটিংস খোলার অফার দেওয়া ডায়ালগ দেখাবেন না — এটি আক্রমণাত্মক আচরণ হিসাবে বিবেচিত হয়। shouldShowRequestPermissionRationale() ব্যবহার করে নির্ধারণ করুন যে ব্যাখ্যা দেখানোর প্রয়োজন কিনা। Material Design Guidelines শুধুমাত্র «সেটিংস খুলুন» বোতামের পরিবর্তে অ্যাক্সেসের মান ব্যাখ্যা করে একটি স্ক্রিন দেখানোর পরামর্শ দেয়।
private fun openAppSettings() {
Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", packageName, null)
).also { intent ->
startActivity(intent)
}
}
private fun showPermissionSettings() {
AlertDialog.Builder(this)
.setTitle("ক্যামেরায় অ্যাক্সেস")
.setMessage("সেটিংসে ক্যামেরা অ্যাক্সেসের অনুমতি দিন, "
+ "প্রোফাইল ছবি তোলার জন্য")
.setPositiveButton("সেটিংস খুলুন") { _, _ ->
openAppSettings()
}
.setNegativeButton("বাতিল করুন", null)
.show()
}
AndroidManifest.xml ফাইলে প্রতিটি অনুমতির জন্য
প্রতিটি অনুমতি একটি পৃথক
উদাহরণস্বরূপ, WRITE_EXTERNAL_STORAGE অনুমতি Android 10+ (Scoped Storage) এ প্রয়োজন নেই, তাই maxSdkVersion="28" (Android 9) নির্দিষ্ট করুন। এটি নতুন সংস্করণে ব্যবহারকারীদের অপ্রয়োজনীয় প্রশ্ন প্রতিরোধ করে। Android Studio Lint-এর মাধ্যমে প্রস্তাবিত maxSdkVersion সম্পর্কে সতর্ক করে।
<!-- AndroidManifest.xml -->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Normal permissions (install-time) -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Dangerous permissions (runtime) -->
<uses-permission
android:name="android.permission.CAMERA" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Legacy storage permission limited to API 28 and below -->
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<application>
<!-- ... -->
</application>
</manifest>
সমস্ত হার্ডওয়্যার বৈশিষ্ট্যের জন্য required="false" সেট করার এবং PackageManager.hasSystemFeature()-এর মাধ্যমে প্রোগ্রামেটিকভাবে উপলব্ধতা পরীক্ষা করার পরামর্শ দেওয়া হয়। এটি আপনার অ্যাপ্লিকেশনের দর্শক প্রসারিত করে। একমাত্র ব্যতিক্রম যদি বৈশিষ্ট্যটি অ্যাপ্লিকেশনের অপারেশনের জন্য গুরুত্বপূর্ণ হয় (GPS ছাড়া ট্যাক্সি অর্ডারিং অ্যাপ্লিকেশনের কোনও মানে নেই)।
অনুমতির সঠিক ব্যবস্থাপনা Android অ্যাপ্লিকেশন মানের একটি মূল দিক। আসুন প্রধান সুপারিশ এবং সাধারণ ত্রুটিগুলি পর্যালোচনা করি।
শুধুমাত্র সেই অনুমতিগুলি অনুরোধ করুন যা অ্যাপ্লিকেশন পরিচালনার জন্য সত্যিই প্রয়োজনীয়। প্রতিটি অতিরিক্ত অনুমতি ইনস্টল রূপান্তর হ্রাস করে এবং অস্বীকৃতি হার বাড়ায়। Google Play Console দেখায় কতজন ব্যবহারকারী অনুমতি সেটের কারণে ইনস্টলেশন প্রত্যাখ্যান করেছেন। AppBrain (2024) অনুসারে, 10+ dangerous অনুমতি সহ অ্যাপ্লিকেশনগুলির 35% কম ইনস্টল রয়েছে।
নিয়মিত আপনার অনুমতি তালিকা পর্যালোচনা করুন। অব্যবহৃত অনুমতিগুলি সরান, বিশেষ করে নতুন Android সংস্করণে মাইগ্রেট করার সময় যেখানে কিছু অনুমতি ঐচ্ছিক হয়ে যায়। উদাহরণস্বরূপ, Android 13+ এ ফটো পিকার (ActivityResultContracts.PickVisualMedia) দিয়ে, মিডিয়া লাইব্রেরি অ্যাক্সেস বিপজ্জনক READ_MEDIA_IMAGES অনুমতি ছাড়াই পাওয়া যেতে পারে।
একটি বিপজ্জনক অনুমতি অনুরোধ করার আগে, ব্যবহারকারীকে একটি স্ক্রিন দেখান যা ব্যাখ্যা করে কেন এই অনুমতি প্রয়োজন এবং এটি কী মূল্য প্রদান করে। Material Design একটি আইকন, সংক্ষিপ্ত পাঠ এবং «চালিয়ে যান» বোতাম সহ বটম শীট বা ডায়ালগ ব্যবহার করার পরামর্শ দেয়। যুক্তি সরাসরি অনুরোধের তুলনায় সম্মতি 20-30% বাড়ায়।
launch() কল করার আগে shouldShowRequestPermissionRationale() পরীক্ষা করুন। যদি true হয়, যুক্তি দেখান। যদি false হয়, হয় অনুমতি ইতিমধ্যে দেওয়া হয়েছে বা ব্যবহারকারী স্থায়ীভাবে এটি অস্বীকার করেছেন (আবার কখনও জিজ্ঞাসা করবেন না)। শেষের ক্ষেত্রে, অনুরোধ পুনরাবৃত্তি করার পরিবর্তে «সেটিংস খুলুন» বোতাম দেখান।
সমস্ত সম্ভাব্য পরিস্থিতি পরীক্ষা করুন: অনুমতি প্রদান, অস্বীকৃতি, স্থায়ী অস্বীকৃতি, সেটিংসে অনুমতি প্রত্যাহার, অনুমতি রিসেট (Android 11+ অটো-রিসেট)। প্রতিটি পরিস্থিতি ক্র্যাশ বা ডেটা ক্ষতি ছাড়াই পরিচালনা করা উচিত। Android Testing Guide পরীক্ষা স্বয়ংক্রিয় করতে TestPermission লাইব্রেরি ব্যবহার করার পরামর্শ দেয়।
সেই পরিস্থিতিতে বিশেষ মনোযোগ দিন যখন ব্যবহারকারী অ্যাপ্লিকেশন চলাকালীন অনুমতি প্রত্যাহার করেন (অ্যাপ্লিকেশন ছোট → সেটিংস → প্রত্যাহার)। অ্যাপ্লিকেশনে ফিরে আসার পরে, onResume()-এ সমস্ত অনুমতি পরীক্ষা করুন। অনুমতি স্থিতি ক্যাশ করার উপর নির্ভর করবেন না — ব্যবহারকারী যে কোনও সময় এটি পরিবর্তন করতে পারেন।
সচরাচর জিজ্ঞাসা
হ্যাঁ, যদি একটি SDK তার ম্যানিফেস্টে একটি অনুমতি অন্তর্ভুক্ত করে, এটি বিল্ড সময়ে অ্যাপ্লিকেশন ম্যানিফেস্টের সাথে মার্জ হয়। আপনি AndroidManifest.xml-এ tools:node="remove" ব্যবহার করে একটি অপ্রয়োজনীয় SDK অনুমতি সরাতে পারেন।
অনুমতি ছাড়া API কল করলে SecurityException হবে, যা অ্যাপ্লিকেশন ক্র্যাশ করবে। সংশ্লিষ্ট API ব্যবহার করার আগে সর্বদা অনুমতি স্থিতি পরীক্ষা করুন এবং অস্বীকৃতি সঠিকভাবে পরিচালনা করুন।
ডিভাইস সেটিংসে: সেটিংস → অ্যাপস → [আপনার অ্যাপ] → অনুমতি। সমস্ত অনুমতি রিসেট করতে, adb কমান্ড ব্যবহার করুন: adb shell pm reset-permissions।
হ্যাঁ, Fragment বা Service-এ ActivityResultLauncher ব্যবহার করে। তবে, অনুরোধ ডায়ালগের সর্বদা Activity UI প্রসঙ্গ প্রয়োজন। Service-এর জন্য, আপনি একটি অনুরোধ Activity খোলার Intent সহ একটি Notification দেখাতে পারেন।
উদাহরণস্বরূপ, WRITE_EXTERNAL_STORAGE Android 10+ (Scoped Storage) এ প্রয়োজন নেই। android:maxSdkVersion="28" নির্দিষ্ট করে, আপনি নতুন সংস্করণে অনুমতি ঘোষণা বাদ দেন, যা সামঞ্জস্য উন্নত করে এবং অনুরোধ করা অনুমতির তালিকা হ্রাস করে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন