1

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

 1 year ago
source link: https://www.daozhao.com/10847.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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回调。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK