Android fragment中 onRequestPermissionsResult不起作用

上一篇Android 动态获取权限中,在申请权限的时候需要onRequestPermissionsResult方法来判断时候开启权限,但是在Fragment使用过程中,需要获取摄像机权限出现这个方法不起作用的问题,找到两个解决方案。

一、宿主activity需要重写
在宿主activity中,一定要重写onRequestPermissionsResult并且带上下面这句话,不然fragment不回调onRequestPermissionsResult。

// Activity中
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
  {
       super.onRequestPermissionsResult(requestCode, permissions, grantResults);
       // 获取到Activity下的Fragment
       List<Fragment> fragments = getSupportFragmentManager().getFragments();
       if (fragments == null)
       {
           return;
       }
       // 查找在Fragment中onRequestPermissionsResult方法并调用
       for (Fragment fragment : fragments)
       {
           if (fragment != null)
           {
               // 这里就会调用我们Fragment中的onRequestPermissionsResult方法
               fragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
           }
       }
   }


申请权限的Fragment中重写onRequestPermissionsResult方法时,通过在Activity中遍历所有的Fragment中调用onRequestPermissionsResult方法,就是我们Fragment中重写的onRequestPermissionsResult方法:

// Fragment 中
@Override
public void onRequestPermissionsResult(final int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults)
{
    // TODO 写我们自己的处理逻辑
}


二、Fragment里面不使用activity申请权限
ActivityCompat.requestPermissions((AppCompatActivity)context, new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE)
一开始通过传递进来的context进行权限申请发现不能执行onRequestPermissionsResult,后面改成下面的直接申请,方法就能执行
 

requestPermissions(new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE);


参考代码文章
————————————————
版权声明:本文为CSDN博主「JUN_LLLL」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35988274/article/details/100068049

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 请求位置权限需要使用运行时权限。以下是在 Fragment 请求位置权限的基本步骤: 1. 在 AndroidManifest.xml 文件添加定位权限: ```xml <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ``` 2. 在 Fragment 重写 onRequestPermissionsResult() 方法: ```java @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_LOCATION_PERMISSION && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限已授予,执行相关操作 } } ``` 3. 在 Fragment 判断是否拥有位置权限: ```java if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // 未授予权限,请求授权 requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION_PERMISSION); } else { // 已授予权限,执行相关操作 } ``` 4. 在 onRequestPermissionsResult() 方法处理授权结果: ```java @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_LOCATION_PERMISSION && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限已授予,执行相关操作 } } ``` 注意:在 Android 6.0 及以上版本,还需要动态请求定位权限。可以使用 ActivityCompat.requestPermissions() 方法请求权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值