You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

授予运行时定位权限后位置更新失效问题求助

问题分析与解决方案

嘿,我仔细看了你的代码,问题核心在于权限请求是异步操作,而你的GoogleApiClient在onStart阶段就直接尝试连接了。当用户在权限弹窗点击"允许"时,GoogleApiClient已经完成了第一次连接,但此时权限还未真正生效,导致onConnected方法里的位置更新请求因为权限检查失败直接返回,之后也没有重新触发位置获取的逻辑——这就是为什么必须重启应用才能正常显示经纬度的原因。

下面是具体的修复步骤:


1. 添加上权限请求结果的回调处理

你需要重写onRequestPermissionsResult方法,在用户授予权限后,主动触发位置更新请求或重新连接GoogleApiClient:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 1) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限授予成功,根据GoogleApiClient状态处理
            if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
                startLocationUpdates();
            } else if (mGoogleApiClient != null && !mGoogleApiClient.isConnected()) {
                mGoogleApiClient.connect();
            }
        } else {
            Toast.makeText(this, "定位权限被拒绝,无法获取位置信息", Toast.LENGTH_SHORT).show();
        }
    }
}

2. 提取位置更新逻辑为独立方法

把onConnected里的位置请求逻辑抽出来,方便复用,同时简化代码:

private void startLocationUpdates() {
    mLocationRequest = LocationRequest.create();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(1000);
    
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return;
    }
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}

然后修改onConnected方法,直接调用这个方法:

@Override
public void onConnected(@Nullable Bundle bundle) {
    startLocationUpdates();
}

3. 优化冗余的权限检查代码

你原来的onConnected方法里重复写了两次相同的权限判断,现在用上面的单一检查就足够,代码更简洁清晰。

可选优化:调整GoogleApiClient的连接时机

你也可以把GoogleApiClient的初始化和连接延迟到权限确认之后,从根源避免权限不足的问题:
修改onCreate方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mLatitudeText = (TextView) findViewById(R.id.latitude);
    mLongitudeText = (TextView) findViewById(R.id.longitude);
    
    // 先请求权限,暂不初始化GoogleApiClient
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}

然后在onRequestPermissionsResult的权限成功分支里再初始化连接:

if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    buildGoogleApiClient();
    mGoogleApiClient.connect();
}

完成以上修改后,当用户授予定位权限时,应用会立刻触发位置获取逻辑,不需要重启就能显示经纬度了。

内容的提问来源于stack exchange,提问作者Domin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:27:42