通过requestPermissions()请求多个权限,但onRequestPermissionsResult只接收到



我正在实现应用程序权限流使用地理位置。我请求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_LOCATIONACCESS_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();

好运

相关内容

  • 没有找到相关文章

最新更新