我正在实现应用程序权限流使用地理位置。我请求ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION的requestPermissions()在一个片段。
requestPermissions(
arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION),
PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION
)
companion object {
private const val PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1
:
}
并且我收到了Fragment中onRequestPermissionsResult()的请求权限结果。
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
when (requestCode) {
PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION -> {
if (grantResults.isNotEmpty() &&
grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// User granted permission in system dialog
} else {
// User denied permissions
}
}
}
}
但是onRequestPermissionsResult()奇怪地只收到了一个权限,即第二个参数中的ACCESS_COARSE_LOCATION作为permissions: Array。即使在系统对话框中选择允许,checkSelfPermission()也会返回false。
// this condition returns false after receiving permission result on onRequestPermissionsResult()
ContextCompat.checkSelfPermission(requireContext(),
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission(requireContext(),
Manifest.permission.ACCESS_COARSE_LOCATION) {
}
我想知道为什么onRequestPermissionsResult()只收到ACCESS_COARSE_LOCATION作为结果,即使我请求多个权限通过给数组ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION当我调用requestPermissions()。
你能解释一下为什么权限请求只返回单个权限结果吗?
提前感谢您的帮助。
ACCESS_FINE_LOCATION
只需要使用单个权限。你不需要两者都用。因为您的请求权限ACCESS_FINE_LOCATION
包含ACCESS_FINE_LOCATION
和ACCESS_COARSE_LOCATION
。
https://developer.android.com/training/location/retrieve-current许可对于处理多个权限,我强烈推荐下面的库完美地处理每个场景。
Dexter:com.karumi:dexter:6.#.#
对于多个权限,您可以使用:
Dexter.withContext(this)
.withPermissions(
Manifest.permission.CAMERA,
Manifest.permission.READ_CONTACTS,
Manifest.permission.RECORD_AUDIO
).withListener(new MultiplePermissionsListener() {
@Override public void onPermissionsChecked(MultiplePermissionsReport report) {/* ... */}
@Override public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {/* ... */}
}).check();
好运