Android 6: Runtime Permission ile gelen yenilikler
Bir android uygulama geliştirildiğinde android sistemi, kullanıcının kişisel gizliliğini korumak amacıyla başta ek herhangi bir erişime sahip değildir. Uygulama için ek bir yetki veya bilgi edinilmesi gerektiğinde, uygun izin isteği AndroidManifest.xml dosyasına tanımlanmalıdır.
İstenen iznin hassasiyetine göre, sistem otomatik olarak yetki verebilir ya da kullanıcıdan onay alması gerekebilir. Bu noktada normal ve tehlikeli olmak üzere 2 tip izin vardır. Örneğin cihazın el fenerini kullanmak için android manifest dosyasına izin tanımladığımızda sistem bu izni otomatik olarak verebilir. Bu normal bir izindir, çünkü kullanıcıya ait özel bir bilgi içermez. Farklı bir örnek olarak kullanıcının kişi listesine erişim için bir izin gerekli olsaydı (kişi listesi kullanıcıya ait özel bir bilgi olduğundan tehlikeli izindir ve) sistem bu izin için kullanıcının onayına ihtiyaç duyacaktı. Normal ve Tehlikeli izin kategorilerini detaylı incelemek isterseniz linklerden ulaşabilirsiniz.
Tehlikeli izinler için kullanıcı onayı Android 6.0 (API 23) ile birlikte daha kullanıcı kontrollü bir hale getirildi. Android 5.1 ve daha önceki versiyonlar için, tehlikeli izinler kullanıcıdan uygulama kurulumu ya da güncellemesi sırasında alınmak istenir ve gerekli izin verilmezse uygulama yüklenmez. Android 6.0 ve sonraki versiyonlar için, tehlikeli izinler uygulama çalışırken gerekli olduğu yerlerde istenir ve kullanıcı gerekli özellik için izin vermese bile, ilgili özelliği kullanmadan uygulamayı kullanmaya devam edebilir. Ben bu yazımda Android 6.0 ve sonraki versiyonlar için bu sürecin nasıl işlediğini anlatmaya çalışacağım.
Get Çağla Çetin’s stories in your inbox
Join Medium for free to get updates from this writer.
Bir uygulamada tehlikeli kategorisindeki bir izne ihtiyaç varsa, bu izin kullanıcı tarafından daha önce onaylanmış bile olsa her seferinde uygulama tarafından kontrol edilmelidir. Çünkü kullanıcı verdiği izinden istediği an cayma hakkına sahiptir. Telefonun “Ayarlar - Uygulamalar - İlgili Uygulama - İzinler” kırınımından bu işlemi yapabilir. Uygulama tarafından izin kontrolü ContextCompat.checkSelfPermission(Context context, String permission) metodu ile yapılır. Bu metod kullanıcı izin verdiğinde PackageManager.PERMISSION_GRANTED dönerken, izin vermediğinde ise PackageManager.PERMISSION_DENIED döner. Aşağıdaki örnek, uygulama üzerinden arama yapmak için kullanıcının güncel izin durumunu kontrol etmek içindir.
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED){
//CALL_PHONE özelliği için kullanıcı zaten daha önceden yetki //vermiştir. Bu yetki ile yapılmak istenen burada yapılır.
}
else {
// İzin için kullanıcıya açıkça sorulmalıdır.
}Android uygulamamız tehlikeli kategorisindeki bir izne ihtiyaç duyarsa, bu yetki için mutlaka kullanıcıya sorulması gerektiğinden bahsetmiştim. İzin alma işlemi için android sistemine ait standart bir dialog mevcuttur. Bu dialog requestPermissions() metodu ile çağrılır ve customize edilemez.
Eğer kullanıcı izin için ilk kez çıkan dialog’a izin vermeyip, yeniden o özelliği kullanmaya çalışırsa, büyük ihtimalle o iznin ne için gerekli olduğunu anlamamıştır bu sebeple kullanıcıya standart izin dialog’u gösterilmeden önce, uygulamanın izne neden ihtiyacı olduğunu anlatan bir açıklama gösterilmelidir. Eğer kullanıcı açıklamaya ikna olup izin vermeyi kabul ederse, standart izin penceresine yeniden yönlendirilir.
Android sistemi, kullanıcıya bir açıklama göstermenin gerekli olup olmadığına karar vermemizi kolaylaştıran bir metod sunmuştur: shouldShowRequestPermissionRationale() metodu true dönerse, kullanıcıya daha önceden android standart dialog’u gösterilmiş ve kullanıcı izni onaylamamıştır. Bu sebeple true döndüğü durumlarda önce iznin ne için gerekli olduğunu anlatan bir açıklama gösterilmesi ve kullanıcı bu açıklamayı onaylarsa standart izin dialog’una yönlendirilmesi gerekir. İzin kullanıcıdan ilk defa istenecekse ya da kullanıcı “Never ask again” durumu onaylanmışsa metod false döner.
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED){
}
else {
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.CALL_PHONE)) { /* Uygulama ilgili izni default dialog ile istemiş fakat kullanıcı bu izni onaylamadığı için buraya düşmüştür.*//* Default dialog'a yönlendirmeden önce bir açıklama yapılması ve bu açıklamayı onaylarsa default dialog'a yönlendirilmesi gerekir. */
} else {
/* Kullanıcı tehlikeli izin kategorisindeki bir özelliği
*ilk defa kullanması gerektiğinde ya da
*çıkan default dialog'u "Never ask again" olarak işaretlediğinde
bu döngüye girer. */
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.CALL_PHONE},
MY_PERMISSIONS_REQUEST_CALL_PHONE);
// MY_PERMISSIONS_REQUEST_CALL_PHONE is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
Kullanıcı standart izin dialog’una requestPermissions(Activity activity, String permissions, int requestCode) metodu ile yönlendirilir. Buradaki requestCode ≥ 0 olmak şartıyla uygulamaya spesifik sabit bir değer olmalıdır. Kullanıcı izin dialoguna cevap verdiğinde onRequestPermissionsResult(int requestCode, String permissions, int grantResults) metodu override eder. İzne yetki verip vermemesine göre yapılmak istenenler bu aşamada yapılır.
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_CALL_PHONE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}onRequestPermissionsResult() metodu tek bir izne özgü değildir. Uygulama için alınması gereken birden fazla izin olduğunda iznin requestCode’una göre onRequestPermissionsResult() metodu override eder.
Bu konu için geliştirdiğim basit android uygulamaya github üzerinden ulaşabilirsiniz.
Kaynaklar:






