Özel izinler iste

Özel izin, özellikle hassas olan veya doğrudan kullanıcı gizliliğiyle ilgili olmayan sistem kaynaklarına erişimi korur. Bu izinler, yükleme zamanı izinlerinden ve çalışma zamanında istenen izinlerden farklıdır.

Android sistem ayarlarındaki "Özel uygulama erişimi" ekranında uygulamaların listesi ve özel izin durumları gösteriliyor.
Şekil 1. Sistem ayarlarındaki Özel uygulama erişimi ekranı.

Özel izinlere örnek olarak şunlar verilebilir:

  • Kesin zamanlı alarmlar planlama
  • Diğer uygulamaların üzerinde gösterme ve çizim yapma.
  • Tüm depolama alanı verilerine erişme

Özel izin beyan eden uygulamalar, sistem ayarlarındaki Özel uygulama erişimi sayfasında gösterilir (Şekil 1). Kullanıcının uygulamaya özel izin vermek için şu sayfaya gitmesi gerekir: Ayarlar > Uygulamalar > Özel uygulama erişimi.

İş akışı

Özel izin istemek için aşağıdakileri yapın:

  1. Uygulamanızın manifest dosyasında, uygulamanızın istemesi gerekebilecek özel izinleri beyan edin.
  2. Uygulamanızın kullanıcı deneyimini (UX), uygulamanızdaki belirli işlemler belirli özel izinlerle ilişkilendirilecek şekilde tasarlayın. Kullanıcılara, uygulamanızın özel kullanıcı verilerine erişmesi için hangi işlemlerin izin vermelerini gerektirebileceğini bildirin.
  3. Kullanıcının, uygulamanızda belirli özel kullanıcı verilerine erişim gerektiren görevi veya işlemi başlatmasını bekleyin. Bu durumda uygulamanız, söz konusu verilere erişmek için gereken özel izni isteyebilir.
  4. Kullanıcının, uygulamanızın gerektirdiği özel izni verip vermediğini kontrol edin. Bunun için her iznin özel kontrol işlevini kullanın. İzin verilirse uygulamanız özel kullanıcı verilerine erişebilir. Sorun çözülmezse bir sonraki adıma geçin. Not: İzin gerektiren bir işlem yapacağınız her seferde izniniz olup olmadığını kontrol etmeniz gerekir.
  5. Kullanıcıya, uygulamanızın hangi verilere erişmeye çalıştığını ve özel izin vermesi durumunda uygulamanın kullanıcıya ne gibi avantajlar sağlayabileceğini net bir şekilde açıklayan bir kullanıcı arayüzü öğesi gösterin. Ayrıca, uygulamanız kullanıcıları izin vermek için sistem ayarlarına yönlendirdiğinden, kullanıcıların orada nasıl izin verebileceklerini açıklayan kısa talimatlar da ekleyin. Açıklama kullanıcı arayüzü, kullanıcıya izni vermemeyi seçebileceği net bir seçenek sunmalıdır. Kullanıcı gerekçeyi onayladıktan sonra bir sonraki adıma geçin.
  6. Uygulamanızın özel kullanıcı verilerine erişmek için ihtiyaç duyduğu özel izni isteyin. Bu işlem, kullanıcının izni verebileceği sistem ayarlarındaki ilgili sayfaya yönelik bir intent içerir. Çalışma zamanında istenen izinlerin aksine, izin iletişim kutusu yoktur.
  7. onResume() yönteminde kullanıcının yanıtını (özel izni vermeyi mi yoksa reddetmeyi mi seçtiğini) kontrol edin.
  8. Kullanıcı uygulamanıza izin verdiyse özel kullanıcı verilerine erişebilirsiniz. Kullanıcı izni reddettiyse uygulama deneyiminizde kontrollü azaltma uygulayın. Böylece uygulamanız, söz konusu izinle korunan bilgiler olmadan kullanıcıya işlevsellik sunar.
Android'de özel izinleri beyan etme ve isteme iş akışını gösteren diyagram. Manifest beyanından kullanıcı gerekçesine, sistem ayarları yönlendirmesine ve kullanıcının kararını işlemeye kadar olan adımları içerir.
Şekil 2. Android'de özel izinleri beyan etme ve isteme iş akışı.

Özel izinler isteme

Çalışma zamanında istenen izinlerin aksine, kullanıcının özel izinleri sistem ayarlarındaki Özel Uygulama Erişimi sayfasından vermesi gerekir. Uygulamalar, bir intent kullanarak kullanıcıları bu sayfaya yönlendirebilir. Bu durumda uygulama duraklatılır ve belirli bir özel izin için ilgili ayarlar sayfası açılır. Kullanıcı uygulamaya döndükten sonra uygulama, onResume() işlevinde iznin verilip verilmediğini kontrol edebilir.

Aşağıdaki örnek kodda, kullanıcılardan SCHEDULE_EXACT_ALARMS özel izninin nasıl isteneceğini gösterilmektedir:

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() dilinde izni kontrol etmek ve kullanıcı kararlarını işlemek için örnek kod:

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(...)
    }
}

Özel izin istemeyle ilgili ipuçları

Aşağıdaki bölümlerde, özel izinler istenirken dikkat edilmesi gereken noktalar ve ipuçları verilmiştir.

Her iznin kendi kontrol yöntemi vardır.

Özel izinler, çalışma zamanında istenen izinlerden farklı şekilde çalışır. Bunun yerine, izinler API referans sayfasına bakın ve her özel izin için özel erişim kontrolü işlevlerini kullanın. SCHEDULE_EXACT_ALARMS izni için AlarmManager#canScheduleExactAlarms() ve MANAGE_EXTERNAL_STORAGE izni için Environment#isExternalStorageManager() örnek olarak verilebilir.

Bağlam içinde istekte bulunma

Çalışma zamanında istenen izinlere benzer şekilde, uygulamalar, kullanıcı izni gerektiren belirli bir işlem istediğinde bağlam içinde özel izinler istemelidir. Örneğin, kullanıcı belirli bir zamanda gönderilecek bir e-posta planlayana kadar SCHEDULE_EXACT_ALARMS izni istemeyin.

İsteği açıklayın

Sistem ayarlarına yönlendirmeden önce gerekçeyi belirtin. Kullanıcılar özel izinler vermek için uygulamadan geçici olarak ayrıldığından, sistem ayarlarındaki Özel Uygulama Erişimi sayfasına intent'i başlatmadan önce uygulama içi bir kullanıcı arayüzü gösterin. Bu kullanıcı arayüzü, uygulamanın neden izne ihtiyacı olduğunu ve kullanıcının ayarlar sayfasında bu izni nasıl vermesi gerektiğini net bir şekilde açıklamalıdır.