سلسلة تعلم الأندرويد – الحلقة السادسة: تصاريح التطبيق

السلام عليكم

في الحلقة الأخيرة من هذه السلسلة قدمت عرضاً لملف AndroidManifest.xml والأوسمة التي يحتويها. وأحد هذه الأوسمة خاص بالتصاريح المطلوبة لتنصيب التطبيق على الجهاز وتشغيله. وسوف أقوم في هذه الحلقة بشرح طبيعة التصاريح وما هو دور كل منها.

صمم الأندرويد ليجعل كل تطبيق منعزل عن التطبيقات الأخرى ومحتويات الجهاز أيضاً ولا يمكنه الدخول إليها أو التحكم بها من دون إذن صريح من المستخدم وهذا ما يعرف بالتصاريح Permissions. وهذا طبعاً مبني على نظام اللينكس Linux وهو الذي يقم بعملية فصل التطبيقات عن بعضها البعض وعن النظام نفسه. إذاً هناك حاجة لوضع التصاريح في التطبيق إذا كنت تريد الدخول إلى محتويات الذاكرة الخارجية للجهاز، حسابات المستخدم أو موقعه من خلال GPS وغير ذلك. كل هذا يتم بوضع التصاريح في ملف AndroidManifst.xml  ويتم عرض التصاريح للمستخدم أثناء تحميل التطبيق وفي صفحة التطبيق داخل النظام في حال رغب المستخدم استعراضها مرة أخرى. هناك نوعين من التصاريح: تصاريح مفردة وتصاريح مجموعة. التصاريح المفردة تكون لطلب تصريح واحد فقط ويتم وضعها بشكل فردي من خلال هذا الكود:

<uses-permission android:name="android.permission.RECEIVE_SMS" />

أما التصاريح المجموعة فتكون عبارة عن طلب عدة من التصاريح من خلال كود واحد، كما في هذا الكود:

<permission-group android:description="description"
 android:icon="drawable"
 android:label="label"
 android:name="android.permission-group.PERSONAL_INFO" />

في هذا الكود يتم طلب مجموعة تصاريح متعلقة بالمعلومات الخاصة بالمستخدم على الجهاز كالبريد الألكتروني، وجهات الاتصال، والتقويم وغير ذلك.

ملاحظة: عند وضع اسم التصريح يجب وضع اسم المساحة namespace وهو هنا android.permission للتصاريح المفردة، وandroid.permission-group للتصاريح المجموعة. اسم المساحة ضروري لكي يتم التفريق بين التصريحات التي يستعملها النظام والتصاريح التي تقوم بإنشائها في التطبيق.

هناك أربعة انواع من التصاريح الخاصة بالأندرويد:

  • عادية (Regular)
  • خطرة (Dangerous)
  • نظام (System)
  • مصرحة (Signed)

النوعين الأوليين يمكن الحصول عليهما لكافة التطبيقات، اما النوعين الثالث والرابع فلا يمكن للتطبيق الحصول عليهما إلا إذا كان تطبيق نظام (أي ياتي جاهزاً مع الروم الخاص بالجهاز).

قائمة بالتصاريح المفردة ووظيفة كل منها (وضعت في هذه القائمة أهم التصاريح، يمكنك مراجعة كافة التصاريح من موقع الأندرويد نفسه):

ACCESS_CHECKIN_PROPERTIES

يسمح بقراءة/كتابة إعدادات الجدول الخاص بقواعد بيانات تسجيلات الأماكن (Checking Database) التي يتم رفعها.

ACCESS_COARSE_LOCATION

يسمح للتطبيق باستعمال شبكة الهاتف أو الشبكة اللاسلكية (المكان العام – Coarse Loaction)

ACCESS_FINE_LOCATION

يسمح للتطبيق باستعمال شبكة الجي بي أس (المكان الدقيق – Fine Location)

ACCESS_LOCATION_EXTRA_COMMANDS

يسمح للتطبيق باستعمال الأوامر الإضافية الخاصة بمزودي المكان (location provider)

ACCESS_MOCK_LOCATION

يسمح للتطبيق بإنشاء مزودات خدمة وهمية لغرض التجربة

ACCESS_NETWORK_STATE

