android - 用户权限检查仅在安装后第一次有效
问题描述
我的应用程序仅在安装应用程序后第一次显示权限对话框。如果我关闭它并再次打开,它不会显示请求窗口。即使我在 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
解决方案
您将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.
}
});
推荐阅读
- airflow - 在谷歌云作曲家中创建一个 image_pull_secrets
- sql - 如何使用sql从oracle中的时间戳生成登录记录?
- javascript - 使用 JavaScript 访问文件的 URL 参数
- winapi - 您如何在独占模式下使用 WASAPI?
- docker - docker build 期间不允许操作
- c - C中的随机十六进制
- python - 使用 cv2 和 Python 在图像中进行对象检测
- r - 将模型摘要转换为数据框
- flutter - 如何在飞镖中将字符串转换为日期时间?
- javascript - 通过返回 1 或 0 或 -1 来对数组进行排序(如果它返回这些值) sort 函数如何决定首先放置哪个