通过 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_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() 结果只包含单个权限。谢谢

以上是关于通过 requestPermissions() 请求多个权限,但 onRequestPermissionsResult 仅接收单个权限结果的主要内容,如果未能解决你的问题,请参考以下文章

服务内 gps 的 requestPermissions()。错误:“位置提供程序需要 ACCESS_FINE_LOCATION 权限。”

Activity.requestPermissions 与 ActivityCompat.requestPermissions

requestPermissions在一个片段中

ActivityCompat.requestPermissions 未显示对话框

RequestPermissions 未显示对话框

Android 运行时权限流程:我可以使用 ActivityCompat.requestPermissions 发送额外内容吗?