位置权限在 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()
首先请求粗略位置许可。
并且仅当用户允许要求 FINE 时。
首先,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
。由于精定位依赖于粗定位,所以每次都会立即撤销。
对我有用的是,另一个依赖项是添加 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" />