گرفتن دسترسی‌ها در زمان اجرا برای اندروید ۶

استاندارد

همونطور که احتمالا میدونید گوگل توی اندروید۶ یک مفهوم به اسم Runtime Premissoin یا گرفتن دسترسی در زمان اجرا رو معرفی کرد. که به نظر خیلی‌ها یکی از بهترین تغییرات در زمینه بالا بردن حس امنیت توی کاربرا بوده و قطعا میشه از اون به عنوان یه امکان بسیار خوب برای کاربرای نهایی اپلیکیشن‌ها نام برد . ولی خب همیشه قرار نیست هر تغییری برای همه خوشایند باشه ، و اینجا این موضوع برای دولوپرهایی که توی اپلیکیشن‌شون جاهای زیادی نیاز به گرفتن دسترسی دارند و میخوان از این مفهوم استفاده کنن، خیلی خوشایند نیست.

چه زمانی نیاز به دریافت دسترسی در زمان اجرا خواهیم داشت :

Permission‌های موجود در اندروید به دو دسته تقسیم میشند . دسته اول Normal Permission یا دسترسی‌های معمولی و غیر حیاتی مثل دسترسی به انترنت ( android.permission.INTERNET  ) که برای استفاده از اون‌ها فقط کافی مثل قبل و همونطور که توی کد بالا میبینید دسترسیتون رو داخل AndroidManifest بنویسید و بدون نیاز به گرفتن دوباره اون از کاربر در زمان اجرا ازش استفاده کنید .

دسته دوم Dangerous Permission یا دسترسی‌های خطرناک و حیاتی هستند مثل دسترسی نوشتن بر روی کارت حافظه و یا خوندن دفترچه تلفن که برای استفاده از این نوع دسترسی‌ها هم باید اون‌ها رو مثل دسترسی‌های معمولی داخل AndroidManifest قرار بدین ، هم در زمان اجرا از کاربران برای استفاده از این دسترسی اجازه بگیرید . اینجا میتونید لیستی از دسترسی‌ها و نوع اونها رو ببینید .

چطوری گرفتن دسترسی در زمان اجرا رو پیاده‌سازی کنیم :

 

device-2016-04-04-161253-1
معمولا وقتی اقدام به پرسیدن و گرفتن یک دسترسی از کاربر میکنم که بخوایم از اون استفاده کنیم . مثلا اگه بخوایم بر روی حافظه گوشی چیزی بنویسیم بهتره درست قبل از اینکه این کار رو بکنیم از کاربرمون این دسترسی رو بگیریم، که کاربرمون هم بتونه متوجه بشه که این دسترسی رو مشخصا برای انجام چه کاری قراره بده . کد زیر روند چک کردن دسترسی و در صورت موجود نبودن، اقدام به گرفتنش رو نشون میده .

توی کد بالا اول چک میکنیم و میبینیم اگه دسترسی نوشتن روی حافظه رو داشتیم تابع ()myPermissionNeededMethod رو که نیاز به این دسترسی داره رو اجرا میکنیم ، و اگر این دسترسی رو نداشتیم request ای میدیم تا کاربر بتونه دسترسی مورد نیازمون رو بهمون بده. حالا باید به یه طریقی بتونیم بفهمیم که آیا کاربرمون دسترسی که میخواستیم رو بهمون داده یا نه . این کار رو از طریق override کردن تابع ()onRequestPermissionResult توی Activity یا Fragment مون میکنیم .

توی کد زیر اول چک میکنیم که اگه کاربر دسترسی مورد نظرمون رو به ما داده بود ، تابع ()myPermissionNeededMethod که نیاز به این دسترسی داشت رو اجرا میکنیم و اگر کاربر این دسترسی رو به ما نداده بود میتونیم متناسب با کاری که قرار بود اجرا بشه پیامی به کاربر نشون بدیم و اقدام‌های لازم رو انجام بدیم .

نکته مهم : این نوع دریافت دسترسی فقط و فقط زمانی لازم میشه که اپلیکیشن شما SDK هدفش ۲۳ باشه (targetSdkVersion 23 ) و کابر شما اندروید ۶ یا بالاتر روی گوشیش داشته باشه .