Android onRequestPermissionsResult在Fragment中不执行的问题

当在Android的Fragment中遇到onRequestPermissionsResult不执行的问题,通常解决方案是通过ActivityCompat请求权限。但这种方式可能导致该回调不被调用。正确做法是直接在Fragment中调用自身的requestPermissions方法,查看源码可以发现Fragment有自身的requestPermissions和onRequestPermissionResult,理解其内部机制对于解决问题至关重要。踩坑后不仅要学会百度,更要深入理解底层原理。
摘要由CSDN通过智能技术生成

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

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

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() 方法请求权限
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值