授予运行时定位权限后位置更新失效问题求助
问题分析与解决方案
嘿,我仔细看了你的代码,问题核心在于权限请求是异步操作,而你的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
相关产品推荐
相关产品推荐

