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

Android Google Maps API:地图加载时将相机移至当前位置

如何在Android Google Maps API地图加载完成后自动将相机移动到用户当前位置?

我来帮你搞定这个需求!你已经有了基础的权限申请代码,但要实现地图加载完成后自动跳转到当前位置,还需要几个关键步骤,我一步步给你讲清楚:

核心思路

地图只有在完全加载完成后才能执行相机移动操作,所以我们要依托OnMapReadyCallback接口的回调来触发后续逻辑;同时要通过FusedLocationProviderClient(Google推荐的位置服务API)来获取用户当前的精准位置,最后调用相机移动方法完成跳转。

详细实现步骤

1. 准备工作:实现必要接口与初始化成员变量

首先让你的Activity实现OnMapReadyCallback和权限回调接口,同时初始化地图对象、位置服务客户端和权限请求码:

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback,
        ActivityCompat.OnRequestPermissionsResultCallback {

    private GoogleMap mMap;
    private FusedLocationProviderClient fusedLocationClient;
    private static final int MY_LOCATION_REQUEST_CODE = 1001; // 自定义权限请求码

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        
        // 初始化FusedLocationProviderClient
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
        
        // 获取MapFragment并设置地图加载回调
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        // 你的权限申请代码可以保留,但建议把setMyLocationEnabled放到地图ready后处理
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            // 权限已获取,等地图ready后再操作
        } else {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_LOCATION_REQUEST_CODE);
        }
    }

2. 处理地图加载完成的回调

当地图加载完成后,我们先启用“我的位置”图层,再触发移动相机到当前位置的逻辑:

@Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        // 显示自带的“我的位置”按钮
        mMap.getUiSettings().setMyLocationButtonEnabled(true);

        // 检查权限,有权限就直接获取位置并移动相机
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            mMap.setMyLocationEnabled(true);
            moveCameraToCurrentLocation();
        }
    }

3. 处理权限申请的回调

当用户同意或拒绝权限后,我们要做对应的处理:

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == MY_LOCATION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限同意,且地图已初始化的话,启用位置图层并移动相机
                if (mMap != null) {
                    mMap.setMyLocationEnabled(true);
                    moveCameraToCurrentLocation();
                }
            } else {
                // 权限被拒绝,提示用户功能受限
                Toast.makeText(this, "需要位置权限才能自动定位到当前位置", Toast.LENGTH_SHORT).show();
            }
        }
    }

4. 核心方法:获取位置并移动相机

封装一个方法来获取用户当前位置,然后带动画移动相机到该位置:

private void moveCameraToCurrentLocation() {
        fusedLocationClient.getLastLocation()
                .addOnSuccessListener(this, location -> {
                    if (location != null && mMap != null) {
                        // 创建相机更新参数:设置经纬度和缩放级别(15是比较合适的街景级别,可调整)
                        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(
                                new LatLng(location.getLatitude(), location.getLongitude()), 15);
                        // 带动画移动相机,也可以用moveCamera()实现瞬间跳转
                        mMap.animateCamera(cameraUpdate);
                    } else {
                        Toast.makeText(MapsActivity.this, "无法获取当前位置", Toast.LENGTH_SHORT).show();
                    }
                })
                .addOnFailureListener(this, e -> {
                    Toast.makeText(MapsActivity.this, "获取位置失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
                });
    }
}

额外注意事项

  • 依赖添加:在app模块的build.gradle中添加位置服务依赖(版本号可使用最新稳定版):
    implementation 'com.google.android.gms:play-services-location:21.0.1'
    
  • Manifest配置:确保在AndroidManifest.xml中添加必要权限,并配置Google Maps API密钥:
    <!-- 位置权限 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    
    <!-- Maps API密钥(替换成你自己的密钥) -->
    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="你的Google Maps API密钥" />
    
  • Google Cloud配置:确保你已经在Google Cloud Console中启用了Maps SDK for Android和Location API,并且API密钥已绑定正确的应用签名包名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:45:17