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
相关产品推荐
相关产品推荐

