通过 requestPermissions() 请求多个权限,但 onRequestPermissionsResult 仅接收单个权限结果
Posted
技术标签:
【中文标题】通过 requestPermissions() 请求多个权限,但 onRequestPermissionsResult 仅接收单个权限结果【英文标题】:Request multiple permissions by requestPermissions() but onRequestPermissionsResult receives only single permission result 【发布时间】:2021-05-07 06:44:26 【问题描述】:我正在实施应用权限流程以使用地理位置。我在 Fragment 中通过 requestPermissions() 请求了 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION。
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 作为权限:数组。 即使在系统对话框中选择允许,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 作为结果,即使我在调用 requestPermissions() 时通过提供 ACCESS_COARSE_LOCATION、ACCESS_FINE_LOCATION 数组来请求多个权限。
能否请您解释一下为什么权限请求只返回单个权限结果?
提前感谢您的帮助。
【问题讨论】:
【参考方案1】:您只需对ACCESS_FINE_LOCATION
使用单一权限。您不需要同时使用两者。因为您的请求权限ACCESS_FINE_LOCATION
包含ACCESS_FINE_LOCATION
和ACCESS_COARSE_LOCATION
。
https://developer.android.com/training/location/retrieve-current#Permission
为了处理多个权限,我强烈推荐以下库完美处理所有场景。
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();
祝你好运
【讨论】:
感谢您提供的信息。我尝试仅使用 ACCESS_FINE_LOCATION 请求权限,并且 onRequestPermissionsResult() 首先在第二个参数中收到 ACCESS_COARSE_LOCATION。之后,我再次使用 ACCESS_FINE_LOCATION 调用 requestPermissions(),然后 onRequestPermissionsResult() 收到 ACCESS_FINE_LOCATION 作为第二个参数。只有第二个权限请求和接收包括 ACCESS_FINE_LOCATION。我还不确定。谢谢 最后我意识到我的代码在我第一次发布的不同点只被请求单一权限。这就是为什么 onRequestPermissionsResult() 结果只包含单个权限。谢谢以上是关于通过 requestPermissions() 请求多个权限,但 onRequestPermissionsResult 仅接收单个权限结果的主要内容,如果未能解决你的问题,请参考以下文章
服务内 gps 的 requestPermissions()。错误:“位置提供程序需要 ACCESS_FINE_LOCATION 权限。”
Activity.requestPermissions 与 ActivityCompat.requestPermissions
ActivityCompat.requestPermissions 未显示对话框
Android 运行时权限流程:我可以使用 ActivityCompat.requestPermissions 发送额外内容吗?