本文转载自道招网的# Android在fragment中恳求权限后onRequestPermissionsResult没有被履行

Android上有的权限需求手动恳求权限的,比方android.permission.READ_CONTACTS

即便你在AndroidManifest.xml中现已声明了也不可

<uses-permission android:name="android.permission.READ_CONTACTS" />

问题原因

这是android6.0以后的要求,要求程序自行手动恳求权限。

场景示例

比方我的应用点击某个按钮之后需求读取联系人列表,待用户挑选某个详细联系人后需求读取该联系人的电话号码,这步操作是需求android.permission.READ_CONTACTS权限的。

咱们需求在履行到必要步骤时判断是否具有权限,没有的话让用户授权

 if (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.READ_CONTACTS)) {
   // 直接履行
 } else {
   // 恳求用户授权
}

实践进程

在网上很多文章也给的方式是这样的

ActivityCompat.requestPermissions(this.getActivity(), arrayOf(Manifest.permission.READ_CONTACTS), MY_PERMISSIONS_REQUEST_READ_CONTACTS);

很多人这么写也完成了手动恳求权限了,但是我今天试了下不可,出现问题了,那就是**onRequestPermissionsResult**回调没有履行,弹出恳求权限弹窗并授权后,无法拿到用户的授权成果。

Android在fragment中请求权限后onRequestPermissionsResult没有被执行

拿不到授权成果的话,用户只能再次点击按钮,此时检测到有权限了,能够直接履行了。 但是这也太傻了吧。

继续在网上寻找解决方案,有的网友的意思是fragment地点的Activity的onRequestPermissionsResult回调才会履行,fragment的不会,测验发现果然是Activity的回调履行了,那岂不是我需求把这部分授权后的履行逻辑全部从fragment中移到Activity了啊,不爽啊。

结论

继续搜索后发现,本来在fragment场景里用这种写法是不对的。

在fragment中不应该ActivityCompat.requestPermissions的方式来恳求权限,fragment自身就有办法来做到这一点,直接用requestPermissions办法即可,该办法比较ActivityCompat.requestPermissions不需求Activity实例了,使用起来更简单了。

详细代码这么写就行了

requestPermissions(
            arrayOf(Manifest.permission.READ_CONTACTS),
            MY_PERMISSIONS_REQUEST_READ_CONTACTS
)

咱们能够测验进一步测验下,假如fragment和Activity中都有requestPermissions呢?是只履行其间一个,还是两个都履行?假如两个都履行,它们的履行顺序是怎样的?

实测发现在fragment中用requestPermissions恳求权限时,会先履行该fragment的 onRequestPermissionsResult回调,然后之前该fragment地点的Activity的onRequestPermissionsResult回调。