Android onRequestPermissionsResult在Fragment中不执行的问题
16lz
2021-01-23
首先贴一下代码(主要代码):
public class FriendFragment extends BaseFragment......//申请权限if (permissions.length > 0) {ActivityCompat.requestPermissions(getActivity(), permissions,Constant.REQ_SCAN_ALL_PER);return;}
里面的BaseFragment是我自己实现的,其继承了Fragment。
然后是onRequestPermissionsResult的代码:
为了验证是否被调用,我在函数进入的时候加了Log,然后试了多次发现无法调用,于是百度:
很容易能找到一种解决方案:参考博客
这种方案我没有尝试,但是我认为是可行的,不过我找到了更好的解决方案。
解决方案:
Read The Fuck Source Code:
Ctrl+鼠标右键进入Fragment的源码界面,然后Ctrl+F:搜索Permission
重大发现:
- Fragment里是有requestPermission和onRequestPermissionResult两个方法的,我在上面调用requestPermission的时候:
- 是调用的ActivityCompat的requestPermissions()方法,所以导致onRequestPermissionResult无法被调用,修改代码:
- 然后成功:
- 还需要总结一下:看Fragment的源码里的requestPermissions里的代码:
this.mHost…,这里的mHost是一个和本Fragment相关的Activity的一个回调,看上面的throw语句就知道其含义是什么。public final void requestPermissions(@NonNull String[] permissions, int requestCode) { if (this.mHost == null) { throw new IllegalStateException("Fragment " + this + " not attached to Activity"); } else { this.mHost.onRequestPermissionsFromFragment(this, permissions, requestCode); } }
- 也就是说,在Fragment里调用requstPermissions其实还是调用的与其绑定的活动的requestPermissions,很显然这种方法要比上文中提到的另外一篇博客的解决方案要好,因为另外一种解决方案明显是在兜圈子。
总结一下经验:
- 写程序总是在不断的踩坑,当然踩了坑就去百度,这是很好的,但是还需要掌握一些比较底层的解决问题的思维,比如Read The Fuck Source Code。
- 另外需要注意的是Fragment是绑定在Activity里的,很多事件都是通过Activity来实现的,但是Fragment里也提供了一些调用,具体有哪些请Read The Fuck Source Code。
- 百度到东西以后不要用上就完事了,得去研究其底层的原理。
更多相关文章
- Android 保存图片到系统相册
- android 绘画网格图片
- android典型代码系列(二)------sqlite数据库操作高级
- android 代码设置、打开/关闭wifi热点及热点的连接、状态查询监
- [置顶] Android输入法之——在代码中强制切换和获得当前输入法
- 代码中修改TextView的DrawableLeft图片
- Android简易音乐播放器实现代码