类内的 onRequestPermissionsResult 在 android jetpack compose 中不起作用

onRequestPermissionsResult inside a class is not working in android jetpack compose

提问人:Karthik 提问时间:6/23/2023 更新时间:6/23/2023 访问量:107

问:

嗨,我是 android 和 jetpack compose 的新手。 我有一个类“PermissionHandler”来处理 android 应用程序的权限请求。它由“AppCompatActivity”类扩展。我可以请求许可。但是,在选择选项时,不会调用被覆盖的函数“onRequestPermissionsResult”。

下面是课程>>

class PermissionHandler(context: Activity): AppCompatActivity(){

    private val context: Activity = context
    private lateinit var permissionClass: String
    private lateinit var alertBody: String
    private lateinit var toastMessage: String

    companion object {
        const val PERMISSION_REQ_CODE = 100
    }

    private fun checkPermission(): Boolean{
        return (ContextCompat.checkSelfPermission(context, permissionClass) == PackageManager.PERMISSION_GRANTED)
    }

    private fun checkPermissionRationale(): Boolean{
        return ActivityCompat.shouldShowRequestPermissionRationale(context, permissionClass)
    }

    private fun requestPermission(){
        ActivityCompat.requestPermissions(context, arrayOf(permissionClass), PERMISSION_REQ_CODE )
    }

    @Composable
    fun ShowPermissionExplanation(){
        val alertInput = remember { mutableStateOf(false) }
        if(!alertInput.value) {
            AlertExplanation(
                title = "Permission Needed",
                body = alertBody
            ) { value -> alertInput.value = value }
        } else {
            requestPermission()
        }
    }

    @Composable
    fun CheckAndReqPermission(
        permissionName: String,
        permissionValue: (Boolean) -> Unit
    ){
        permissionClass = permissionName
        alertBody = "The app requires ${permissionClass.split('.')[2]} permission for particular feature to work as expected"
        toastMessage = "Please allow ${permissionClass.split('.')[2]} permission to the APP."

        if(checkPermission()){
            permissionValue(true)
        } else if (checkPermissionRationale()){
            ShowPermissionExplanation()
        }else{
            requestPermission()
            Toast.makeText(context, toastMessage, Toast.LENGTH_SHORT).show()
            permissionValue(false)
        }
    }

    
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        Log.d("permission result", grantResults.toString())
        Log.d("permission result", "checking Log if the callback is happedning or not")

    }
}

类对象只是从可组合的函数中调用的>>

@Composable
fun CheckBluetoothPermission(context: Activity) {

    val permissionValue = remember{ mutableStateOf(false) }
    val permissionHandler = PermissionHandler(context = context)
    permissionHandler.CheckAndReqPermission(AppPermission.ACCESS_FINE_LOCATION.permission) { value ->
        permissionValue.value = value
    }

我希望当用户选择以下任何选项时触发回调函数“onRequestPermissionsResult>>enter image description here

回调 android-jetpack-compose android-permissions 扩展

评论


答:

1赞 Hossein Shahmohammadi 6/23/2023 #1

您应该使用 rememberLauncherForActivityResult 及其回调来对“onRequestPermissionsResult”的相同功能

我认为这个答案能够帮助您:如何使用 Jetpack Compose 请求权限?