Android Dersleri – 29 – RunTimePermission Kullanımı

By | 30 Temmuz 2020

Android Dersleri serimizin RunTimePermission Kullanımı dersine hoş geldiniz. Bu dersimizin asıl amacı Android 6.0 (API23) ile beraber gelen izin alma şeklidir. Android 6.0’dan önce izinler, uygulama cihaza yüklenirken isteniyordu. Eğer izinleri vermezseniz uygulamayı da yükleyemiyordunuz. Şöyle bir örnek verelim. Basit bir flaş uygulamasını indirirken sizden istediği izinler şöyle olsun; rehbere erişim, arama izni, sms izni, dosyalara erişim izni vb. Böyle bir durumda uygulamayı kullanmak isteseniz de basit bir flaş uygulamasının bu izinlerini kabul etmeden kuramazdınız. Bu güvenlik açısında büyük tehlike.
Android 6.0 ile beraber bu sistem değişti. İndirdiğiniz uygulamada rehbere erişim izni gerektiğinde izin soruluyor vermezseniz o alanı kullanamazsınız. Ama diğer alanlarda istediğiniz gibi takılabilirsiniz. Kısacası uygulamanın içinde nereyi kullanacaksanız yalnızca o alanla ilgili izin isteniyor.

Bir önceki dersimizde Manifest dosyasından ve az da olsa izinlerden bahsetmiştik. Gerekli izinleri manifest dosyasında belirtmemiz gerek. İşte burada izinler normal ve tehlikeli olmak üzere ikiye ayrılır. Normal izinler için manifest dosyasında izni belirtmek yeterli ama tehlikeli izinler için kullanıcıdan izin almak gerek. Tehlikeli izinleri şöyle tanımlayabiliriz. “Kullanıcının kişisel verilerine erişim sağlanıyorsa bu tehlikeli izinlerdendir(rehber, kamera, dosyalar vb). Bunun dışındakiler de normal izinlerdir.”

Hadi şimdi runtimePermission Kullanımını görelim. Şöyle bir örneğimiz olsun. Ekranın tam ortasında bir butonumuz bulunsun. Bu butona tıklandığında izin istensin. Yapacağımız uygulamanın tasarım ve çıktıları;

Öncelikle manifest dosyası içinde aşağıdaki izni belirtmemiz gerek.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

activity_main.xml dosyası;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:background="#123"
    tools:context=".MainActivity">

    <Button
        android:onClick="btn_izin_al"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/btn_bg"
        android:textColor="@android:color/white"
        android:textSize="16sp"
        android:text="Çalışma Zamanlı İzin Al" />

</LinearLayout>

Butonumuz için güzel bir tasarım hazırladım. Bunu btn_bg dosyasından çekiyoruz. Button Dizayn dersinde bunları nasıl yapacağımızı öğrenmiştik zaten.

btn_bg.xml dosyası;

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
    <corners
        android:radius="14dp"
        />
    <gradient
        android:angle="45"
        android:centerX="30%"
        android:centerColor="#7308A8"
        android:startColor="#FD042A"
        android:endColor="#EF9F00"
        android:type="linear"
        />
    <padding
        android:left="0dp"
        android:top="0dp"
        android:right="0dp"
        android:bottom="0dp"
        />
    <size
        android:width="270dp"
        android:height="80dp"
        />
    <stroke
        android:width="3dp"
        android:color="#A5A7AC"
        />
</shape>

MainActivity.java dosyası;

package com.mrcaracal.runtimepermission;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // Butona tıklandığında yapılacak işlemler
    public void btn_izin_al(View view) {
        // İstenen izin verilmişse if bloğu çalışacaktır
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){
            Toast.makeText(this, "Zaten İzin Verilmiş", Toast.LENGTH_SHORT).show();
        }else {
            // İstenen izin verilmemişse izinAl metodu çağrılacak
            izinAl();
        }
    }

    private void izinAl() {
        // Daha önce kullanıcıdan izin istenmiş ama reddedilmişse if bloğu çalışacak
        // Burada iznin neden istendiği kısaca kullanıcıya anlatılmaya çalışılır
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_EXTERNAL_STORAGE)){
            new AlertDialog.Builder(this)
                    .setTitle("Neden?")
                    .setMessage("Uygulamanın istediğiniz eşkilde çalışması için bazı izinlere ihtiyacı var. Bu izinler olmadan uygulama çalışamaz.")
                    .setPositiveButton("TAMAM", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            // Kullanıcının TAMAM'a basması durumunda iznin neden istendiğini anlamış olacağından tekrardan izni isteme penceresi çıkacaktır
                            // Parametre olarak en sona 1 değerini verdik. Bu izne verdiğimiz bu değer sayesinde kontrol işlemi yapabiliyoruz. Bu kontrolü aşağıdaki onRequestPermissionsResult metodu içinde yapıyoruz.
                            ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.READ_EXTERNAL_STORAGE},1);
                        }
                    })
                    .setNegativeButton("HAYIR", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            // Kullanıcının HAYIR'a basması durumunda izin bu bilgilendirici pencereden çıkacaktır
                            dialogInterface.dismiss();
                        }
                    })
                    .create()
                    .show();
        }else {
            // Daha önceden kullanıcıdan herhangi bir izin istenmemişse çalışacak olan kısımdır
            ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.READ_EXTERNAL_STORAGE},1);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        if (requestCode == 1){
            // İzin verilmesi durumunda if bloğu çalışacaktır
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                Toast.makeText(this, "İzin Verildi", Toast.LENGTH_SHORT).show();
            }else {
                // İzin verilme ise çalışacak olan kısımdır
                Toast.makeText(this, "İzin Verilmedi", Toast.LENGTH_SHORT).show();
            }
        }

    }
}

Kodların içinde açıklanması gerekli alanlar yorum satırı olarak anlatılmıştır. Uygulamanın çalışır hali için en kısa zamanda bir video eklenecektir. Videoda Logcat kullanarak uygulamanın algoritmik yapısını kavramış olacaksınız.

RunTimePermission Kullanımı hakkında anlatacaklarım şimdilik bu kadar. Bir sonraki der

One thought on “Android Dersleri – 29 – RunTimePermission Kullanımı

  1. Pingback: Android Dersleri - 30 - SmsManager Kullanımı - Mr. Caracal

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir