İzinler için basit çözüm!

Nis 16, 2022
hamurcuabi

0 Yorum
934

Yazımızın inglizcesini buradan bulabilirsiniz.
Hiç yalnızca izinler için bir kitaplık kullanmanıza gerek duydunuz mu? En popüler cevap EVET'tir, ancak artık ihtiyacınız olmayacakcool


Uygulamanız Android 6.0 (API düzeyi 23) veya sonraki bir sürümü çalıştıran bir cihaza yüklendiyse, çalışma zamanında tehlikeli izinleri istemeniz gerekir. Bunu yapabilecek çok sayıda kütüphane var ama hepsini unutun bugün biz halledeceğiz :)

Önce manifest dosyasında izinleri bildirmeli, ardından istekte bulunmalıyız.
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
registerForActivityResult kullanarak hızlı bir şekilde istekte bulunmanın kolay yolunu kullanabiliriz ama sanırım burada eksik bir kısım var. Kullanıcı izni kalıcı olarak reddettiyse, bu yöntem bunu kapsamaz. Bize yalnızca verilen veya reddedilen durumları verir. Endişelenme, ekstra bir durum ekleyip çözeceğiz!
// Define a permission request
private val cameraPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
   if(granted){
   }
}

//launch it
 cameraPermission.launch(android.Manifest.permission.CAMERA)
Kullanıcı bir izni kalıcı olarak reddederse bunu nasıl anlarız?
İstek yapmak işin kolay kısmıydı, ancak kullanıcı tıkladığında kalıcı olarak reddederse, istek açılır penceresi bir daha asla gösterilmez. Gerekirse kullanıcıyı ayarlar sayfasına yönlendirmeliyiz. Her şeyden önce, iznin kalıcı olarak reddedilip reddedilmediğini bilmeliyiz.
// Activity and the permission is needed
val isPermanentluDenied= shouldShowRequestPermissionRationale(activity, android.Manifest.permission.CAMERA)

Kodları göster artık!

import android.app.Activity
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat.shouldShowRequestPermissionRationale
import androidx.fragment.app.Fragment

object PermissionUtil {

    @JvmInline
    value class Permission(val result: ActivityResultLauncher<Array<String>>)

    sealed class PermissionState {
        object Granted : PermissionState()
        object Denied : PermissionState()
        object PermanentlyDenied : PermissionState()
    }

    private fun getPermissionState(
        activity: Activity?,
        result: MutableMap<String, Boolean>
    ): PermissionState {
        val deniedList: List<String> = result.filter {
            it.value.not()
        }.map {
            it.key
        }

        var state = when (deniedList.isEmpty()) {
            true -> PermissionState.Granted
            false -> PermissionState.Denied
        }

        if (state == PermissionState.Denied) {
            val permanentlyMappedList = deniedList.map {
                activity?.let { activity ->
                    shouldShowRequestPermissionRationale(activity, it)
                }
            }

            if (permanentlyMappedList.contains(false)) {
                state = PermissionState.PermanentlyDenied
            }
        }
        return state
    }

    fun Fragment.registerPermission(onPermissionResult: (PermissionState) -> Unit): Permission {
        return Permission(
            this.registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
                onPermissionResult(getPermissionState(activity, it))
            }
        )
    }

    fun AppCompatActivity.registerPermission(onPermissionResult: (PermissionState) -> Unit): Permission {
        return Permission(
            this.registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
                onPermissionResult(getPermissionState(this, it))
            }
        )
    }

    fun Permission.launchSinglePermission(permission: String) {
        this.result.launch(arrayOf(permission))
    }

    fun Permission.launchMultiplePermission(permissionList: Array<String>) {
        this.result.launch(permissionList)
    }
}

Nasıl kullanırım ?

 // register permission on top of Fragment or Activity like below

   private val cameraPermission = registerPermission {
        onCameraPermissionResult(it)
    }

    private val storagePermission = registerPermission {
        onStoragePermissionResult(it)
    }
    
    
    // Launch it in any where you want
    
    //Single
    cameraPermission.launchSinglePermission(android.Manifest.permission.CAMERA)

    // Multiple
   storagePermission.launchMultiplePermission(
            arrayOf(
                android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
                android.Manifest.permission.READ_EXTERNAL_STORAGE
            )
        )
    
    
    //Get result with state
    private fun onStoragePermissionResult(state: PermissionUtil.PermissionState) {
        when (state) {
            PermissionUtil.PermissionState.Denied -> {
                TODO()
            }
            PermissionUtil.PermissionState.Granted -> {
                TODO()
            }
            PermissionUtil.PermissionState.PermanentlyDenied -> {
                TODO()
            }
        }
    }

    //Get result with state
    private fun onCameraPermissionResult(state: PermissionUtil.PermissionState) {
        when (state) {
            PermissionUtil.PermissionState.Denied -> {
                TODO()
            }
            PermissionUtil.PermissionState.Granted -> {
                TODO()
            }
            PermissionUtil.PermissionState.PermanentlyDenied -> {
                TODO()
            }
        }
    }

Bu kadar basit! Artık bütün projelerinizde kütüphane olmadan izinler konusunu dert etmenize gerek yok ! Kendinize iyi bakınn!

 

via GIPHY

android bestpractice kotlin permissions

Benzer Yazılar


Yorumlar