يسمح للتطبيق بالحصول على معلومات خاصة بالشبكات المختلفة في الجهاز (لمعرفة ما إذا كانت الشبكة متوفرة أم لا، تعمل أم لا .. وغير ذلك)

ACCESS_SURFACE_FLINGER

يسمح للتطبيق باستعمال خصائص SurfaceFlinger ذات المستوى المتدني (التعامل مع العتاد بشكل أقرب).

ACCESS_WIFI_STATE

يسمح للتطبيق بالحصول على معلومات الشبكة اللاسلكية في الجهاز (مفعّلة أم لا، مغلقة أم لا، وغير ذلك).

ACCOUNT_MANAGER

السماح للتطبيق بالدخول إلى الحسابات المضافة للجهاز. (الحسابات التي تضاف في الإعدادات في الأندرويد)

ADD_VOICEMAIL

السماح بإضافة بريد صوتي للتطبيق.

BATTERY_STATS

السماح للتطبيق بالحصول على معلومات البطارية

BIND_APPWIDGET

السماح للتطبيق بإعلام الخدمة الخاصة بالقطع (AppWidget Service) أي تطبيق يمكنه الدخول إلى بيانات القطع.

BIND_DEVICE_ADMIN

هذا التصريح هو لمستقبل إدارة الجهاز. وغرضه هو التأكد من أن المستقبل يتعامل مع النظام فقط (وليس مع تطبيقات أخرى مثلاً).

BIND_INPUT_METHOD

يجب أن يطلب هذا التصريح في حالة استعمال InputMethodService للتأكد من أن النظام هو القسم الوحيد الذي يرتبط التطبيق.

BIND_REMOTEVIEWS

يجب أن يطلب هذا التصريح في حالة استعمالRemoteViewsService, للتأكد من ان النظام فقط يرتبط بالتطبيق

BIND_TEXT_SERVICE

يجب أن يطلب في حالة استعمال خدمة نصية (TextService) كاستعمال خدمة المدقق الإملائي SpellCheckerService للتأكد من النظام فقط يرتبط بالتطبيق

BIND_VPN_SERVICE

يجب أن يطلب في حالة استعمال VpnService, للتأكد من النظام فقط يرتبط بالتطبيق

BIND_WALLPAPER

يجب ان يطلب في حالة استعمال WallpaperService, للتاكد من النظام فقط يرتبط بالتطبيق

BLUETOOTH

يسمح للتطبيق بالاتصال بالأجهزة الاخرى عن طريق البلوتوث

BLUETOOTH_ADMIN

يسمح للتطبيق بعمل مسح للاجهزة المحيطة وعمل مزاوجة معها عن طريق البلوتووث

BRICK

هذا التصريح مطلوب لتعطيل الجهاز (خطر جداً لذلك لا ينصح باستعماله)

BROADCAST_PACKAGE_REMOVED

يسمح للتطبيق بارسال تنبيه بأن حزمة التطبيق قد حذفت

BROADCAST_SMS

يسمح للتطبيق بمعرفة حالة الرسائل النصية SMS

BROADCAST_STICKY

يسمح للتطبيق بإرسال نوايا دائمة (Sticky intents). الخدمات المبنية على هذا النوع من النوايا يكون له الاولوية في الإبقاء في حالة احتاج النظام إلى الموارد.

BROADCAST_WAP_PUSH

السماح للتطبيق بنشر تنبيهات WAP PUSH

CALL_PHONE

السماح  للتطبيق بالقيام بعمليات الاتصال من غير الحاجة لاستعمال واجهة الاتصال المعتادة

CALL_PRIVILEGED

السماح  للتطبيق بالاتصال بأي رقم بما في ذلك أرقام الطوارئ من غير الحاجة لاستعمال واجهة الاتصال المعتادةAllows an

CAMERA

السماح للتطبيق باستعمال الكامير

CHANGE_COMPONENT_ENABLED_STATE

السماح للتطبيق بتغير أجزاء التطبيقات الأخرى (تفعيل وإلغاء تلك الأجزاء Components).

CHANGE_CONFIGURATION

السماح للتطبيق بتغير إعدادات النظام (كاللغة المستعملة)

CHANGE_NETWORK_STATE

السماح للتطبيق بتغير حالة الاتصال بالشبكة (أي إمكانية تفعيل أو إلغاء التفعيل للشبكة من خلال التطبيق)

CHANGE_WIFI_MULTICAST_STATE

السماح للتطبيق بالدخول إلى حالة الاتصال المتعدد للشبكة اللاسلكية Wi-Fi Multicast mode

CHANGE_WIFI_STATE

السماح للتطبيق بتغير حالة الاتصال بالشبكة اللاسلكية

CLEAR_APP_CACHE

السماح للتطبيق بمسح ملفات الخابية Cache لكافة التطبيقات المحملة على الجهاز.

CLEAR_APP_USER_DATA

السماح للتطبيق بمسح معلومات المستخدم.

CONTROL_LOCATION_UPDATES

السماح للتطبيق بتفعيل أو إلغاء التفعيل لتنبيهات المكان في الراديو.

DELETE_PACKAGES

السماح للتطبيق بمسح الحزم.

FLASHLIGHT

السماح بالتحكم بضوء الفلاش

GET_ACCOUNTS

السماح للتطبيق بالدخول إلى قائمة الحسابات في الجهاز

GET_PACKAGE_SIZE

السماح للتطبيق بمعرفة حجم الحزمة الخاصة بأي تطبيق

GET_TASKS

السماح للتطبيق بمعرفة المهام التي تعمل حالياً مع معلومات لكل مهمة

INJECT_EVENTS

السماح للتطبيق بإدخال أوامر معينة (ضغطة زر، لمس الشاشة) برمجياً (أي ليس من قبل المستخدم).

INTERNET

السماح للتطبيق باستعمال الانترنت

KILL_BACKGROUND_PROCESSES

السماح للتطبيق بإنهاء الخدمات التي تعمل في الخلفية واستدعاء دالة killBackgroundProcesses(String).

MANAGE_ACCOUNTS

السماح للتطبيق بالتحكم بالحسابات في الجهاز

MODIFY_AUDIO_SETTINGS

السماح للتطبيق بتعديل الصوت في الجهاز

MODIFY_PHONE_STATE

السماح للتطبيق بتعديل حالة الجهاز

PROCESS_OUTGOING_CALLS

السماح للتطبيق بمراقبة، تعديل أو إلغاء الاتصالات

READ_CALENDAR

السماح للتطبيق بقراءة معلومات التقويم

READ_CONTACTS

السماح للتطبيق بقراءة جهات الاتصال

READ_HISTORY_BOOKMARKS

السماح للتطبيق بقراءة (وليس إضافة) تاريخ المتصفح والعلامات المرجعية

READ_INPUT_STATE

السماح للتطبيق بقراءة حالة مفاتيح الكتابة

READ_PHONE_STATE

السماح للتطبيق بقراءة حالة الجهاز

READ_PROFILE

السماح للتطبيق بقراءة معلومات المستخدم.

READ_SMS

السماح للتطبيق بقراءة الرسائل النصية SMS

READ_SOCIAL_STREAM

السماح للتطبيق بقراءة المشاركات الاجتماعية للمستخدم.

RECEIVE_MMS

السماح للتطبيق بمراقبة رسائل الملتيميدا القادمة لتسجيلها أو التحكم بها.

RECEIVE_SMS

السماح للتطبيق بمراقبة الرسائل النصية القادمة لتسجيلها أو التحكم بها.

RECORD_AUDIO

السماح للتطبيق بتسجيل الصوت.

SEND_SMS

السماح للتطبيق بإرسائل رسائل نصية

SET_TIME

السماح للتطبيق بتغيير الوقت

SET_WALLPAPER

السماح للتطبيق بتغير صورة الخلفية

STATUS_BAR

السماح للتطبيق بفتح، إغلاق أو تعطيل شريط التنبيهات والأيقونات الموجودة داخله.

VIBRATE

السماح للتطبيق باستعمال الرجّاج (Vibrator)

WAKE_LOCK

السماح للتطبيق باستعمال  PowerManager WakeLocks  لمنع الجهاز من الدخول إلى وضع الاستعداد، أو إيقاف المعالج (في حالة أردت تشغيل ملف صوتي مثلاً).

WRITE_CALENDAR

السماح للتطبيق بالكتابة في تقويم المستخدم

WRITE_CONTACTS

السماح للتطبيق بإضافة معلومات إلى جهات الإتصال

WRITE_EXTERNAL_STORAGE

السماح للتطبيق بإضافة بيانات إلى الذاكرة الخارجية للجهاز

WRITE_HISTORY_BOOKMARKS

السماح للتطبيق بإضافة معلومات إلى تاريخ المتصفح أو العلامات المرجعية

WRITE_PROFILE

السماح للتطبيق بالكتابة في معلومات المستخدم

WRITE_SETTINGS

السماح للتطبيق بتعديل إعدادات النظام

WRITE_SMS

السماح للتطبيق بكتابة رسائل نصية

WRITE_SOCIAL_STREAM

السماح للتطبيق بالكتابة في الشبكات الاجتماعية الخاصة بالمستخدم.

وأخيراً يمكن استعمال هذا الكود داخل ملف AndroidManfiest.xml لطلب التصاريح، حيث يحتوي على معظم التصاريح:

<uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCOUNT_MANAGER" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.BATTERY_STATS" />
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
<uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />
<uses-permission android:name="android.permission.BIND_INPUT_METHOD" />
<uses-permission android:name="android.permission.BIND_REMOTEVIEWS" />
<uses-permission android:name="android.permission.BIND_WALLPAPER" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BRICK" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED" />
<uses-permission android:name="android.permission.BROADCAST_SMS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.BROADCAST_WAP_PUSH" />
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.CALL_PRIVILEGED" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
<uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES" />
<uses-permission android:name="android.permission.DELETE_CACHE_FILES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
<uses-permission android:name="android.permission.DEVICE_POWER" />
<uses-permission android:name="android.permission.DIAGNOSTIC" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.DUMP" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
<uses-permission android:name="android.permission.FACTORY_TEST" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.FORCE_BACK" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.GLOBAL_SEARCH" />
<uses-permission android:name="android.permission.HARDWARE_TEST" />
<uses-permission android:name="android.permission.INJECT_EVENTS" />
<uses-permission android:name="android.permission.INSTALL_LOCATION_PROVIDER" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.MANAGE_APP_TOKENS" />
<uses-permission android:name="android.permission.MASTER_CLEAR" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
<uses-permission android:name="android.permission.READ_HISTORY_BOOKMARKS" />
<uses-permission android:name="android.permission.READ_INPUT_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.READ_SYNC_STATS" />
<uses-permission android:name="android.permission.REBOOT" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.RECEIVE_MMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.REORDER_TASKS" />
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.SET_ACTIVITY_WATCHER" />
<uses-permission android:name="android.permission.SET_ALARM" />
<uses-permission android:name="android.permission.SET_ALWAYS_FINISH" />
<uses-permission android:name="android.permission.SET_ANIMATION_SCALE" />
<uses-permission android:name="android.permission.SET_DEBUG_APP" />
<uses-permission android:name="android.permission.SET_ORIENTATION" />
<uses-permission android:name="android.permission.SET_POINTER_SPEED" />
<uses-permission android:name="android.permission.SET_PROCESS_LIMIT" />
<uses-permission android:name="android.permission.SET_TIME" />
<uses-permission android:name="android.permission.SET_TIME_ZONE" />
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" />
<uses-permission android:name="android.permission.SIGNAL_PERSISTENT_PROCESSES" />
<uses-permission android:name="android.permission.STATUS_BAR" />
<uses-permission android:name="android.permission.SUBSCRIBED_FEEDS_READ" />
<uses-permission android:name="android.permission.SUBSCRIBED_FEEDS_WRITE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.USE_SIP" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_GSERVICES" />
<uses-permission android:name="android.permission.WRITE_HISTORY_BOOKMARKS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
أتمنى أن أسمع آراءكم وتعليقاتكم على المدونة

تعليق واحد

  1. مجهود تشكر عليه اخي عبدالقهار ,

    اتمنى منك مراسلتي على الايميل .

اترك تعليقاً

الحقول المطلوبة موسومة بالعلامة *.