首先贴一下代码(主要代码):

public class FriendFragment extends BaseFragment......//申请权限if (permissions.length > 0) {ActivityCompat.requestPermissions(getActivity(), permissions,Constant.REQ_SCAN_ALL_PER);return;}

里面的BaseFragment是我自己实现的,其继承了Fragment。

然后是onRequestPermissionsResult的代码:
在这里插入图片描述
为了验证是否被调用,我在函数进入的时候加了Log,然后试了多次发现无法调用,于是百度:
很容易能找到一种解决方案:参考博客
Android onRequestPermissionsResult在Fragment中不执行的问题_第1张图片
这种方案我没有尝试,但是我认为是可行的,不过我找到了更好的解决方案。

解决方案:
Read The Fuck Source Code:
Ctrl+鼠标右键进入Fragment的源码界面,然后Ctrl+F:搜索Permission
Android onRequestPermissionsResult在Fragment中不执行的问题_第2张图片

重大发现:

  • Fragment里是有requestPermission和onRequestPermissionResult两个方法的,我在上面调用requestPermission的时候:Android onRequestPermissionsResult在Fragment中不执行的问题_第3张图片
  • 是调用的ActivityCompat的requestPermissions()方法,所以导致onRequestPermissionResult无法被调用,修改代码:
    Android onRequestPermissionsResult在Fragment中不执行的问题_第4张图片
  • 然后成功:
    Android onRequestPermissionsResult在Fragment中不执行的问题_第5张图片
  • 还需要总结一下:看Fragment的源码里的requestPermissions里的代码:
        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);        }    }
    this.mHost…,这里的mHost是一个和本Fragment相关的Activity的一个回调,看上面的throw语句就知道其含义是什么。
  • 也就是说,在Fragment里调用requstPermissions其实还是调用的与其绑定的活动的requestPermissions,很显然这种方法要比上文中提到的另外一篇博客的解决方案要好,因为另外一种解决方案明显是在兜圈子。

总结一下经验:

  1. 写程序总是在不断的踩坑,当然踩了坑就去百度,这是很好的,但是还需要掌握一些比较底层的解决问题的思维,比如Read The Fuck Source Code。
  2. 另外需要注意的是Fragment是绑定在Activity里的,很多事件都是通过Activity来实现的,但是Fragment里也提供了一些调用,具体有哪些请Read The Fuck Source Code。
  3. 百度到东西以后不要用上就完事了,得去研究其底层的原理。

更多相关文章

  1. Android 保存图片到系统相册
  2. android 绘画网格图片
  3. android典型代码系列(二)------sqlite数据库操作高级
  4. android 代码设置、打开/关闭wifi热点及热点的连接、状态查询监
  5. [置顶] Android输入法之——在代码中强制切换和获得当前输入法
  6. 代码中修改TextView的DrawableLeft图片
  7. Android简易音乐播放器实现代码

随机推荐

  1. Android中使用CountDownTimer实现Button
  2. Android 3.0 r1 API中文文档(105) —— V
  3. 关于Android Studio里的Gradle文件
  4. React Native 官方文档中文版(含最新Andr
  5. Android中使用Dialog风格弹出框的Activit
  6. android SQLite应用
  7. IBM详解 Android 的 Activity 组件
  8. Android(安卓)Spinner点击选中Item不再调
  9. Android Framework中JNI调用
  10. Android - 私有库项目创建及发布