Android 6.0 Üzeri İzin Ayarları

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.

Android 6.0 Permission

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

Alper Beyler

Yüksek Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği
Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği (4/3.30) (2010-2014)
Lisans : Viyana Teknik Üniversitesi / Bilgisayar Bilimleri (2013)

7 Yorum

  • merhaba, uygulamanın target sdk versiyonunu 23 ve üzerinde seçtim ve Android 6 olan bir cihazda çalıştırdığımda permissionları runtime olarak soruyor(normal durum), target sdk versiyonunu 23 den düşük bir değer ayarladığımda runtimeda sormuyor manifest den alıyor sanırım. Neden böyle bir durum oluşuyor? TargetSdk Versiyonumuzu 22 ayarlayıp, Android 6 da çalıştırsak permissionlarla ilgili sorunlarla karşılaşırmıyız?

    • Hayır karşılaşmazsın, ancak uygulaman her zaman eski sürümde kalır. Yani Android suan 7 üzerinden calısıyor bir süre sonra 8 cıkacak fakat senin uygulaman hala 6 altındaki özellikleri destekleyebilecek. Dolayısıyla doğru olan üst sürüme geçirmen.

  • Bilgi paylaşımı için teşekkürler. Bende if satırındaki

    listPermissionsNeeded.add(Manifest.permission.ACCESS_NETWORK_STATE);

    cannot resolve symbol ACCESS_NETWORK_STATE (kırmızı renk).

    ve de

    Error:Conflict with dependency ‘com.squareup:javawriter’ in project ‘:PlayRadio’. Resolved versions for app (2.5.0) and test app (2.1.1) differ. See http://g.co/androidstudio/app-test-app-conflict for details.

    hatayı anlayamadım yardımcı olurmusunuz?

  • Simdi hocam önce manifest dosyasına ıstedıgım ızınlerı ekledım. Sd karta yazma okuma felan var. Sonra SplashActivity.java dosyasını java klasoru altına olusturdum. Ancak “ContextCompat” “PackageManager” bunlarda kırmızı oluyor hata verıyor nasıl halledebilirz nerede eksik yapıyorum acaba

  • Üstaıdm merhabalar.
    sizin belirttiğiniz şekilde KAMERA izinlerini manifeste ekledim ve java dosyasına da eklentileri yaparak izin alma işlemini açılışta almayı başardım. KAMERA VE VİDEO KAYIT için İZİN VERMEK İSTİYORMUSUNUZ diye bir alert geldi. İzin veriyorum. Fakat webview kısmındaki resim upload kısmına resim yuklemek istediğimde Dosya Seçe basıyorum sadece Galeri açılıyor.. Kamera Seçeneği çıkmıyor. Bu konuda sizin tecrübelerinizden faydalanmak isterim. ne yapmam gerekiyor acaba başka.

    Manifest izinleri

    JAVA DOSYASINDA EKLEDİĞİM İZİN KODLARI

    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 permissionCAMERA = ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA);
    int permissionVideoOutputCAMERA = ContextCompat.checkSelfPermission(this, Manifest.permission.CAPTURE_VIDEO_OUTPUT);
    int permissionVideoSecureOutputCAMERA = ContextCompat.checkSelfPermission(this, Manifest.permission.CAPTURE_SECURE_VIDEO_OUTPUT);

    List 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 (permissionCAMERA != PackageManager.PERMISSION_GRANTED) {
    listPermissionsNeeded.add(android.Manifest.permission.CAMERA);
    }
    if (permissionVideoOutputCAMERA != PackageManager.PERMISSION_GRANTED) {
    listPermissionsNeeded.add(Manifest.permission.CAPTURE_VIDEO_OUTPUT);
    }
    if (permissionVideoSecureOutputCAMERA != PackageManager.PERMISSION_GRANTED) {
    listPermissionsNeeded.add(Manifest.permission.CAPTURE_SECURE_VIDEO_OUTPUT);
    }

    if (!listPermissionsNeeded.isEmpty()) {
    ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
    return false;
    }
    return true;
    }

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?