Merhaba arkadaşlar,
mobilhanem.com sitemiz üzerinden anlattığımız Android Derslerimize, bu dersimizde Android 6.0 Üzeri İzin Ayarları ile devam ediyoruz. Hepimizin bildiği üzere uygulama izinlerini alabilmek için gerekli izin kod parçalarını AndroidManifest.xml dosyasına yazıyorduk. Uygulamayı store dan indiren kullanıcılarda istenen izinlerin hepsini kabul etmek zorunda kalıyorlardı. Android 6.0 Marshmallow güncellemesi ile Android 6.0 Üzeri İzin Ayarları sisteminde bazı değişiklikler oldu.
Android 6.0 Üzeri İzin Ayarları
Android uygulamalarımız da belirttiğimiz izinler güvenlik yönünden önem derecesi yüksek ve düşük olan izinlerdir, işte bu noktada devreye konumuzda bahsedeceğimiz yeni Android 6.0 Üzeri İzin Ayarları mekanizması giriyor. Örneğin uygulama çalışırken izin gerektiren bir durumda kullanıcıya sorup o izni kullanıcıdan almamız gerekiyor. IOS’da da izin mekanizması aynı bu şekilde işlemekte , izin gerektiren işlemlerde kullanıcıya bu durumu hatırlatıp her seferinde izin vermesini bekliyoruz.
Güvenlik derecesi yüksek olan izin durumlarının neler olduğuna bakmak için bu linki inceleyebilirsiniz: https://developer.android.com/guide/topics/security/permissions.html?normal-dangerous
Güvenlik derecesi düşük olan normal izinlerin neler olduğunu görmek için bu linki inceleyebilirsiniz: https://developer.android.com/guide/topics/security/normal-permissions.html
Şimdi ise küçük bir örnek yaparak yeni izin mekanizmasının nasıl kullanıldığına bakalım:
- Uygulamamızda kullanmak istediğimiz istekleri AndroidManifest.xml dosyasına ekliyoruz.
- Uygulamamızın açılışında gerekli izinlerin kabul edilip edilmediğini kontrol ediyoruz ve kullanıcıya mesaj olarak gösteriyoruz.
- Bütün izinleri açılış ekranında tek bir seferde aldırtmak için bu örnek kodlamayı oluşturdum, aşağıdaki kod yapısını incelerseniz eğer bir int değer tuttuğumu göreceksiniz (REQUEST_ID_MULTIPLE_PERMISSIONS ) adında ve bu değeri 1905 olarak set ettim. Eğer uygulama içinde farklı yerde Manifest izinlerini almak istiyorsanız her izin için farklı bir int değerini belirtmeniz gerekmektedir.
Bu yapının en önemli özelliği runtime sırasında kullanıcıdan izin istemesidir. Şimdi kodlamasına bakalım uygulamamızın SplashActivity ekranında AndroidManifest.xml de belirttiğimiz izinlerin kontrolünü yapıp tek tek izin vermesini istedik. ( NOT: Eğer kullanıcıdan bir izin istiyorsak o iznin AndroidManifest.xml de yer alması gerektiğini unutmayalım sadece kodlamada istekte bulunmamız yetmez. )
Örnek Kod
SplashActivity.java
private boolean checkAndRequestPermissions() { int permissionINTERNET = ContextCompat.checkSelfPermission(this, android.Manifest.permission.INTERNET); int permissionACCESS_NETWORK_STATE = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_NETWORK_STATE); int permissionACCESS_FINE_LOCATION = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION); int permissionACCESS_VIBRATE = ContextCompat.checkSelfPermission(this, android.Manifest.permission.VIBRATE); int permissionCAMERA = ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA); int permissionACCESS_LOCATION_EXTRA_COMMANDS = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS); int permissionACCESS_COARSE_LOCATION = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION); int permissionWRITE_EXTERNAL_STORAGE = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE); int permissionACCESS_WIFI_STATE = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_WIFI_STATE); int permissionCHANGE_WIFI_STATE = ContextCompat.checkSelfPermission(this, android.Manifest.permission.CHANGE_WIFI_STATE); int permissionREAD_PHONE_STATE = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE); int permissionRECEIVE_BOOT_COMPLETED = ContextCompat.checkSelfPermission(this, android.Manifest.permission.RECEIVE_BOOT_COMPLETED); int permissionBLUETOOTH_ADMIN = ContextCompat.checkSelfPermission(this, android.Manifest.permission.BLUETOOTH_ADMIN); int permissionBLUETOOTH = ContextCompat.checkSelfPermission(this, android.Manifest.permission.BLUETOOTH); List<String> listPermissionsNeeded = new ArrayList<>(); if (permissionINTERNET != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.INTERNET); } if (permissionACCESS_NETWORK_STATE != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.ACCESS_NETWORK_STATE); } if (permissionACCESS_FINE_LOCATION != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.ACCESS_FINE_LOCATION); } if (permissionCAMERA != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.CAMERA); } if (permissionACCESS_VIBRATE != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.VIBRATE); } if (permissionACCESS_COARSE_LOCATION != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.ACCESS_COARSE_LOCATION); } if (permissionINTERNET != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.INTERNET); } if (permissionACCESS_LOCATION_EXTRA_COMMANDS != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS); } if (permissionWRITE_EXTERNAL_STORAGE != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (permissionACCESS_WIFI_STATE != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(Manifest.permission.ACCESS_WIFI_STATE); } if (permissionCHANGE_WIFI_STATE != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(Manifest.permission.CHANGE_WIFI_STATE); } if (permissionREAD_PHONE_STATE != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(Manifest.permission.READ_PHONE_STATE); } if (permissionRECEIVE_BOOT_COMPLETED != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(Manifest.permission.RECEIVE_BOOT_COMPLETED); } if (permissionBLUETOOTH_ADMIN != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(Manifest.permission.BLUETOOTH_ADMIN); } if (permissionBLUETOOTH != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(Manifest.permission.BLUETOOTH); } if (!listPermissionsNeeded.isEmpty()) { ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS); return false; } return true; }
Yukarıdaki kodlamayı incelediğinizde çoklu bir şekilde izin mekanizmasını kontrol ettiğimi göreceksiniz. İstekte bulunduğumuz kodları bir Listeye ekledik ve SplashActivity sayfamızın onCreate methodunda checkAndRequestPermissions ile hem check edip hemde istekte bulunduk. Bu şekilde çoklu isteğimizi uygulamamızın ilk açılış sayfasında kullanıcıya sunduk.
SplashActivity.java
public class SplashActivity extends AppCompatActivity { public static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1905; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); if (!checkAndRequestPermissions()) { return; } } }
Kodları kendinize uyarlayıp çalıştırdığınız da isteklerin sıra sıra kullanıcıya sunulduğunu göreceksiniz. Örnek ekran görüntüsü aşağıdadır.
Sonuç
Android 6.0 öncesinde yüklediğimiz herhangi bir uygulama ile kişisel bilgilerimiz çalınabilir, özel dosyalarımıza erişilebilir çünkü o uygulamayı play store dan indirirken pop up çıkarıyor ve uygulama bu izinleri kullanmak istiyor. Alt alta uygulama içinde yer alan bütün izinler listeleniyor ve izin verirsek hepsini kabul etmiş oluyoruz fakat izin vermezsek zaten uygulamayı indiremiyoruz. Yeni sistem ile birlikte izinler tek tek isteniyor ve kullanılmasını istemediğimiz izinleri reddedebiliyoruz. Android 6.0 ile birlikte izin mekanizması hem daha performanslı bir hale dönüştürülmüş hem de daha güvenli bir ortam oluşturulmuştur. Sizde kendi projelerinize bu yapıyı entegre ederek kullanabilirsiniz izin yapısını daha farklı bir şekilde oluşturup kullanabilirsiniz kodlama yapısı size kalmış.
Mobilhanem.com üzerinden anlattığımız mobil uygulama geliştirme derslerine devam edeceğiz. Konu hakkında sorunuzu yorum alanından sorabilirsiniz. Konu dışı sorularınızı ve tüm yazılımsal sorularınızı sorucevap.mobilhanem.com sitemizden de sorabilirsiniz.
Bir dahaki dersimizde görüşmek dileğiyle..
Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.
2