道招

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

如果您发现本文排版有问题,可以先点击下面的链接切换至老版进行查看!!!

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回调没有执行,弹出申请权限弹窗并授权后,没法拿到用户的授权结果。

file

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

继续在网上寻找解决方案,有的网友的意思是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回调。

更新时间:
上一篇:java.lang.ClassCastException: androidx.appcompat.app.ToolbarActionBar cannot be cast to androidx.appcompat.widget.Toolbar下一篇:android运行时授权读取短信后仍收不到短信

相关文章

Android将Activity迁移到Fragment,this变了,原来的context、activity怎么办

刚开始学习android的时候,一般都是用的Activity,用Activity的话,基本什么都不缺,后面看到了Fragment,它是主要用来搞UI的,它比Activity更轻量,所以准备把之前写在 阅读更多…

关注道招网公众帐号
友情链接
消息推送
道招网关注互联网,分享IT资讯,前沿科技、编程技术,是否允许文章更新后推送通知消息。
允许
不用了