首页 > 解决方案 > 用户权限检查仅在安装后第一次有效

问题描述

我的应用程序仅在安装应用程序后第一次显示权限对话框。如果我关闭它并再次打开,它不会显示请求窗口。即使我在 clickEvent 上手动禁用位置权限或请求权限窗口,它也不起作用。

检查权限:

private fun checkPermission(){
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        //permission not granted

        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                        Manifest.permission.ACCESS_COARSE_LOCATION)) {
            //show an explanation to the user
        } else {
            //request the permission
            ActivityCompat.requestPermissions(this,
                    arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION),
                    ACCESS_COARSE_LOCATION_CODE)
        }
    } else {
        ActivityCompat.requestPermissions(this,
                arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION),
                ACCESS_COARSE_LOCATION_CODE)
    }
}

onRequestPermissionsResult:

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    when(requestCode){
        ACCESS_COARSE_LOCATION_CODE -> {
            if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                //granted
            } else {
                //denied
            }
            return
        }
    }
}

当我点击图标时,我调用checkPermission函数。onStart

标签: androidkotlinpermissionsuser-permissions

解决方案


您将shouldShowRequestPermissionRationale部分留空,因此它不会第二次请求许可。在其中显示一个警报对话框,为什么您需要许可,当用户单击“确定”时再次请求许可。作为替代,您可以直接再次请求许可。

private fun checkPermission(){
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        //permission not granted

        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                        Manifest.permission.ACCESS_COARSE_LOCATION)) {
             ActivityCompat.requestPermissions(this,
                arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION),
                ACCESS_COARSE_LOCATION_CODE)
        } else {
            //request the permission
            ActivityCompat.requestPermissions(this,
                    arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION),
                    ACCESS_COARSE_LOCATION_CODE)
        }
    } else {
        ActivityCompat.requestPermissions(this,
                arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION),
                ACCESS_COARSE_LOCATION_CODE)
    }
}

您没有正确处理拒绝并且不再次询问案例,我建议您使用库为简单起见。您将在一个地方收到所有回电

  Permissions.check(this, Manifest.permission.ACCESS_COARSE_LOCATION, null, new PermissionHandler() {
    @Override
    public void onGranted() {
        // do your task.
    }
});

推荐阅读