Özel izinler iste

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

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

Özel izinlere örnek olarak şunlar verilebilir:

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

Özel izin bildiren 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 isteyebileceği özel izinleri beyan edin.
  2. Uygulamanızdaki belirli işlemlerin belirli özel izinlerle ilişkilendirilmesi için uygulamanızın kullanıcı deneyimini tasarlayın. Kullanıcılara, uygulamanızın gizli kullanıcı verilerine erişmesi için hangi işlemlerin izin vermelerini gerektirebileceğini bildirin.
  3. Uygulamanızda belirli özel kullanıcı verilerine erişim gerektiren görevin veya işlemin kullanıcı tarafından başlatılması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 daha önce 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. Sorun çözülmezse bir sonraki adıma geçin. Not: İlgili izni gerektiren bir işlem gerçekleştirdiğiniz her seferde bu izne sahip olup olmadığınızı kontrol etmeniz gerekir.
  5. Kullanıcıya, uygulamanızın hangi verilere erişmeye çalıştığını ve özel izni vermesi durumunda uygulamadan hangi avantajları elde edebileceğini net bir şekilde açıklayan bir kullanıcı arayüzü öğesinde gerekçe sunun. Ayrıca, uygulamanız izin vermek için kullanıcıları sistem ayarlarına yönlendirdiğinden, kullanıcıların izni nasıl verebileceğini açıklayan kısa talimatlar da ekleyin. Gerekçe kullanıcı arayüzü, kullanıcıya izni vermeyi devre dışı bırakabileceğ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 gizli kullanıcı verilerine erişmek için ihtiyaç duyduğu özel izni isteyin. Bu durumda, kullanıcının izni verebileceği sistem ayarlarındaki ilgili sayfaya yönlendirme yapılması gerekir. Çalışma zamanı izinlerinin aksine, izin için pop-up iletişim kutusu gösterilmez.
  7. Kullanıcının yanıtını (özel izni verip vermediğini) onResume() yönteminde kontrol edin.
  8. Kullanıcı, uygulamanıza izin verdiyse özel kullanıcı verilerine erişebilirsiniz. Kullanıcı izni reddettiyse uygulama deneyiminizi kontrollü bir şekilde azaltın. Böylece, kullanıcıya bu izinle korunan bilgiler olmadan işlevsellik sunabilirsiniz.
Şekil 2. Android'de özel izinleri bildirme ve isteme iş akışı.

Özel izin isteme

Ç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 yönlendirmek için bir amaç kullanabilir. Bu amaç, uygulamayı duraklatır ve belirli bir özel izin için ilgili ayarlar sayfasını başlatı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 nasıl SCHEDULE_EXACT_ALARMS özel izni 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))
   }
}

İzni kontrol etmek ve kullanıcı kararlarını onResume() içinde 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 izinler istenirken dikkat edilmesi gereken bazı en iyi uygulamalar ve hususlar açıklanmaktadır.

Her iznin kendi kontrol yöntemi vardır.

Özel izinler, çalışma zamanı izinlerinden 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, AlarmManager#canScheduleExactAlarms(), SCHEDULE_EXACT_ALARMS izni için, Environment#isExternalStorageManager() ise MANAGE_EXTERNAL_STORAGE izni için kullanılır.

Bağlam içi istek

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

İsteği açıklayın

Sistem ayarlarına yönlendirmeden önce bir gerekçe sunun. Kullanıcılar özel izinler vermek için uygulamadan geçici olarak ayrıldığından, sistem ayarlarındaki Özel Uygulama Erişimi sayfasına niyet başlatmadan önce uygulama içi kullanıcı arayüzü gösterin. Bu kullanıcı arayüzünde, uygulamanın izne neden ihtiyaç duyduğu ve kullanıcının ayarlar sayfasında bu izni nasıl vereceği net bir şekilde açıklanmalıdır.