Anasayfa / Android Dersleri / Android 6.0 (Marshmallow) İzin Ayarları – Runtime Permissions

Android 6.0 (Marshmallow) İzin Ayarları – Runtime Permissions

Merhaba. Şuan 9.0 versiyonu çıkmış olsa da Android 6.0 (Marshmallow)’da gelen ve birçok uygulamanın hata vermesine sebep olan bir yenilikten bahsedeceğim.

Android 6.0 (Marshmallow) öncesinde, Google Play’ den uygulama indirirken izinler, indirme esnasında toptan kabul ediliyordu ve bunların arasından erişmesini istemediğimiz izinleri iptal etme gibi bir lüksümüz yoktu. Başta kabul edildiğinde artık izinler kaldırılamıyordu.

4.4.2 versiyonlu bir cihazda, indirilmiş bir uygulamanın izinleri:

Versiyonu 6.0 ve üzeri olan cihazlarda ise artık uygulamayı indirirken değil uygulama açıkken, ihtiyaç olduğu sürece izin isteniyor ve dilerseniz izin vermeyebiliyorsunuz.

Mesela indirdiğiniz bir uygulama kameranızı açmak istiyor diyelim. O an bir uyarı penceresi ile uygulamanın kameranıza erişmek istediği söyleniyor. İzin verirseniz kamera açılıyor, vermezseniz açılmıyor. İzin vermediğinizde uygulama tam olarak işlevini görmüyor fakat en azından hangi izne nerede ve niçin erişmek istediğini bilebiliyorsunuz ve tüm izinleri, 6.0’dan önceki gibi peşinen kabul etmemiş oluyorsunuz. 6.0 altındaki cihazlarda ise uygulama içinde izin pencereleri açılmaz. Uygulamayı indirirken verdiğiniz izinler uygulama boyunca kullanılır.

Android 6.0 İzin İşlemi – Örnek

Örnek üzerinde gösterelim. Örneğimizde butona tıklandığında kameranın açılmasını isteyelim. Cihazın API versiyonu 23 ve üzeriyse (Android 6.0’a denk gelir) izin istesin. Değilse, izinsiz doğrudan kamera açsın.

AndroidManifest.xml dosyamıza ilk olarak kamera izni ekleyelim.

Daha sonra activity_main.xml layout dosyasına bir buton ekleyelim.

Şimdi ise bu tasarıma bağlı olan MainActivity.java dosyasına gelerek, butonun click eventini dolduralım.

Kamera açan bir uygulamanız var ve butona basıldığında ya da herhangi bir işlemden sonra doğrudan kamera açmak istiyorsunuz. Yukarıdaki gibi kontrol koymanız gerekiyor. Cihazın Android versiyonu 6.0 altında ise doğrudan kamera açılır. 6.0 ve üzeri ise önce izin verilmiş mi bakılır. İzin verilmemişse izin istenir (16.satırdaki ünlem işaretine dikkat!!). Verilmişse yine doğrudan kamera açılır.

Burada izin isterken 100 değeri gönderdik. Aşağıdaki gibi bir izin penceresi açıldı.

Bu izin penceresinde bir seçeneğe tıklayacağız. Tıkladıktan sonra istek gönderirken verdiğimiz 100 değeri ile yanıtımızı handle edeceğiz. Handle yani kontrol etmek için ise onRequestPermissionsResult metodu kullanılır. 100 yerine herhangi bir sayı veya sabit verilebilir.

Pencerede Reddet veya İzin Ver butonlarından birine tıklayınca onRequestPermissionsResult metodu çalışır. Metod içerisinde, önce kamera iznine ait olan 100 değeri switch içerisine yazılır. İzin verildiyse yine kameraAc() metodu çağrılır. Verilmediyse ekrana uyarı mesajları verilir.

ÖNEMLİ!!!

Eğer bir sefer izin verirsek, 2.tıklamada artık requestPermissions() metodu çağrılmayacak doğrudan kamera açılacaktır. Çünkü izin verilmediyse izin isteği gönderiyorduk. İzin verildikten sonra kişi eğer huylanır da cihazın Ayarlar sekmesinden uygulama izinlerini manuel olarak iptal ederse, uygulamaya girip butona tıkladığında tekrar requestPermissions() metodu çağrılır. O yüzden her tıklamada izin verilmiş mi kontrolü yapılmalı yoksa uygulama hata vererek durur.

