getActivity / XXPermissions

Android 权限请求框架,已适配 Android 14
Apache License 2.0
5.86k stars 788 forks source link

索尼Android 12手机定位权限never字段返回值错误 #154

Closed LuoPeiQin closed 2 years ago

LuoPeiQin commented 2 years ago

问题描述

  1. 打印never值,为true D/BleTestActivity: onClick: 请求定位权限 D/BleTestActivity: onDenied: android.permission.ACCESS_FINE_LOCATION D/BleTestActivity: onDenied: never D/BleTestActivity: onGranted: checkLocationPermission

  2. 打印shouldShowRequestPermissionRationale结果

    val coarseResult = shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_COARSE_LOCATION)
                val fineResult = shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)
                Log.d(TAG, "requestLocationPermission: ACCESS_COARSE_LOCATION = $coarseResult")
                Log.d(TAG, "requestLocationPermission: ACCESS_FINE_LOCATION = $fineResult")

D/BleTestActivity: requestLocationPermission: ACCESS_COARSE_LOCATION = false D/BleTestActivity: requestLocationPermission: ACCESS_FINE_LOCATION = false

请回答

getActivity commented 2 years ago
image

小伙子,你同时请求了精确和模糊的定位权限,但是授权的时候只给了模糊定位权限,那么肯定会导致跳过精确定位权限申请,间接导致精确定位权限授权失败,至于为什么 never 会为 true,这是因为 shouldShowRequestPermissionRationale 返回的是 false,不需要向用户弹窗解释该权限的用途(永久拒绝了该权限),当然这个 API 也有缺陷,当用户没有授权过该权限时,这个 API 会默认返回 false,而不是 true,从而会导致框架误判,这个问题暂时无解,如果你有好的解决方案欢迎提供给我。

LuoPeiQin commented 2 years ago

嗯,这里我看过Google官方的说明,google不愿意提供明确的api调用来never的结果,避免大家引导用户跳转到设置页。所以shouldShowRequestPermissionRationale不太好用,是否可以考虑底层做一个存储,只有申请的权限shouldShowRequestPermissionRationale出现了true之后,再出现false才判断为never?可行吗?

getActivity commented 2 years ago

嗯,这里我看过Google官方的说明,google不愿意提供明确的api调用来never的结果,避免大家引导用户跳转到设置页。所以shouldShowRequestPermissionRationale不太好用,是否可以考虑底层做一个存储,只有申请的权限shouldShowRequestPermissionRationale出现了true之后,再出现false才判断为never?可行吗?

小伙子,那你有没有考虑过以下几个场景:

  1. 用户第一次安装完应用后,并没有直接打开,而是跑到应用设置中将某个权限禁用掉,然后再从手机桌面打开,此时 shouldShowRequestPermissionRationale 的返回值为 false,加上本地没有存储过任何 shouldShowRequestPermissionRationale 的返回值为 true 的情况,会导致框架会告诉外层调用的人,用户没有永久拒绝,但是实际用户已经永久拒绝

  2. 开发者首次接入 XXPermissions,但是在此之前,用户已经永久拒绝过应用的某个权限,结果一申请自然是会被系统立马回绝,此时 shouldShowRequestPermissionRationale 的返回值为 false,加上本地没有存储过任何 shouldShowRequestPermissionRationale 的返回值为 true 的情况,会导致框架会告诉外层调用的人,用户没有永久拒绝,但是实际用户已经永久拒绝

getActivity commented 2 years ago

理想很丰满,现实很骨感,这种想法存在诸多逻辑漏洞,整体流程是走不通的。

SerBad commented 2 years ago

我的Android12也遇到了这个问题,只要选了每次询问权限,就再也进不去了

LuoPeiQin commented 2 years ago

这一块的判断确实有点麻烦,这么一来的话,这个never的判断就变得不可靠了

getActivity commented 2 years ago

@SerBad @LuoPeiQin 对于这一块确实暂时没有想到什么好办法,如果有的话欢迎提供给我,如果没有的话只能关闭 issue 了。

getActivity commented 1 year ago

嗯,这里我看过Google官方的说明,google不愿意提供明确的api调用来never的结果,避免大家引导用户跳转到设置页。所以shouldShowRequestPermissionRationale不太好用,是否可以考虑底层做一个存储,只有申请的权限shouldShowRequestPermissionRationale出现了true之后,再出现false才判断为never?可行吗?

image

官方文档地址:请勿永久存储权限状态