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.
- 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.
Ç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
- parametresi RequestPermissiona geçirilen requestCode.
- parametresi RequestPermisson ile istenen izinlerin dizisi
- 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