Android --- 动态获取定位权限时: Fragment 中 onRequestPermissionsResult 方法不执行

今天我在写百度地图 API 定位功能的时候遇到了这样一个问题,需要在打开 APP 首页的时候动态获取定位权限,然后我的代码是这样写的(在 Fragment 中)


 @Nullable
    public View onCreateView(@NonNull LayoutInflater inflater,
                             @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {

        view = inflater.inflate(R.layout.fragment_home,container,false);
        Request();
        return view;

    }
	void Request() { // 动态获取权限方法
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ContextCompat.checkSelfPermission(getContext(),Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 200); // 200 是回调识别码
            }else {
                //开始定位
                initLocation();
            }
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode){
            case 200: // 刚才的识别码
                if(grantResults[0] == PackageManager.PERMISSION_GRANTED){ // 用户同意权限,执行我们的操作
                    initLocation(); // 开始定位
                }else{ // 用户拒绝之后,当然我们也可以弹出一个窗口,直接跳转到系统设置页面
                    Toast.makeText(getActivity(),"未开启定位权限,请手动到设置去开启权限",Toast.LENGTH_LONG).show();
                }
                break;
            default:break;
        }
    }

然而 onRequestPermissionsResult 方法并没有回调,没有回调的话,我就不能执行定位方法,原因是

在Fragment中我们不能通过ActivityCompat.requestPermissions去请求,因为这样请求Fragment不能收到onRequestPermissionsResult。所以我们应该直接用XXXFragment.this.requestPermissions去请求权限

如果你写了 ActivityCompat.requestPermissions 那么你的回调方法就要写到 Activity 中,我自己不信,就把 onRequestPermissionsResult 放到了 fragment 的父 Activity 中,果然,在 Activity 中回调了。

多谢博主指点:https://blog.csdn.net/z302766296/article/details/73549807

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 Uniapp ,你可以通过 uni-app 官方提供的 API 来判断和申请定位权限。以下是一个示例代码: ```javascript // 判断用户是否已授权地理位置信息 uni.getSetting({ success: res => { if (res.authSetting['scope.userLocation'] === undefined) { // 用户未授权,需要申请授权 uni.authorize({ scope: 'scope.userLocation', success() { // 授权成功,可以进行定位操作 getLocation() }, fail() { uni.showToast({ title: '授权失败,无法进行定位', icon: 'none' }) } }) } else if (res.authSetting['scope.userLocation'] === false) { // 用户已拒绝授权,需要引导用户去授权设置页开启定位权限 uni.showModal({ title: '提示', content: '请在设置页面授权使用定位功能', confirmText: '去设置', success: function (res) { if (res.confirm) { uni.openSetting() } } }) } else { // 用户已授权,可以进行定位操作 getLocation() } } }) ``` 在上述代码,我们首先通过 `uni.getSetting()` 方法获取用户的授权信息。如果用户未授权,则调用 `uni.authorize()` 方法申请授权;如果用户已拒绝授权,则引导用户去设置页面授权;如果用户已授权,则可以进行定位操作。 需要注意的是,申请定位权限前,你需要在 `manifest.json` 文件声明相关权限: ```json { "mp-weixin": { "permission": { "scope.userLocation": { "desc": "获取用户位置信息" } } } } ``` 如果是在 H5 等非小程序环境下开发,则需要根据相应的开发环境和平台进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁同学与Android

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值