درخواست اجازه‌های ویژه

اجازه ویژه از دسترسی به منابع سیستم که به‌طور خاص حساس هستند یا مستقیماً به حریم خصوصی کاربر مربوط نمی‌شوند محافظت می‌کند. این اجازه‌ها با اجازه‌های زمان نصب و اجازه‌های زمان اجرا متفاوت است.

صفحه «دسترسی ویژه برنامه» در تنظیمات سیستم Android که فهرستی از برنامه‌ها و وضعیت اجازه ویژه آن‌ها را نشان می‌دهد.
شکل ۱. صفحه دسترسی ویژه برنامه در تنظیمات سیستم.

برخی‌از نمونه‌های اجازه‌های ویژه عبارت‌اند از:

  • زمان‌بندی هشدارهای دقیق.
  • نمایش و ترسیم روی برنامه‌های دیگر.
  • درحال دسترسی به همه داده‌های فضای ذخیره‌سازی.

برنامه‌هایی که اجازه ویژه‌ای را اعلام می‌کنند در صفحه دسترسی ویژه برنامه در تنظیمات سیستم نشان داده می‌شوند (شکل ۱). برای اعطای اجازه ویژه به برنامه، کاربر باید به این صفحه برود: تنظیمات > برنامه‌ها > دسترسی ویژه برنامه.

گردش کار

برای درخواست اجازه ویژه، کارهای زیر را انجام دهید:

  1. در فایل مانیفست برنامه‌تان، اجازه‌های ویژه‌ای را که ممکن است برنامه‌تان نیاز به درخواست آن‌ها داشته باشد اعلام کنید.
  2. تجربه کاربری (UX) برنامه‌تان را طوری طراحی کنید که کنش‌های خاص در برنامه‌تان با اجازه‌های ویژه خاصی مرتبط باشد. به کاربران اطلاع دهید که کدام کنش‌ها ممکن است نیاز داشته باشد که به برنامه شما اجازه دسترسی به داده‌های خصوصی کاربر را بدهند.
  3. منتظر بمانید تا کاربر تکلیف یا کنش را در برنامه‌تان فراخوانی کند که به دسترسی به داده‌های خصوصی خاص کاربر نیاز دارد. در آن زمان، برنامه‌تان می‌تواند اجازه ویژه‌ای را که برای دسترسی به آن داده‌ها لازم است درخواست کند.
  4. بررسی کنید که آیا کاربر قبلاً اجازه ویژه‌ای را که برنامه شما نیاز دارد اعطا کرده است یا نه. برای انجام این کار، از تابع بررسی سفارشی هر اجازه استفاده کنید. اگر اعطا شود، برنامه‌تان می‌تواند به داده‌های خصوصی کاربر دسترسی داشته باشد. اگر حل‌وفصل نشده است، به مرحله بعدی ادامه دهید. توجه: هربار که عملیاتی را انجام می‌دهید که به آن اجازه نیاز دارد، باید بررسی کنید که آیا آن اجازه را دارید یا نه.
  5. منطقی را در عنصر میانای کاربر به کاربر ارائه دهید که به‌وضوح توضیح دهد برنامه‌تان سعی دارد به چه داده‌هایی دسترسی پیدا کند و اگر کاربر اجازه ویژه را اعطا کند، برنامه چه مزایایی می‌تواند برای کاربر فراهم کند. علاوه‌براین، چون برنامه‌تان کاربران را برای اعطای اجازه به تنظیمات سیستم می‌فرستد، دستورالعمل‌های مختصری نیز اضافه کنید که توضیح دهد کاربران چگونه می‌توانند در آنجا اجازه را اعطا کنند. رابط کاربری منطق باید گزینه واضحی برای کاربر ارائه دهد تا بتواند از اعطای اجازه انصراف دهد. پس‌از اینکه کاربر دلیل را تأیید کرد، به مرحله بعدی بروید.
  6. اجازه ویژه‌ای را که برنامه‌تان برای دسترسی به داده‌های خصوصی کاربر نیاز دارد درخواست کنید. این کار احتمالاً شامل هدایت به صفحه مربوطه در تنظیمات سیستم است که کاربر می‌تواند در آنجا اجازه را اعطا کند. برخلاف اجازه‌های زمان اجرا، کادر گفتگوی اجازه وجود ندارد.
  7. پاسخ کاربر را بررسی کنید – اینکه آیا اجازه ویژه را اعطا کرده یا رد کرده است – در روش onResume().
  8. اگر کاربر به برنامه شما اجازه داده باشد، می‌توانید به داده‌های خصوصی کاربر دسترسی داشته باشید. اگر کاربر اجازه را رد کرد، تجربه برنامه‌تان را به‌طور متین تنزل دهید تا برنامه‌تان بدون اطلاعاتی که توسط آن اجازه محافظت می‌شود، عملکردی را به کاربر ارائه دهد.