Aşağıdaki gibi kişinin manuel olarak izinleri kapatma ihtimali vardır.

Dikkat ettiyseniz değinmediğimiz bir metot var. O da izinKontrol() metodu. Bu metot şu işe yarar:

-Bu uygulama için istenilen izinler kullanıcı tarafından verilmiş mi ?

Bu metot, aynı anda birden fazla izin alacağımız durumlarda işimize yarayacaktır. Tek izin için de işimizi görür. Hemen o metodu da yazalım.

Aynı Ekranda 2.İzni İsteme

Örneğimizde 1 adet izin istedik. Şimdi ise aynı activity içinde 2.buton ekleyip, bu buton ile de cihazın konumunu alalım.

Manifest dosyamıza izinleri de ekleyelim.

MainActivity.java dosyasına, konum alma butonu için click eventi oluşturalım.

Cihazlarda 2 tür konum olduğu için 2 tür izin istemek zorundayız. İzin isterken bu defa 100 değil 200 değeri gönderdik ve aşağıdaki onRequestPermissionsResult() metodunda da 200 için ayrı bir case oluşturarak, konum izni verildiğinde yapılacakları yazdık.

Buradaki grantResults[0] ve grantResults[1] içerisinde, lokasyon için istediğimiz izinler vardır. İlkinde ACCESS_COARSE_LOCATION, ikincisinde de ACCESS_FINE_LOCATION izni için bilgiler bulunmaktadır. Yani izin verildi mi bilgisi tutulur.

Sonuç olarak eğer izin gerektiren bir işlem yaptırmak istiyorsak, hem cihaz için API 23 kontrolü yapmalıyız hem de izin verilmediyse izin penceresi açarak, seçilen seçeneğe göre aynı işlemleri orada da yapmalıyız. Yani her tıklamada ve izin penceresi açıldığı her durumda…

Son olarak şunu da söyleyelim. Android SDK’sı, tehlikeli bulduğu izinler için bu işlemi yapar. Yani bir internet ve bluetooth açma işlemi için API 23 kontrolüne gerek yoktur. Sadece AndroidManifest.xml dosyasına izin eklenir ve kodda doğrudan işlem yapılır. Dosya okuma yazma, kamera açma, mikrofon açma, konum alma gibi işlemler için kullanıcıdan izin isteme mecburiyeti vardır. Bu yaptıklarımız da tehlikeli olan izinler içindir.

Tehlikeli ve normal izinlerin listesine buradan ulaşabilirsiniz.

KAYNAK KODLARI İNDİR

Mehmet Kirazlı

İstanbul Eyüp'te ikamet ediyorum. Giresun Alucra'lıyım. Bilgisayar Mühendisliği bölümünden 2013 yılında mezun oldum. "Yeni Başlayanlar için Java 8" kitabının yazarıyım. Şu anda özel bir firmada Mobil Yazılım Geliştirme Uzmanı olarak çalışıyorum.

İlginizi Çekebilir

android dersleri

Android Dersleri 28 : Butonları Tek Bir Listener ile Kontrol Etme

Merhaba. Bu derste, android uygulamalarımızdaki butonların hepsi için tek bir listener oluşturmayı anlatacağım.

2 Yorumlar

  1. Mehmet hocam 3 gündür uüraşıyorum permission.WRITE_SETTINGS iznini +23 ler için veremedim.
    En anlaşılır makale sizinki ama sizinkine permission.WRITE_SETTINGS ekliyorum 3. olarak ilk ikidi yani kamera ve konum izin alıyor ama permission.WRITE_SETTINGS izin almıyor
    “izin verilmediği için” diye mesaj veriyor.
    Yardımcı olursaniz sevinirim
    saygılar

    • Merhaba. 3 izin eklediyseniz 3 defa popup çıkması lazım. Eğer çıkıyor ama WRİTE izni alınmamış görünüyorsa, sebebi şunlar olabilir. Manifeste eklememiş olabilirsiniz, verilen izni handle ettiğiniz yerde (onRequestPermissionsResult metodunda) yanlış id ile kontrol etmeye çalışıyor olabilirsiniz. Verdğiniz 100,200,300 değerlerini kontrol edin. Eğer bunlar da tamamsa o zaman “izin verilmediği için” mesajını yanlış şartta veriyor olabilirsiniz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir