استخدام الاذونات في اندرويد مارشميلو

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

لكن مع اندرويد ٦ او مارشميلو فقد اختلفت الموازين فسوف يكون للمستخدم الحق في قبول او رفض الصلاحيات ،سيكون بمقدوره ايقاف تطبيقك عن استخدام الكاميرا او المايكروفون او الوصول الى جهات الاتصال .. الخ . وايضا ستقوم كمبرمج في التفسير للمستخدم ليش تريد الوصول الى الكاميرا او وش تبي بجهات الاتصال !! ? . 

سنقوم بهذا الدرس بتعلم طريقة استخدام نظام Runtime Permissions .

  • انشاء تطبيق جديد :

من خلال الاندرويد ستديو قم بانشاء تطبيق جديد وتاكد من ان ملف build.gradle بهذا الشكل :

defaultConfig {
        applicationId "com.tatbigy.permissions"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }

اهم مايهمنا ? هو ان target برقم ٢٣ وهذا يعني ان التطبيق يدعم مارشيملو ،

  • تهيئة الصلاحيات :

اذا اردت استخدام اي من الاذونات في تطبيق الاندرويد فانت ستحتاج اولا للتاكد من تفعيلها ، فمثلا اذا اردت استخدام الكاميرا فانت ستحتاج للتاكد من هل المستخدم سمح لي او اعطاني الاذن بالوصول للكاميرا !! للقيام بذلك سنحتاج الى دالة checkSelfPermission() والتي بدورها ستقوم بالتأكد من هل الاذن موجود ؟! 

 if (checkSelfPermission(Manifest.permission.CAMERA)
                    == PackageManager.PERMISSION_GRANTED) {
                // Permission is available, start camera preview
                Toast.makeText(this,
                        "Camera permission has already been granted. Starting Camera.",
                        Toast.LENGTH_SHORT).show();
            } else {
                requestPermissions(new String[]{Manifest.permission.CAMERA},
                        0);
            }

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

requestPermissions(new String[]{Manifest.permission.CAMERA,Manifest.permission.CALL_PHONE},
                        0);

اما بالنسبة لرقم 0 فسيتم استخدامه عند العودة للتطبيق للتاكد من رقم العملية يمكنك كتابة اي رقم مميز حتى لاتتعارض النتائج.

الحصول على النتيجة :

عند فتح المستخدم للتطبيق وطلب الاذن منه ستظهر له نافذة “Dialog” سيكون فيها توضيح كامل لعملية الاذن وسيكون بامكانة القبول او الرفض وسيكون شكل الرسالة كما في الاسفل في الصورة .

Screen Shot 2015-09-13 at 6.47.34 AM

الان سنقوم باضافة دالة للتأكد من المستخدم هل قام بالرفض ? او السماح ? ؟

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {

        if (requestCode == 0) {
            // Request for camera permission.
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission has been granted. Start camera preview Activity.
                Toast.makeText(this, "Camera permission was granted. Starting preview.",
                        Toast.LENGTH_SHORT)
                        .show();
            } else {
                // Permission request was denied.
                Toast.makeText(this, "Camera permission request was denied.", Toast.LENGTH_SHORT)
                        .show();
            }
        }

    }

هذه الدالة للتاكد من نتيجة المستخدم  سماح او رفض .

اولا تاكدنا من code النتيجة وهو 0 كما شرحنا سابقا وبعد ذلك قمنا بالتاكد هل المستخدم منحنا الاذن ،، اذا تحقق شرط if وهو السماح سيقوم التطبيق بفتح الكامير اما اذا قام المستخدم بالرفض سنتوقف عن استخدام الكاميرا ?.

  • توضيح الصلاحية للمستخدم :

اخيراااا ? بنرتاح من  كتابة التعليقات ليش تبي توصل لكاميرتي !! ليش تطبيقك يبي صوري ،، الخ ، سنقوم باظهار رسالة للمستخدم توضح له الفائدة من هذه الصلاحية وطبعا وكلنا نعرف لانريد الا الفائدة للمستخدم .للقيام بهذه المهمة سنقوم باستدعاء دالة shouldShowRequestPermissionRationale() والتي سنقوم فيها بالتبرير للمستخدم ليش نبي الكاميرا ولكن هذه الرسالة لاتظهر للمستخدم الا اذا قام بالرفض اول مرة ثم عاد مرة اخرى وطلب منه  الاذن ? .

 // Should we show an explanation?
                if (shouldShowRequestPermissionRationale(
                        Manifest.permission.READ_CONTACTS)) {
                    // Explain to the user why we need to read the contacts
                }

سنقوم بكتابة التوضيح للمستخدم في داخل if وستظهر للمستخدم .

فيديو :

 

 

الحمدلله هنا نكون وصلنا لنهاية الدرس وهو موجود بالطبع على github 

بالتوفيق للجميع 

3 تعليقات على “استخدام الاذونات في اندرويد مارشميلو”

درس جميل ورائع جزاك الله خير
اخوي عندي مشكلة وابغى تساعدني
عندي اثنين من TextView ابغي اعرضهم جنب بعض زي كذا
aaa bbbbbbbbbbb
bbbbbbbbbbbbbb
bbbbbbbbbbbbbb

لكن من اخليهم جنب بعض يظهرون كذا
aaa bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb

النص الثاني ما يلتف حول الاول ويظهر تحته ؟؟؟ شو حل المشكلة ؟؟

شكرا جزيلا لهذا المنشور
لدي بعض التساؤلات :
1- ماذا يحصل لو كان التطبيق المحمل على نظام المارشيملو لايستخدم target 23 بل اقل ، هل سيستطيع المستخدم تعطيل الصلاحيات؟ وهل سيحصل للتطبيق كراش؟
2- لقد قمت باستخدام checkselfpermission لمعرفة الصلاحيات الممنوحة لتطبيقك فهل هناك طريقة نستطيع معرفة الصلاحيات الممنوحة للتطبيقات الاخرى مثلا هل نستخدم checkpermission او getApplicationEnabledSetting؟
3- حسب قرائتي فالمستدم في هذه النسخة قادر فقط على تعطيل الصلاحيات من نوع dangers ماذا عن النورمال هل يمكننا تعطيلها؟

شكرا لك

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *