Android 13位置权限问题

问题描述 投票:0回答:3

位置权限在 Android 13 上直接转到 isAnyPermissionPermanentlyDenied。它不会向用户请求权限。即使我也在设置中授予权限,它也会是 isAnyPermissionPermanentlyDenied。

 val permissions = ArrayList<String>()
        permissions.add(Manifest.permission.ACCESS_FINE_LOCATION)
        Dexter.withActivity(this).withPermissions(permissions)
            .withListener(object : MultiplePermissionsListener {
                override fun onPermissionsChecked(report: MultiplePermissionsReport) {
                    when {
                        report.areAllPermissionsGranted() -> {
                            checkAppUpdate()
                        }
                        report.isAnyPermissionPermanentlyDenied -> {
                            startActivity(
                                Intent(
                                    Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
                                    Uri.parse("package:" + BuildConfig.APPLICATION_ID)
                                )
                            )
                        }
                        else -> {
                            checkPermission()
                        }
                    }

                }

                override fun onPermissionRationaleShouldBeShown(
                    permissions: List<PermissionRequest>,
                    token: PermissionToken
                ) {
                    token.continuePermissionRequest()
                }
            }).onSameThread().check()
android android-permissions android-13
3个回答
2
投票

首先请求粗略位置许可。

并且仅当用户允许要求 FINE 时。


1
投票

首先,Dexter 不再处于主动维护状态,我不建议您在 Android 13 上使用它。新方法也更加直接

示例:

    private val permissionList = arrayOf(
        Manifest.permission.READ_CONTACTS,
        Manifest.permission.WRITE_CONTACTS,
        Manifest.permission.CALL_PHONE
    )

    private val activityResultLauncher =
        registerForActivityResult(RequestMultiplePermissions()) { permissions ->
            if (!permissions.values.contains(false)) {
//                contactsProvider.addMockContactList()
                permissionState.value = true
                Log.d(TAG, "activityResultLauncher")
            }
        }
    private fun checkPermissions() {
        val hasPermission = permissionList.all {
            checkSelfPermission(it) == PackageManager.PERMISSION_GRANTED
        }
        Log.d(TAG, "checkPermissions")
        if (!hasPermission) {
            activityResultLauncher.launch(permissionList)
        } else {
            getContactList()
            permissionState.value = true
        }
    }

其次,要获取位置信息,您需要两个权限:

ACCESS_COARSE_LOCATION
ACCESS_FINE_LOCATION
。由于精定位依赖于粗定位,所以每次都会立即撤销。


0
投票

对我有用的是,另一个依赖项是添加 maxSdk 版本,这反过来又拒绝权限,甚至不显示对话框。我建议您在底部选项卡中检查您的 Android 清单文件,查找合并清单并查看您的使用权限。如果您发现任何 maxSdk,请在权限结束时使用此命令将其删除。 例如我用过:

 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:remove="android:maxSdkVersion" />

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:remove="android:maxSdkVersion" />

© www.soinside.com 2019 - 2024. All rights reserved.