مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

آموزش کنترل مجوزها ( Permission ) در زمان اجرا و درخواست اندروید

از اندروید نسخه 6 به بعد (سطح API 23) کاربران می توانند در حالی که برنامه در حال اجرا است مجوز ها را کنترل کنند. تا قبل از این نسخه مجوز برنامه در زمان نصب برنامه کنترل می شد. این کار باعث می شود که نصب برنامه راحت صورت بگیرد زیرا که لازم نیست که کاربر اول مجوز ها را مطالعه و بررسی کند و بعد برنامه را نصب کند (بگذریم که همیشه برنامه ها را بدون بررسی مجوز ها نصب می کردیم :D) همچنین این روش به کاربر کمک می کند تا بتواند قدرت بیشتری در دادن مجوز به برنامه ها داشته باشد. برای مثال در این روش کاربر می تواند مجوز استفاده از دوربین را به برنامه بدهد ولی مجوز استفاده از GPS را به برنامه ندهد. علاوه بر این امکانات کاربر می تواند هر وقت که بخواهد به قسمت تنظیمات رفته و مجوز ها را از برنامه بگیرد. مجوز ها به دو دسته تقسیم می شوند. مجوز های معمولی و

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

مجوزهای خطرناک

  • مجوز های معمولی مجوز هایی هستند که نمی توانند به حریم خصوصی کاربر آسیبی بزنند. اگر برنامه شما یک سری مجوز معمولی را در manifest خود داشته باشد اندروید به صورت اتوماتیک این مجوز ها را به برنامه خواهد داد. اتصال به اینترنت یکی از این مجوز ها می باشد.
  • مجوزهای خطرناک مجوز هایی هستند که می توانند به برنامه اجازه دستیابی به داده های حیاتی کاربر را بدهند. اگر برنامه این مجوز ها را در manifest خود داشته باشد اندروید از کاربر به ازای تک تک این مجوز ها تاییدیه می گیرد.

در همه ی نسخه های اندروید برنامه شما باید کل مجوز ها را در فایل manifest معرفی نماید. که اگر نسخه اندروید کمتر از 6 باشد هنگام نصب کاربر باید مجوز ها را تایید کند و از اندروید 6 به بعد و خود اندروید 6 هنگام اجرا مجوز های خطرناک از کاربر سوال می شود. کاربر در نسخه 6 به بعد می تواند یک یا چند مجوز را به کاربر ندهد. در این صورت برنامه را باید به گونه ای طراحی کنیم که اگر مجوز مورد نظر در اختیار برنامه قرار نگرفت برنامه ما از کار نیفتد و اصطلاحا کرش نکند. نحوه چک کردن این که آیا یک مجوز را دارا هستیم یا خیر در این مطلب توضیح داده ایم.

چرا برنامه ها به این همه مجوز نیاز دارند؟

گاهی اوقات لازم است که شما به کاربر توضیح دهید که چرا نیاز به یک مجوز دارید. برای برخی از برنامه ها دادن مجوز برای کاربر توجیه پذیر است برای مثال یک برنامه عکاسی از نظر کاربر مشکلی ندارد که به دوربین دسترسی داشته باشد. اما کاربر درک نمی کند که چرا همین برنامه عکاسی نیاز دارد که اطلاعات مخاطبان را بخواند و یا به GPS دسترسی داشته باشد. بنابراین بهتر است قبل از این که شما درخواست مجوز از کاربر را بدهید بهتر است که یک توضیح به کاربر بدهید که چرا این مجوز را از وی می خواهید. سپس درخواست کنید. البته نباید توضیحات شما زیاد و خسته کننده باشد زیرا که در این صورت کاربر فکر می کند که برنامه شما خوب نیست و آن را حذف می کند.

درخواست مجوز از کاربر

اگر برنامه شما یک مجوز را نداشته باشد شما می توانید ان را از کاربر درخواست نمایید. این درخواست با استفاده از متد requestPermissions انجام می شود. برنامه شما باید این متد را به شکلی فراخوانی کند که مجوزی را که می خواهد به همراه یک کد درخواست به آن ارسال کند. در این صورت یک دیالوگ به کاربر نشان داده می شود و درخواست مجوز مورد نظر را می دهد. هنگامی که کاربر به درخواست ما پاسخ می دهد به دلیل یک متد callback اجرا می شود و در آن متد باید بررسی کنیم که آیا کاربر اجازه دسترسی داده است یا خیر. تشخیص دسترسی به مجوز مورد نظر با استفاده از کد درخواست امکان پذیر می باشد. کد زیر چک می کند که کاربر مجوز خواندن اطلاعات مخاطبان را دارد یا خیر و اگر ندارد آن را از کاربر درخواست می کند.

if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // نمایش توضیحات در صورت نیاز
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // محلی که می توان برای کاربر توضیحات فرستاد
    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);    }
}

متد shouldShowRequestPermissionRationale برای مشخص کردن این است که کاربر نیاز به توضیحات دارد یا خیر. این متد زمانی true برمی گرداند که قبلا ما مجوز را درخواست داده ایم و کاربر آن را رد کرده است. اگر کاربر بر روی گزینه don’t ask again کلیک کرده باشد این متد false برمی گرداند و همچنین اگر خود دستگاه اجازه دسترسی به مجوز مورد نظر را ندهد این متد False برمی گرداند.

بررسی نتیجه درخواست مجوز

گفتیم که نتیجه در خواست ها در یک متد callback قرار می گیرد. به این شکل که وقتی ما درخواست یک مجوز را می دهیم در نتیجه یک متد با نام onRequestPermissionsResult صدا زده می شود. در این متد ما می توانیم تشخیص دهیم که کاربر مجوز را داده است یا خیر. در کد زیر برای مجوز دسترسی به مخاطبان را نشان می دهد. دقت کنید که از کد درخواستی که ما داشتیم در این متد استفاده می شود.

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // اگر درخواست مجوز کنسل شده باشد نتیجه خالی خواهد بود
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // مجوز دریافت شده است

            } else {

                // مجوز دریافت نشده است.
               
            }
            return;
        }

    }
}


مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات