Normal Permission হল Android এ অনুমতির একটি শ্রেণী যা সিস্টেম ব্যবহারকারীকে জিজ্ঞেস করা ছাড়াই স্বচালিতভাবে প্রদান করে। Android Developer Documentation, 2024 অনুযায়ী, সাধারণ অনুমতিগুলির ProtectionLevel normal থাকে এবং বিপদজনকগুলির মতো রানটাইম ডায়ালগ প্রয়োজন হয় না। এগুলি ইন্টারনেট, নেটওয়ার্ক অবস্থা এবং কম্পন অ্যাক্সেস অন্তর্ভুক্ত করে, যা ব্যবহারকারীর সংবেদনশীল ডেটার জন্য কোন ঝুঁকি তৈরি করে না।
মূল বিষয়
Normal Permission হল Android এ ProtectionLevel normal সহ একটি সিস্টেম অনুমতির ধরন, যা ইনস্টলেশনের সময় অ্যাপ্লিকেশনকে স্বচালিতভাবে প্রদান করা হয়। ডেভেলপারকে এটি অনুরোধ করার জন্য কোড লিখতে হবে না — শুধু AndroidManifest.xml এ অনুমতি ঘোষণা করলেই হবে। ব্যবহারকারী কোন ডায়ালগ দেখে না এবং সে পৃথকভাবে একটি সাধারণ অনুমতি প্রত্যাহার করতে পারে না, শুধু পুরো অ্যাপ্লিকেশন আনইনস্টল করে।
Android সিস্টেম সাধারণ অনুমতিগুলিকে নিম্ন-ঝুঁকি বলে শ্রেণীবদ্ধ করে — এগুলি ব্যক্তিগত ডেটা, ক্যামেরা বা মাইক্রোফোনে অ্যাক্সেস প্রদান করে না। সাধারণ উদাহরণ: ইন্টারনেট অ্যাক্সেস, কম্পন নিয়ন্ত্রণ, Wi-Fi অবস্থা পড়া। Android Security Model (2024) অনুযায়ী, প্রায় 40 শতাংশ সিস্টেম অনুমতি সাধারণ শ্রেণীর অন্তর্ভুক্ত।
একটি গুরুত্বপূর্ণ বৈশিষ্ট্য — সাধারণ অনুমতিগুলি সেটিংসের মাধ্যমে রানটাইমে প্রত্যাহার করা যায় না। যদি ব্যবহারকারী অ্যাক্সেস অস্বীকার করতে চায়, তাহলে একমাত্র উপায় হল অ্যাপ্লিকেশন আনইনস্টল করা। ডেভেলপারদের আর্কিটেকচারে এটি মনে রাখা উচিত, কিন্তু ব্যবহারকারীদের জন্য এই পদ্ধতি মিথস্থাপনকে সহজ করে: প্রথম লঞ্চে কোন ডায়ালগ নেই।
সাধারণ এবং বিপদজনক অনুমতিতে বিভাজন Android 6.0 Marshmallow (API 23) এ আবির্ভূত হয়েছিল। এই সংস্করণের আগে, সকল অনুমতি ইনস্টলেশনে অনুরোধ করা হত — ব্যবহারকারী একটি একক তালিকা দেখত এবং সম্পূর্ণ হিসাবে স্বীকার বা প্রত্যাখ্যান করত। Normal Permission নিম্ন-ঝুঁকি কাজের জন্য এই মডেলটি বজায় রেখেছে, যখন Dangerous রানটাইম অনুরোধে সুইচ করেছে। এই পরিবর্তন ব্যবহারকারী অভিব্যক্তিকে উন্নত করেছে এবং পাশাপাশি নিরাপত্তা বৃদ্ধি করেছে।
অনেক Android সিস্টেম APIর জন্য একটি সাধারণ অনুমতির স্পষ্ট ঘোষণা প্রয়োজন, যদিও অ্যাক্সেস স্বচালিত। উদাহরণস্বরূপ, ConnectivityManager ক্লাসটির ACCESS_NETWORK_STATE প্রয়োজন, VibratorServiceএর VIBRATE প্রয়োজন, WifiManagerএর ACCESS_WIFI_STATE প্রয়োজন। অনুরূপ uses-permission ঘোষণা ছাড়া, এই APIগুলি কল করলে SecurityException হবে।
ProtectionLevel normal হল Android অনুমতি ব্যবস্থায় সর্বনিম্ন সুরক্ষা স্তর। এই স্তরের অনুমতিগুলি মেনিফেস্টে ঘোষণা করা হয়, এবং সিস্টেম ইনস্টলেশনে ঘোষণা যাচাই করে, ব্যবহারকারীর হস্তক্ষেপ ছাড়াই অ্যাক্সেস প্রদান করে। কোন UI উপাদান দেখানো হয় না, কোন কলব্যাক ডাকা হয় না।
যাচাই প্রক্রিয়া PackageManager স্তরে কাজ করে। APK ইনস্টলেশনের সময়, সিস্টেম সকল uses-permission ট্যাগ স্ক্যান করে, permissions.xml ফাইলে সিস্টেম সংজ্ঞায়নের সাথে মিলিয়ে প্রত্যেকটি অনুমতির সুরক্ষা স্তর নির্ধারণ করে, এবং সাধারণ স্তরের জন্য কেবল অ্যাক্সেস নিবন্ধন করে। প্রক্রিয়াটি মিলিসেকেন্ড সময় নেয় এবং ব্যবহারকারী ইন্টারফেসের সাথে কোন মিথস্থাপনের প্রয়োজন হয় না।
প্রদান অ্যালগোরিদমটি নিম্নলিখিতভাবে কাজ করে:
ব্যবহারকারী ইন্টারফেসের মাধ্যমে একটি সাধারণ অনুমতি প্রত্যাহার করতে পারে না। অ্যাপ্লিকেশন সেটিংসের অনুমতি অনুভাগে, কেবল বিপদজনক অনুমতিগুলি প্রদর্শিত হয়। এটি iOSএর বিপরীত, যেখানে প্রত্যেকটি অনুমতির জন্য ফাংশনের সংবেদনশীলতা স্তর নির্বিশেষে পৃথক নিশ্চিতকরণ প্রয়োজন।
Normal এবং Dangerous Permission হল Android এ সুরক্ষার দুটি বিপরীত শ্রেণী। মূল পার্থক্য প্রদানের পদ্ধতিতে: সাধারণগুলি ইনস্টলেশনে স্বচালিতভাবে দেওয়া হয়, বিপদজনকগুলির জন্য একটি রানটাইম ডায়ালগের মাধ্যমে স্পষ্ট সম্মতি প্রয়োজন। এই পার্থক্য Android 6.0 Marshmallow সংস্করণ থেকে শুরু করে Android সুরক্ষা আর্কিটেকচারে নির্মিত।
মূল বৈশিষ্ট্যগুলির তুলনা:
| বৈশিষ্ট্য | Normal Permission | Dangerous Permission |
|---|---|---|
| ProtectionLevel | normal | dangerous |
| ব্যবহারকারী অনুরোধ | প্রয়োজন নেই | রানটাইম ডায়ালগ বাধ্যবাধক |
| প্রত্যাহারের ক্ষমতা | না, শুধু অ্যাপ্লিকেশন আনইনস্টল করে | হ্যাঁ, যে কোন সময় সেটিংসের মাধ্যমে |
| কোডে যাচাই | সবসময় PERMISSION_GRANTED | checkSelfPermission বাধ্যবাধক |
| উদাহরণ | INTERNET, VIBRATE, ACCESS_NETWORK_STATE | CAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION |
Normal Permission অনুরোধ করার সময় ব্যবহারকারী কোন ডায়ালগ দেখে না। যদি একটি অ্যাপ্লিকেশনের INTERNET প্রয়োজন হয় — এটি নিশ্চববে এটি পেয়ে যায়। Dangerous Permissionএর জন্য, সিস্টেম অনুরোধিত অ্যাক্সেসের বর্ণনা সহ একটি মোডাল ডায়ালগ দেখায়। ব্যবহারকারী অনুমতি বা অস্বীকার টিপে, এবং পরে যে কোন সময় সেটিংসের মাধ্যমে অনুমতি প্রত্যাহার করতে পারে। এটি একটি মূল UX পার্থক্য যা ইন্টারফেস ডেভেলপমেন্ট কৌশল নির্ধারণ করে।
Normal ব্যবহার করা উচিত সকল ক্ষেত্রে যেখানে অ্যাক্সেস সংবেদনশীল ডেটার সাথে সম্পর্কিত নয়। কানেক্টিভিটি যাচাইয়ের জন্য ACCESS_NETWORK_STATE, হ্যাপটিক ফিডব্যাকের জন্য VIBRATE, HTTP অনুরোধের জন্য INTERNET — এগুলি সকলই সাধারণ অনুমতি। যেখানে normal যথেষ্ট সেখানে dangerous স্তর ব্যবহার করা খারাপ অভ্যাস, যা অনাবশ্যক ডায়ালগ তৈরি করে এবং অ্যাপ্লিকেশনে ব্যবহারকারীর আস্থা হ্রাস করে।
Android সংজ্ঞায়িত করে প্রায় ডজন সাধারণ অনুমতি, প্রত্যেকটি একটি নির্দিষ্ট সিস্টেম ফাংশনের অনুরূপ। এগুলি Manifest.permission ক্লাসের কনস্টেন্টের মাধ্যমে উপলব্ধ। নীচে অ্যাপ্লিকেশন ডেভেলপমেন্টে সবচেয়ে বেশি ব্যবহৃত অনুমতিগুলির একটি তালিকা দেওয়া হলো।
| কনস্টেন্ট | অ্যাক্সেস | বর্ণনা |
|---|---|---|
| INTERNET | নেটওয়ার্ক | HTTP অনুরোধের জন্য নেটওয়ার্ক সকেট খোলা |
| ACCESS_NETWORK_STATE | নেটওয়ার্ক | নেটওয়ার্কের অবস্থা সম্পর্কে তথ্য প্রাপ্ত করা |
| ACCESS_WIFI_STATE | Wi-Fi | Wi-Fi সংযোগ সম্পর্কে তথ্য পড়া |
| VIBRATE | কম্পন | ডিভাইস ভাইব্রেটার নিয়ন্ত্রণ করা |
| BLUETOOTH | Bluetooth | Bluetooth ডিভাইসের সাথে সংযোগ করা |
| WAKE_LOCK | পাওয়ার | প্রসেসরকে সীপ মোডে যেতে বাধা দেওয়া |
| SET_ALARM | অ্যালার্ম | AlarmManagerএর মাধ্যমে অ্যালার্ম সেট করা |
| CHANGE_NETWORK_STATE | নেটওয়ার্ক | নেটওয়ার্ক সংযোগের অবস্থা পরিবর্তন করা |
সাধারণ অনুমতিগুলি UI প্রদর্শনের জন্য {«Permission Group»} এ সমূহবদ্ধ হয় না। Android এ সমূহগুলি সেটিংস স্ক্রিনের জন্য, যেখানে কেবল বিপদজনক অনুমতিগুলি দেখানো হয়। তবে, সাধারণ অনুমতিগুলিকে যুক্তিগতভাবে বিভাগ করা যেতে পারে: নেটওয়ার্ক (INTERNET, ACCESS_NETWORK_STATE), হার্ডওয়্যার (VIBRATE, WAKE_LOCK), সিস্টেম (SET_ALARM) এবং Bluetooth অনুমতি।
Manifest.permission এর কিছু কনস্টেন্ট বিভিন্ন Android সংস্করণে তাদের সুরক্ষা স্তর পরিবর্তন করতে পারে। উদাহরণস্বরূপ, BLUETOOTH_CONNECT Android 12+ এ একটি রানটাইম অনুরোধ সহ বিপদজনক অনুমতিতে পরিণত হয়েছে, যদিও পুরানো সংস্করণে এটি সাধারণ ছিল। ডকুমেন্টেশনের মাধ্যমে লক্ষ্য APIর জন্য বর্তমান protectionLevel যাচাই করতে ডেভেলপারদের পরামর্শ দেওয়া হয়।
একজন ডেভেলপার PackageManagerএর মাধ্যমে প্রোগ্রামাটিকভাবে যাচাই করতে পারেন যে একটি অনুমতি সাধারণ কিনা। getPermissionInfo পদ্ধতিটি PermissionInfo ফিরিয়ে দেয় যার protectionLevel ফিল্ডে PermissionInfo.PROTECTION_NORMAL ফ্লাগ থাকে। এটি ডায়নামিক হ্যান্ডলিং এবং ডিবাগিংয়ের জন্য উপযোগী।
fun isNormalPermission(permission: String): Boolean {
val pm = packageManager
val info = pm.getPermissionInfo(
permission,
PackageManager.GET_META_DATA
)
return info.protectionLevel ==
PermissionInfo.PROTECTION_NORMAL
}
Normal Permission ঘোষণা AndroidManifest.xml এ সবদ্দ সহজ কাজ, যাতে কেবল একটি uses-permission ট্যাগ প্রয়োজন। কোন অতিরিক্ত protectionLevel কনফিগারেশনের প্রয়োজন নেই, কারণ সুরক্ষা স্তর সিস্টেম সংজ্ঞা দ্বারা নির্ধারিত, অ্যাপ্লিকেশন মেনিফেস্ট দ্বারা নয়। ডেভেলপার কেবল কনস্টেন্টের পূর্ণ নাম নির্দিষ্ট করে।
<!-- AndroidManifest.xml -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
android:name="android.permission.VIBRATE" />
সিস্টেম ইনস্টলেশনে সকল ঘোষণা প্রক্রিয়া করে। ঘোষিত অনুমতিগুলির মধ্যে কম সে কম একটির যদি normal থেকে ভিন্ন protectionLevel থাকে, তবে একটি রানটাইম অনুরোধের প্রয়োজন হবে। INTERNET হল সবচেয়ে জনপ্রিয় সাধারণ অনুমতি, যা অধিকাংশ Android অ্যাপ্লিকেশনে বিদ্যমান, বিশেষ করে যারা HTTP অনুরোধ করে বা নেটওয়ার্ক থেকে কন্টেন্ট লোড করে।
সাধারণ এবং বিপদজনক অনুমতি সহ AndroidManifest.xml এর একটি সম্পূর্ণ উদাহরণ পার্থক্যটি প্রদর্শন করে: ব্যাকরণিকভাবে uses-permission ট্যাগগুলি একই, কিন্তু রানটাইমে INTERNET এবং VIBRATE স্বচালিতভাবে প্রদান করা হবে, যখন CAMERAর একটি ডায়ালগ প্রয়োজন হবে।
<manifest
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Normal permissions -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.VIBRATE" />
<!-- Dangerous permission -->
<uses-permission
android:name="android.permission.CAMERA" />
</manifest>
লাইব্রেরী — Google Play Services, Firebase, Glide — ব্যবহার করলে, তারা Manifest Merger এর মাধ্যমে নিজেদের নিজস্ব uses-permission চূড়ান্ত মেনিফেস্টে যোগ করতে পারে। তাদের কিছু সাধারণ (Firebaseএর জন্য INTERNET), অন্যরা বিপদজনক (Google Mapsএর জন্য ACCESS_FINE_LOCATION)। প্রকাশনের আগে ডেভেলপারকে build/outputs/logs/manifest-merger-report.txt এ চূড়ান্ত মার্জড মেনিফেস্ট যাচাই করা উচিত।
Normal Permission এর দুটি মৌলিক সীমাবদ্ধতা রয়েছে: ব্যবহারকারী দ্বারা এটি প্রত্যাহার এর অক্ষমতা এবং পরিচালনা UIএর অনুপস্থিতি। যদি ব্যবহারকারী অ্যাপ্লিকেশনকে বিশ্বাস না করে কিন্তু সাধারণ অনুমতিটি ইতিমধ্যে স্বচালিতভাবে প্রদান করা হয়েছে — একমাত্র সমাধান হল অ্যাপ্লিকেশন আনইনস্টল করা। এটি একটি নির্দিষ্ট ঝুঁকি তৈরি করে, কারণ Androidএর মানক পদ্ধতিতে সাধারণ অনুমতি অবরুদ্ধ করা যায় না।
একটি অতিরিক্ত সীমাবদ্ধতা বেশ কয়েকটি প্রোফাইল (Work Profile, Multiple Users) সহ ডিভাইসে দেখা দেয়। Normal Permission সকল প্রোফাইলের জন্য একসাথে প্রদান করা হয় — অ্যাপ্লিকেশন অনুমতিটি কেবল একটিতে সীমাবদ্ধ করতে পারে না। এন্টারপ্রাইজ পরিদৃশ্যে এটি Managed Configurationsএর মাধ্যমে সমাধান করা হয়।
একটি অ্যাপ্লিকেশন কোন সময় Normal Permission ব্যবহার করছে কিনা তা যাচাই করা সম্ভব নয়। সিস্টেম পদ্ধতি checkSelfPermission কেবল বিপদজনক অনুমতির জন্য কাজ করে। সাধারণগুলির জন্য এটি সবসময় PERMISSION_GRANTED ফিরিয়ে দেয়, যা প্রকৃত কার্যকলাপ প্রতিফলিত করে না। নিরাপত্তা অডিট এবং অ্যাপ্লিকেশন আচরণ বিশ্লেষণের সময় এটি মনে রাখা উচিত।
এটিও মনে রাখা উচিত যে কিছু ডিভাইস প্রস্তুতকারক (Xiaomi, Huawei, Samsung) অনুমতির মানক আচরণ পরিবর্তন করে। তাদের ফার্মওয়্যারে, Normal Permission এর জন্য MIUI বা EMUI শেলে অতিরিক্ত অনুমতির প্রয়োজন হতে পারে। ডেভেলপারদের বিভিন্ন ভেন্ডারের বাস্তবিক ডিভাইসে পরীক্ষণ করার পরামর্শ দেওয়া হয়।
সাধারণ জিজ্ঞাসা
Normal Permission ইনস্টলেশনে ডায়ালগ ছাড়াই স্বচালিতভাবে প্রদান করা হয়। Dangerousএর জন্য ব্যবহারকারীর স্পষ্ট সম্মতি সহ একটি রানটাইম অনুরোধ প্রয়োজন এবং এটি সেটিংসের মাধ্যমে প্রত্যাহার করা যেতে পারে। Normal ProtectionLevel normal ব্যবহার করে, Dangerous protectionLevel dangerous ব্যবহার করে।
না, সাধারণ অনুমতির জন্য AndroidManifest.xml এ uses-permission ঘোষণা করা যথেষ্ট। অনুরোধ কোডের প্রয়োজন নেই — সিস্টেম স্বচালিতভাবে অ্যাক্সেস প্রদান করে। এটি এদের বিপদজনক থেকে আলাদা করে, যেখানে ActivityCompat.requestPermissions প্রয়োজন।
সবচেয়ে বেশি ব্যবহৃত: INTERNET (নেটওয়ার্ক অনুরোধ), ACCESS_NETWORK_STATE (কানেকশন যাচাই), VIBRATE (হ্যাপটিক ফিডব্যাক) এবং WAKE_LOCK (প্রসেসরকে জাগরুক রাখা)। প্রায় প্রতিটি Android অ্যাপ্লিকেশন কম সে কম INTERNET ব্যবহার করে।
না, Normal Permission অ্যাপ্লিকেশন সেটিংসের মাধ্যমে প্রত্যাহার করা যায় না। অ্যাক্সেস বন্ধ করার একমাত্র উপায় হল অ্যাপ্লিকেশন আনইনস্টল করা। এটি বিপদজনক অনুমতি থেকে একটি মূল পার্থক্য, যা ব্যবহারকারী যে কোন সময় নিষ্ক্রিয় করতে পারে।
PackageManager.getPermissionInfo ব্যবহার করুন, অনুমতির স্ট্রিং নাম পেস করুন। পদ্ধতিটি PermissionInfo একটি protectionLevel ফিল্ড সহ ফিরিয়ে দেয়। শ্রেণী নির্ধারণের জন্য এটিকে PermissionInfo.PROTECTION_NORMAL বা PROTECTION_DANGEROUS কনস্টেন্টের সাথে তুলনা করুন।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন