İzinler için basit çözüm!
Nis 16, 2022hamurcuabi
0 Yorum
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 olmayacak
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!
android bestpractice kotlin permissions