【问题标题】:Request multiple permissions by requestPermissions() but onRequestPermissionsResult receives only single permission result通过 requestPermissions() 请求多个权限,但 onRequestPermissionsResult 仅接收单个权限结果
【发布时间】: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 数组来请求多个权限。

能否请您解释一下为什么权限请求只返回单个权限结果?

提前感谢您的帮助。

【问题讨论】:

    标签: android permissions location


    【解决方案1】:

    您只需对ACCESS_FINE_LOCATION 使用单一权限。您不需要同时使用两者。因为您的请求权限ACCESS_FINE_LOCATION 包含ACCESS_FINE_LOCATIONACCESS_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() 结果只包含单个权限。谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2017-02-09
    • 1970-01-01
    • 2017-06-19
    • 2017-03-20
    相关资源
    最近更新 更多