Özel izinler iste

Özel izinler, ö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ı izinlerinden farklıdır.

Şekil 1: Sistem ayarlarındaki Özel uygulama erişimi ekranı.

Özel izinlere örnek olarak şunlar verilebilir:

  • Tam alarmları planlama.
  • Diğer uygulamaların üzerinde görüntüleme ve çizim yapma.
  • Tüm depolama verilerine erişme.

Özel izin beyan eden uygulamalar, sistem ayarlarındaki Özel uygulama erişimi sayfasında gösterilir (şekil 1). Uygulamaya özel izin vermek için kullanıcının ş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, uygulamanızdaki belirli işlemlerin belirli özel izinlerle ilişkilendirileceği şekilde tasarlayın. Hangi işlemler için uygulamanızın gizli kullanıcı verilerine erişmesine izin vermeleri gerektiğini kullanıcılara bildirin.
  3. Uygulamanızda belirli gizli kullanıcı verilerine erişim gerektiren görevi veya işlemi kullanıcıdan çağırın. Bu sırada 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. Bunu yapmak için her iznin özel kontrol işlevini kullanın. İzin verilirse uygulamanız özel kullanıcı verilerine erişebilir. Çalışmıyorsa bir sonraki adıma geçin. Not: İzin gerektiren bir işlem gerçekleştirdiğinizde her seferinde izniniz olup olmadığını kontrol etmeniz gerekir.
  5. Uygulamanızın hangi verilere erişmeye çalıştığını ve özel izni verirlerse kullanıcıya ne gibi avantajlar sağlayabileceğini açıkça anlatan bir kullanıcı arayüzü öğesinde kullanıcıya nedenini açıklayın. Ayrıca, uygulamanız kullanıcıları izin vermek için sistem ayarlarına yönlendirdiğinden, kullanıcıların izinleri burada nasıl verebileceklerini açıklayan kısa talimatlar da ekleyin. Gerekçe kullanıcı arayüzünde, kullanıcının izni devre dışı bırakabileceği net bir seçenek sunulmalıdır. Kullanıcı gerekçeyi kabul ettikten sonra sonraki adıma geçin.
  6. Uygulamanızın gizli kullanıcı verilerine erişmek için ihtiyaç duyduğu özel izni isteyin. Bu işlem muhtemelen kullanıcının izni verebileceği sistem ayarlarındaki ilgili sayfaya yönelik bir intent içerir. Çalışma zamanı izinlerinin aksine pop-up 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 gizli kullanıcı verilerine erişebilirsiniz. Kullanıcı izni reddettiyse uygulamanızın deneyimini kontrollü bir şekilde azaltın. Böylece, kullanıcıya bu izinle korunan bilgiler olmadan işlev sunabilirsiniz.
Şekil 2: Android'de özel izinleri beyan etme ve isteme iş akışı.

Özel izin isteğinde bulunma

Çalışma zamanı izinlerinin aksine, kullanıcının sistem ayarlarındaki Özel Uygulama Erişimi sayfasından özel izinler vermesi gerekir. Uygulamalar, kullanıcıları bu sayfaya bir intent kullanarak gönderebilir. Bu intent, uygulamayı duraklatır ve belirli bir özel izin için ilgili ayarlar sayfasını açar. Kullanıcı uygulamaya geri 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 iznin nasıl isteneceği 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()'te 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(...)
   }
}

En iyi uygulamalar ve ipuçları

Aşağıdaki bölümlerde, özel izin isteğinde bulunurken dikkate almanız gereken bazı en iyi uygulamalar ve noktalar verilmiştir.

Her iznin kendi kontrol yöntemi vardır.

Özel izinler, çalışma zamanındaki 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. Örneğin, SCHEDULE_EXACT_ALARMS izni için AlarmManager#canScheduleExactAlarms() ve MANAGE_EXTERNAL_STORAGE izni için Environment#isExternalStorageManager() değerlerini kullanabilirsiniz.

Bağlam içinde istek

Çalışma zamanında istenen izinlere benzer şekilde, uygulamalar da kullanıcı izin gerektiren belirli bir işlem istediğinde bağlama göre özel izin istemelidir. Örneğin, kullanıcı belirli bir zamanda gönderilecek bir e-posta planlayana kadar SCHEDULE_EXACT_ALARMS iznini istemeyi bekleyin.

İsteği açıklayın

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