Android İşletim Sisteminde İzin Kavramı (PERMISSIONS)

Android İşletim Sisteminde 6.0'a kadar izin gerektiren durumlar programın kurulumu sırasında kullanıcıya sorularak belirlenmekteydi. Fakat bu işlem bir çok kullanıcı tarafından çok dikkat edilmeden geçildiğinden bir takım iziinler tehlikeli(dangerous) Android 6.0 ile birlikte tehlikeli olarak görülmektedir. Tehlikeli olan izinler AndroidManifest dosyası(Kurulurken kullanıcya sorulması) dışında ayrıca çalışma zamanı sırasında da izin alınması gereken durumlar olarak karşımıza çıkmaktadır.

Çalışma zamanı izinleri Android 6.0 ile birlikte uygulama yöneticisinden (Application Manager'den) ayarlanabilir hale getirildi. Bu bağlamda aslında Android İşletim Sistemi için izinler normal ve tehlikeli olmak üzere iki gruba ayrılmıştır. Normal izinler, kurulurken sorulan fakat çalışma zamanı sırasında izin alınması gerekmeyen izinlerdir.Fakat tehlikeli izinler ayrıca çalışma zamanı sırasında da izin alınması gereken izinlerdir.

İzin gerektiren tehlikeli izinler şunlardır.

Dangerous Permissions

  • CALENDAR
  • CAMERA
  • CONTACTS
  • LOCATION
  • MICROPHONE
  • PHONE
  • SENSORS
  • SMS
  • STORAGE

Peki uygulama diğer sistemler için de çalışacaksa programcı nasıl davranacaktır?

Uygulama Android 6.0 ve üstüne yazıldıysa fakat minimum SDK olarak daha düşük SDK'larda kullanılacaksa daha düşük versiyonlarda uygulamanın kurulumunda alınmış olan izin yeterli olacaktır.

6.0 için zaten hem kurulumda hem de Runtime'da izin istenmelidir.

Tehlikeli izinleri için aşağıdaki durumlar oluşabilir:

  • Uygulama 6.0 içerisinde yazılmış fakat daha önceki Sdk'larda çalıştırılıyorsa: Bu durumda izin zaten kurulurken alındığı için bu durumda bir problem oluşturmayacaktır.

  • Uygulama 6.0 ve üstünde çalışıyor fakat Runtime Permisson kapalı ise: Burada da herhangi bir problem oluşmamaktadır.Çünkü kurulurken zaten bu izin alınmıştır.

  • Uygulama 6.0 ve üzeri versiyonlarda çalıştırılıyorsa ve Runtime Permission açık ise: Aslında programcı bu duruma yönelik kod yazmaktadır. Bu durum için Android 6.0 ile birlikte eklenen çeşitli metodlar bulunmaktadır.

(https:\/\/www.dropbox.com\/sh\/2yj5cemmw3veiq1\/AAAnHyuIdWCxxYMalgHgBEWXa\/src\/Android\/088-RuntimePermissions?dl=0)

Çalışma zamanında izinin olup olmadığını ContextCompat sınıfının checkSelfPermission metoduyla kontrol edilebilmektedir.

checkSelfPermission metodunun 1. parametresi context 2.parametresi String türünden izin bilgisidir.

Bu metod PackageManager.PERMISSION.GRANTED dönerse izi vardır. PackageManager.PERMISSION.DENIED gelirse izin yoktur demektir.

Programcı izin istemek için ActivityCompat sınıfının requestPermissions isimli metodunu çağırmalıdır. requestPermissions metodu birden fazla izin çağırmak için de kullanıbilir.

requestPermissions metodunun birinci parametresi Activity referansını , 2. parametresi izinlere ilişkin String türden diziyi. 3 ise programcının çağırırken kullandığı Request kodunu belirtilmektedir. 3.parametresi az sonra anlatılacak olan onPermissionsRequestResult metoduna geçilecek koddur.

İzin işleminden önce herhangi bir işlem yapılma gerekçesine ilişkin (örneğin bir uyarı vermek gibi) için ActivityCompat sınıfının shouldShowRequestPermissionRationale metodu kullanılıbilir. Bu metod çalışma sırası izni gerektiren durumlarda daha önce kullanıcı izni reddedilmişse true dönmektedir.

Bu metodun geri dönüş değeri true ise programcı aşağıdaki gibi yazılmış bir metodu çağırabilir.

Uygulamanın daha önce reddetme tuşuna basılıp basılmadığı uygulamaya ilişkin veriler içinde saklanmaktadır. Bu veriler silindiğinde uygulama ilk olarak bu mesajı çıkartmayacaktır.

    public static void displayExplanation(Context context, final Activity activity, String title, String msg,
                                          final String permission, final int permReqCode)
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(context); 
        builder.setTitle(title).setMessage(msg).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                requestPermission(activity, permission, permReqCode);
            }
        });

        builder.create().show();
    }

requestPermission metodu çağrıldığında bir dialog penceresi çıkar. ve bu dialog penceresi onaylandığında onRequestPermissionResult metodu çağrılır.Bu metod izin alınacak activity sınıfında override edilmelidir.

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){}

Metodun

  1. parametresi RequestPermissiona geçirilen requestCode.
  2. parametresi RequestPermisson ile istenen izinlerin dizisi
  3. parametre ise izinlerin onaylanıp onaylanmadığına ilişkin dizi parametresidir.

Programcı bu metoda göre izinlere ilişkin gerekli işlemleri yapabilmektedir.

Çalışma zamanı sırasında izin gerektiren metodlara geçirelecek izin bilgileri Manifest.Permission.XXX şeklinde geçirilebilir.

Anahtar Notlar: Programcı isterse versiyon kontrolü yaparak düşük versiyonlar için hiç izin istemeyebilir.

[DROPBOX]089-ContactListContentProvidederPermissions

089-ContactListContentProvidederPermissions Ne İş Yapar? Daha önce yazılmış olan ContactList programını 6.0 a uygun hale getirmek için RuntimePermission eklendi. Örnekte hem ContactList erişimi hem de arama işlemi yapılmıştır.

ContactList'e Eleman Eklenmesi

Android işletim sisteminde rehbere bilgi eklemenin birden fazla yöntemi bulunmaktadır. Kişiler genel olarak contacts isimli bir programın ekleme arayüzüne alışıktırlar. Bunun için Contacts isimli bir program Android işletim sistemlerinde çalışmaktadır. Programcı isterse kendi uygulamasından Contacts uygulamasının ekleme activitysini başlatabilir. Her ne kadar ContactList e ekleme yapmak tehlikeli bir izin olarak görülsede Contacts uygulamasını kullanan uygulamanın bu izni almasına gerek yoktur. Zaten izni Contacts uygulaması almıştır.

Contacts Uygulaması ile Ekleme Yapılması

Contacts uygulaması ile ekleme yapan uygulama aslında gerçek eklemeyi yapmaz. Sadece Contacts uygulamasının ilgili Activitysine çeşitli bilgileri gönderir, ve bu Activity'nin başlatılmasını sağlar, geri kalan artık Contacts uygulamasının işidir.

Bir contact bilgisi içerisinde aslında çok fazla eleman tutmaktadır. Contacts uygulamasının ekleme Activity'sine ilişkin intent şu şekilde elde edilebilir.

Intent intent = new Intent(ContactsContract.Intents.Insert.ACTION);

Ham bir bilgi eklemek için Intent'e ilişkin setType metodu şu şekilde çaprılabilir.

intent.setType(ContactsContract.RawContants.CONTENT_TYPE);

Bu işlemlerden sonra putExtra metotları ile ilgili anahtaralara karşılık gelen değerler eklenecektir.

 intent.putExtra(ContactsContract.Intents.Insert.NAME, m_editTextName.getText().toString())
                .putExtra(ContactsContract.Intents.Insert.EMAIL, m_editTextEmail.getText().toString())
                .putExtra(ContactsContract.Intents.Insert.EMAIL_TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK)
                .putExtra(ContactsContract.Intents.Insert.PHONE, m_editTextPhone.getText().toString())
                .putExtra(ContactsContract.Intents.Insert.PHONE_TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_HOME);

ContactList'e ilişkin diğer bilgiler Android dökümanlarından elde edilebilir.

090-AddContactsWithContactsApp