نموداری که گردش کار برای اعلام و درخواست اجازه‌های ویژه در Android را نشان می‌دهد، از اعلام مانیفست تا منطق کاربر، هدایت تنظیمات سیستم، و رسیدگی به تصمیم کاربر.
شکل ۲. گردش کار برای اعلام و درخواست اجازه‌های ویژه در Android.

درخواست اجازه‌های ویژه

برخلاف اجازه‌های زمان اجرا، کاربر باید اجازه‌های ویژه را از صفحه دسترسی ویژه برنامه در تنظیمات سیستم اعطا کند. برنامه‌ها می‌توانند بااستفاده از قصد، کاربران را به آنجا بفرستند که این کار برنامه را موقتاً متوقف می‌کند و صفحه تنظیمات مربوطه را برای اجازه ویژه موردنظر راه‌اندازی می‌کند. پس‌از اینکه کاربر به برنامه برمی‌گردد، برنامه می‌تواند بررسی کند که آیا اجازه در تابع onResume() اعطا شده است یا نه.

نمونه کد زیر نحوه درخواست اجازه ویژه SCHEDULE_EXACT_ALARMS از کاربران را نشان می‌دهد:

val alarmManager = getSystemService<AlarmManager>()!!
when {
   // if permission is granted, proceed with scheduling exact alarms…
   alarmManager.canScheduleExactAlarms() -> {
       alarmManager.setExact(...)
   }
   else -> {
       // ask users to grant the permission in the corresponding settings page
       startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
   }
}

کد نمونه برای بررسی اجازه و رسیدگی به تصمیمات کاربر در onResume():

override fun onResume() {
    // ...

    if (alarmManager.canScheduleExactAlarms()) {
        // proceed with the action (setting exact alarms)
        alarmManager.setExact(...)
    }
    else {
        // permission not yet approved. Display user notice and gracefully
        // degrade your app experience.
        alarmManager.setWindow(...)
    }
}

نکاتی برای درخواست اجازه‌های ویژه

بخش‌های زیر ملاحظات و نکاتی را برای درخواست اجازه‌های ویژه ارائه می‌دهند.

هر اجازه روش بررسی خودش را دارد

اجازه‌های ویژه متفاوت از اجازه‌های زمان اجرا عمل می‌کنند. درعوض، به صفحه مرجع میانای برنامه‌سازی کاربردی اجازه‌ها مراجعه کنید و از توابع بررسی دسترسی سفارشی برای هر اجازه ویژه استفاده کنید. نمونه‌ها شامل AlarmManager#canScheduleExactAlarms() برای اجازه SCHEDULE_EXACT_ALARMS و Environment#isExternalStorageManager() برای اجازه MANAGE_EXTERNAL_STORAGE است.

درخواست در بافت

مشابه اجازه‌های زمان اجرا، برنامه‌ها باید اجازه‌های ویژه را در بافت مربوطه درخواست کنند، یعنی زمانی که کاربر کنش خاصی را درخواست می‌کند که به آن اجازه نیاز دارد. برای مثال، برای درخواست اجازه SCHEDULE_EXACT_ALARMS تا زمانی که کاربر ایمیلی را برای ارسال در زمان خاصی زمان‌بندی کند صبر کنید.

توضیح درخواست

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