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

GoogleApiClient已废弃,求替代方案及代码划红问题解惑

解决GoogleApiClient被废弃的问题

嘿,这问题我之前也踩过坑!你看到代码里GoogleApiClient被划掉,是因为它已经被Google正式废弃了——从Play Services 12.0版本开始,Google就不再推荐使用这个统一的客户端,转而推出了更模块化、更易用的独立API,针对位置服务的话,替代方案就是FusedLocationProviderClient。

为什么原来的代码不行?

原来的GoogleApiClient需要你实现一堆回调接口(ConnectionCallbacks、OnConnectionFailedListener等)来管理客户端的连接状态,步骤繁琐还容易出错。新的API把这些逻辑都封装好了,用更简洁的任务和回调方式来处理位置请求。

修改后的完整代码示例

我把你原来的代码改成用新的位置服务API,去掉了所有废弃的GoogleApiClient相关代码:

import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.os.Looper;

import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;

import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.tasks.OnSuccessListener;

public class DriverMapActivity extends FragmentActivity implements OnMapReadyCallback {
    private GoogleMap mMap;
    private FusedLocationProviderClient mFusedLocationClient;
    private LocationRequest mLocationRequest;
    private LocationCallback mLocationCallback;
    private Location mLastLocation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_driver_map);

        // 初始化新的位置服务客户端
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
        // 创建位置请求配置
        createLocationRequest();
        // 配置位置更新的回调
        setupLocationCallback();

        // 初始化地图
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    private void createLocationRequest() {
        mLocationRequest = LocationRequest.create();
        mLocationRequest.setInterval(10000); // 每10秒更新一次位置
        mLocationRequest.setFastestInterval(5000); // 最快5秒更新一次(如果有其他应用请求更频繁)
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); // 高精度模式
    }

    private void setupLocationCallback() {
        mLocationCallback = new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                if (locationResult == null) return;
                // 获取最新位置
                mLastLocation = locationResult.getLastLocation();
                // 这里可以做你需要的操作,比如更新地图标记
                updateMapWithCurrentLocation();
            }
        };
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        // 检查权限后开始获取位置
        checkLocationPermissionAndStartUpdates();
    }

    private void checkLocationPermissionAndStartUpdates() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            // 权限已获取,先获取最后一次已知位置
            mFusedLocationClient.getLastLocation()
                    .addOnSuccessListener(this, location -> {
                        if (location != null) {
                            mLastLocation = location;
                            updateMapWithCurrentLocation();
                        }
                    });
            // 开始持续获取位置更新
            mFusedLocationClient.requestLocationUpdates(
                    mLocationRequest,
                    mLocationCallback,
                    Looper.getMainLooper()
            );
        } else {
            // 请求位置权限
            ActivityCompat.requestPermissions(
                    this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    1001
            );
        }
    }

    private void updateMapWithCurrentLocation() {
        if (mMap == null || mLastLocation == null) return;
        LatLng currentLatLng = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng, 15));
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 1001) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                checkLocationPermissionAndStartUpdates();
            }
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 暂停时停止位置更新,节省电量
        mFusedLocationClient.removeLocationUpdates(mLocationCallback);
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 恢复时重新开始位置更新(如果权限已获取)
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            mFusedLocationClient.requestLocationUpdates(
                    mLocationRequest,
                    mLocationCallback,
                    Looper.getMainLooper()
            );
        }
    }
}

几个关键的改动点:

  • 移除了所有GoogleApiClient相关的接口实现和成员变量,换成FusedLocationProviderClient
  • 用LocationCallback替代原来的LocationListener来接收位置更新
  • 用任务式的getLastLocation().addOnSuccessListener()替代原来的连接成功后获取位置的逻辑
  • 新增了权限检查的逻辑,确保符合Android 6.0+的权限要求

最后别忘了更新依赖

确保你的app模块的build.gradle里引用了最新的Play Services依赖:

dependencies {
    implementation 'com.google.android.gms:play-services-location:21.0.1'
    implementation 'com.google.android.gms:play-services-maps:18.1.0'
}

这样改完之后,就不会再看到GoogleApiClient被划掉的提示了,代码也更简洁易维护~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:42:34