الإذن العادي (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 إلى الطلب في وقت التشغيل. هذا التغيير حسن تجربة المستخدم وزاد الأمان في نفس الوقت.
العديد من API نظام Android تتطلب تصريحاً صريحاً بإذن عادي، حتى لو كان الوصول تلقائياً. على سبيل المثال، تتطلب فئة ConnectivityManager ACCESS_NETWORK_STATE، ويتطلب VibratorService VIBRATE، ويتطلب WifiManager ACCESS_WIFI_STATE. بدون تصريح uses-permission المناسب، ستؤدي استدعاءات API هذه إلى SecurityException.
ProtectionLevel normal هو أدنى مستوى حماية في نظام الأذونات في Android. تُصرح الأذونات بهذا المستوى في البيان، ويتحقق النظام من التصريح عند التثبيت، مما يمنح الوصول دون تدخل المستخدم. لا تظهر عناصر واجهة المستخدم، ولا تُستدعى استدعاءات رجوع.
تعمل آلية التحقق على مستوى PackageManager. أثناء تثبيت APK، يقوم النظام بمسح جميع علامات uses-permission، ويحدد مستوى حماية كل إذن عن طريق مطابقتها مع تعريفات النظام في ملفات permissions.xml، وللمستوى العادي يسجل الوصول فقط. تستغرق العملية ملي ثانية ولا تتطلب تفاعلاً مع واجهة المستخدم.
تعمل خوارزمية المنح على النحو التالي:
لا يستطيع المستخدم إلغاء إذن عادي عبر الواجهة. في إعدادات التطبيقات، في قسم الأذونات، تظهر فقط الأذونات الخطرة. هذا يتناقض مع iOS، حيث يتطلب كل إذن تأكيداً منفصلاً بغض النظر عن مستوى حساسية الوظيفة.
Normal و Dangerous Permission هما فئتان متضادتان من الحماية في Android. الفرق الرئيسي هو في طريقة المنح: تُمنح العادية تلقائياً عند التثبيت، وتتطلب الخطرة موافقة صريحة عبر حوار وقت التشغيل. هذا التمايز مبني في معمارية أمان Android منذ الإصدار 6.0 Marshmallow.
مقارنة الخصائص الرئيسية:
| الخاصية | 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 للاهتزاز اللمسي، INTERNET لطلبات HTTP — كل هذه أذونات عادية. استخدام مستوى dangerous حيث يكفي normal هو ممارسة سيئة، تخلق حوارات غير ضرورية وتقلل ثقة المستخدم في التطبيق.
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 | الشبكة | تغيير حالة اتصال الشبكة |
لا تتجمع الأذونات العادية في «مجموعات أذونات» لأغراض العرض في واجهة المستخدم. المجموعات في Android مصممة لشاشة الإعدادات، حيث تظهر فقط الأذونات الخطرة. ومع ذلك، يمكن تقسيم الأذونات العادية منطقياً إلى فئات: الشبكة (INTERNET، ACCESS_NETWORK_STATE)، الأجهزة (VIBRATE، WAKE_LOCK)، النظام (SET_ALARM) وأذونات Bluetooth.
بعض الثوابت من Manifest.permission قد تغير مستوى حمايتها في إصدارات Android مختلفة. على سبيل المثال، BLUETOOTH_CONNECT في Android 12+ أصبح إذناً خطراً يتطلب طلباً في وقت التشغيل، رغم أنه في الإصدارات الأقدم كان عادياً. يوصى المطورون بالتحقق من 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" />
يعالج النظام جميع التصريحات عند التثبيت. إذا كان واحد على الأقل من الأذونات المصرح بها يحتوي على protectionLevel مختلف عن normal، ستكون هناك حاجة لطلب وقت التشغيل. 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 — قد تضيف خدمات uses-permission خاصة بها إلى البيان النهائي عبر Manifest Merger. بعضها عادي (INTERNET لـ Firebase)، وبعضها آخر خطر (ACCESS_FINE_LOCATION لـ Google Maps). يجب على المطور التحقق من البيان المدمج النهائي في build/outputs/logs/manifest-merger-report.txt قبل النشر.
Normal Permission له قيودان أساسيان: عدم قدرة المستخدم على إلغائه وعدم وجود واجهة إدارة. إذا لم يثق المستخدم في التطبيق ولكن الإذن العادي قد منح تلقائياً — الحل الوحيد هو إزالة التطبيق. يخلق هذا مخاطر معينة، حيث لا يمكن حجب الأذونات العادية بوسائل 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.
لا، للأذونات العادية يكفي تصريح uses-permission في AndroidManifest.xml. لا حاجة لكود طلب — النظام يمنح الوصول تلقائياً. هذا يميزها عن الخطرة، حيث يلزم ActivityCompat.requestPermissions.
الأكثر استخداماً: INTERNET (طلبات الشبكة)، ACCESS_NETWORK_STATE (التحقق من الاتصال)، VIBRATE (الاهتزاز اللمسي) و WAKE_LOCK (إبقاء المعالج نشطاً). تقريباً كل تطبيق Android يستخدم INTERNET على الأقل.
لا، Normal Permission لا يمكن إلغاؤه عبر إعدادات التطبيق. الطريق الوحيد لإيقاف الوصول هو إزالة التطبيق. هذا فرق رئيسي عن الأذونات الخطرة، التي يمكن للمستخدم تعطيلها في أي وقت.
استخدم PackageManager.getPermissionInfo، ومرر اسم الإذن كنص متني. تعود الطريقة PermissionInfo بحقل protectionLevel. قارنه مع ثوابت PermissionInfo.PROTECTION_NORMAL أو PROTECTION_DANGEROUS لتحديد الفئة.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا