برمجة الأندرويد

الصلاحيات فى أندرويد مارشميلو

عند تثبيت احد التطبيقات فى أندرويد فانه يعمل ضمن ما يطلق عليه بالـ sandbox وهو عباره عن صندوق افتراضى تخيلى يعزل تطبيقك عن باقى التطبيقات المثبته على النظام  وعن الاجزاء الاخرى فى نظام الاندرويد نفسه  وما يتحكم به من هاردوير حيث يكون للتطبيق ID معين ومقيد بحدود معينه يفرضها عليه نظام الأندرويد وللتطبيق الحرية داخل الـ sandbox فقط  واذا ما اراد التطبيق التعامل مع شىء خارج الـ sandbox الخاص به مثلا الوصول الى بيانات موجوده فى تطبيق اخر او الوصول لجزء معين فى الهاردوير كالكاميرا او المساحة التخزينية مثلا فان على التطبيق ان يكون لديه الصلاحيات لاستخدامها حيث لا يسمح نظام الأندرويد للتطبيق ابدا بالوصول لاى مكون لا يملك الصلاحية لاستخدامه .

 

وسابقا قبل الـمارشميلو كان النظام المتبع فى الصلاحيات هو أن يقوم المطور بكتابة الصلاحيات المطلوبة للتطبيق الخاص به فى ملف الـ Android Manifest.xml وبالتالى عندما يقوم المستخدم بتثبيت التطبيق يقوم جوجل بلاى بإظهار قائمة بالصلاحيات التى يأخذها هذا التطبيق ويعتبر المستخدم موافق عليها جميعا اذا ما قام بتثبيت التطبيق .

 

الان فى النظام الجديد للصلاحيات ابتداءا من مارشميلو قامت جوجل بعمل نظام جديد بدلا من ان يوافق المستخدم على صلاحيات التطبيقات مرة واحده فقط قبل التثبيت وهو ان يتم طلب الصلاحيات فقط وقت الحاجه من المستخدم وللمستخدم ان يرفض او يقبل الصلاحية ويمكنه ان يقبل صلاحيات ويرفض اخرى كما يريد حيث يكون له الحرية الكاملة فى اعطاء الصلاحيات للتطبيقات  او رفضها دائما  بالاضافة الى ان المستخدم اذا اعطى أحد التطبيق صلاحية شىء معين يمكن ان يذهب فى اى وقت للاعدادت ثم التطبيقات ويختار التطبيق ومن ثم الصلاحيات حيث يظهر له قائمة بكل الصلاحيات التى يستخدمها هذا التطبيق وايها مفعل وايها لا ويمكنه تعطيل أو تشغيل اى صلاحيه منهم كما يحب حيث قدمت جوجل لمستحدم الاندرويد نظام الصلاحيات الجديد ليشعر بالامان أكثر ويتحكم اكثر بالتطبيقات  .

 

android app comic

 

 

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

 

 الصلاحيات العادية والصلاحيات الخطيرة 

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

الصلاحيات العادية : هى الصلاحيات التى يقوم التطبيق من خلالها بالوصول الى اشياء خارج الـ sandbox الخاص به  لكن  لا يوجد بها مخاطرة او احتكاك بخصوصية المستخدم بشكل مباشر مثل صلاحية الاتصال بالانترنت مثلا فهى لا تنتهك خصوصية المستخدم  ولا يوجد بها مخاطرة عليه مثل صلاحية SET_TIME_ZONE التى تعطى لتطبيق صلاحية بتعديل الـ time zone اى الوقت الخاص بالموبايل فمهما اسات استخدام هذه الصلاحية فلا يوجد اى خطر منها على المستخدم  ويمكنك ايجاد قائمة بالصلاحيات العادية على موقع المطورين هنا وكما ذكرنا انها تعطى مباشرة اثناء التثبيت فقط .

 

الصلاحيات الخطيرة : هى الصلاحيات التى يقوم التطبيق من خلالها بالوصول الى اشياء خارج الـ sandbox الخاص به ويوجد بها خطر على خصوصية المستخدم منها على سبيل المثال قراءة  الـ Contacts المسجلة على جهاز المستخدم او صلاحية استخدام الكاميرا او صلاحية معرفة مكان المستخدم على الخريطه الى اخر هذه الاشياء التى تعتبر خطيرة على خصوصية المستخدم  وهذه الصلاحيات يجب على المطور عند استخدام احد هذه الصلاحيات ان يطلبها من المستخدم اثناء تشغيل التطبيق runtime  بالاضافة الى ان تكون مكتوبة ايضا فى ملف الـ Manifest .

 

والصلاحيات الخطيرة تكون مقسمه الى مجموعات كل مجموعة تحتوى على صلاحيات تندرج تحت نفس الفئة على سبيل المثال صلاحية قراءة جهات الإتصال وصلاحية كتابة جهات اتصال يندرجون تحت مجموعة صلاحيات الاتصال والصورة التالية من موقع المطورين توضح هذه المجموعات من الصلاحيات الخطيرة وما يندرج تحت كل مجموعة من صلاحيات

dangrous permiisions

وهناك ملحوظة هامة بخصوص هذه المجموعات وهو أنه عندما تقوم برمجيا بطلب صلاحية فى الـ Runtime ولتكن مثلا صلاحية SEND_SMS فإن نظام الاندرويد لا يطلب الصلاحية من المستخدم بل يطلب المجموعة التى تنتمى لها هذه الصلاحية فسيظهر للمستخدم أن تطبيقك يريد صلاحية التعامل مع SMS  فقط وفى حالة طلبت صلاحية اخرى من المستخدم تتعلق بنفس المجموعة وقد وافق عليها المستخدم من قبل فسوف يقوم المستخدم باعطاء الصلاحية اوتوماتيكيا للتطبيق بدون سؤال المستخدم ففى مثال الـ SMS أو مرة قمت بطلب SEND_SMS قام نظام الاندرويد بطلب صلاحية مجموعة الـ SMS من المستخدم المرة التالية التى تطلب صلاحية الـ READ_SMS مثلا فان النظام لا يسأل المستخدم بل يقوم بمنح الصلاحية اوتوماتيكيا حيث ان المستخدم وافق مسبقا على مجموعة صلاحيات الـ SMS وكذا فى باقى المجموعات .

طلب الصلاحيات الخطيرة فى مارشميلو 

بالنسبة للصلاحيات العادية فيكفى وضعها فى الـ Manifest ويعرضها الـ Google play  للمستخدم قبل التثبيت وتستخدم بشكل عادى بعد التثبيت أما بالنسبة للصلاحيات الخطيرة فتوضع فى الـ Manifest أيضا بالاضافة الى انه يجب طلبها وقت الاستخدام فمثلا اذا كان لديك أكتيتفيى معين يقوم بقراءة جهات اتصال المستخدم فيجب أن تطلب منه ذلك واذا كان هناك أكتيتفيى اخر فى تطبيق يقوم بفتح الكاميرا فيجب أن تطلب من المستخدم السماح باستخدام الكاميرا فى هذا الاكتيفيتى  ويكون ذلك ببساطه باستخدام الميثود requestPermissions وهى ميثود تابعة للكلاس ActivityCompat وهو كلاس مساعد يساعدك فى استخدام بعض الـ Methods التابعة للأكتيتفيى سنستخدم هذه الميثود كالتالى :

req

وهى تأخذ 3 بارامترات

الأكتيتفيتى : وهى تأخذ الاكتيتفيتى الحالى الذى سيتم عرض الـ dialog الخاصة بالصلاحية فيه .

مصفوفة من الصلاحيات : يمكنك وضع  الصلاحيات  التى تريد طلبها من المستخدم فيها  .

كود الطلب : حيث ان الـ dialog الخاصة بطلب الصلاحية تعود اما بان المستخدم وافق وأعطاك الصلاحية أم رفض وبالتالى تأخذ قرار بناء على ذلك مثلما نفعل فى startActivityforResult

سوف اقوم بإعطاء بارامتر الاكتيتفيى الحالى و اعطاءه الصلاحية التى اريدها (لقد وضعت هنا صلاحية ارسال رسالة ) فى مصفوفة الصلاحيات بمساعدة كلاس Manifest.permission يمكنك وضع الصلاحية كمتغير نصى مثل الموجود فى ملف Android Manifest.xml إن أردت وكذلك رقم ككود للطلب  .

request permission android

ايضا يجب وضع الصلاحية  فى ملف Android Manifest.xml  

android manifest

الان نقوم بتشغيل التطبيق (على جهاز مارشملو  ويجب أن يكون تطبيقك يستهدف المارشملو targetSDK23)

Marshmallo Permission

الان مبروك 😀 لقد قمت بعمل طلب صلاحيات فى الـ Runtime للمرة الاولى وها هى الـ dialog الخاص بطلب الصلاحية تظهر لقد أنشأنا تطبيق رائع كل مهمته أن يقوم بطلب الصلاحية من المستخدم لاشىء اخر .

قد يقوم المستخدم بعمل Allow أو قد يقوم بعمل Deny  ولن نعرف ذلك بالطلبع لاننا لم نقم بكتابة كود يستقبل النتيجة فهيا بنا نفعل ذلك الان

كما كنا نفعل سابقا فى onActivityResult  سنفعل الان لكن باستخدام onRequestPermissionResult حيث يأتى فيها نتيجة الـ dialog السابقة حيث ان الـ grantResults هى مصفوفة تحتوى على نتائج الصلاحيات بالترتيب ان كان هناك اكثر من صلاحية مطلوبة .

resultof

الان قمت بعمل check للكود الذى قمت بوضعه سابقا ككود طلب اذا كانت الميثود تم مناداتها بسببه فسوف أقوم بتنفيذ كود وهو هل الصلاحية الاولى التى طلبتها وافق عليها المستخدم أم لا

resultpermissiondialog

ولاحظ ان PakageManager.PEMISSION_GRANTED معناها انه تم السماح من المستخدم وعمل Allow وهنا يمكن ان انفذ الكود المعتمد على هذه الصلاحية والا سوف اقوم بتنفيذ كود اخر عند رفضه ان يعطينى صلاحية .

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

permissionsinfograf

والكود التالى يطبق الشكل السابق تماما بمساعدة الميثود checkSelfPermission التى تقوم بتفحص الصلاحيات  والميثود shouldShowRequestPermissionRationale والتى تخبرك أن المستخدم رفض الصلاحيات ومع ذلك يحاول فتح الاكتيتفيى الذى يطلب الصلاحيات مرة اخرى لذلك يجب التوضيح له سواء عن طريق Toast أو عرض Dialog أو اى شىء اخر تكتب فيه المزيد من التفاصيل عن البريمشن الذى تطلبه  لتقنع المستخدم ليقوم بعمل Allow  والسماح لك باستخدام الصلاحية  وتنصحه بالذهاب لاعدادت التطبيقات وتفعيل صلاحية هذا التطبيق لاننا نحتاجها لفعل كذا مثلا .

perms

permissions

ملحوظة  :

  • لا يمكنك عمل Customize للـ Dialog الخاصة بطلب الصلاحيات ابدا والمسؤول عنها هو النظام فقط .
السابق
الـ AsyncTask البديل البسيط للـ Thread فى الأندرويد
التالي
Android Webservices بالعربية – Retrofit

3 تعليقات

أضف تعليقا

  1. Ahmed Ali قال:

    هههههههههههههههههههه شرح رائع وجميل والله انا بستني مقالاتكو بفارغ الصبر

  2. علي زهير قال:

    جميل جدا

  3. محمد قال:

    شرح اكثر من رائع
    مجهود متعوب عليه
    بارك الله فيك ..

اترك تعليقاً

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