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

Android Studio中使用Google Maps API获取用户位置并让地图相机聚焦

嘿,我来帮你实现这个需求!要把地图的默认聚焦点从固定的"Barcelona"换成用户当前位置,咱们一步步来,确保每个环节都踩对:

1. 先配置必要的权限

首先得让APP有权限获取用户位置,打开你的AndroidManifest.xml,添加这些权限(按需选择,精确位置更适配地图场景):

<!-- 精确位置权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 粗略位置权限(不需要高精度时可选) -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 地图加载依赖网络,需添加网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
2. 初始化位置服务和Google Maps

咱们用Google官方推荐的FusedLocationProviderClient来获取位置,比自己写位置监听稳定多了。先在Activity里声明核心变量:

private lateinit var mMap: GoogleMap
private lateinit var fusedLocationClient: FusedLocationProviderClient
// 自定义权限请求标识码
private val LOCATION_PERMISSION_REQUEST_CODE = 1001

然后在onCreate中初始化位置服务客户端,并绑定GoogleMap的初始化回调:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_maps)
    
    // 初始化位置服务客户端
    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
    
    // 获取MapFragment并设置初始化回调
    val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
    mapFragment.getMapAsync(this)
}
3. 动态申请位置权限(安卓6.0+必做)

GoogleMap初始化完成后,先检查权限状态,没有权限就主动申请:

override fun onMapReady(googleMap: GoogleMap) {
    mMap = googleMap
    
    // 检查位置权限是否已授予
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
        == PackageManager.PERMISSION_GRANTED) {
        // 权限已通过,直接获取用户位置
        getUserCurrentLocation()
    } else {
        // 弹窗申请权限
        ActivityCompat.requestPermissions(
            this,
            arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
            LOCATION_PERMISSION_REQUEST_CODE
        )
    }
}

// 处理权限申请结果
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户同意权限,开始获取位置
            getUserCurrentLocation()
        } else {
            // 用户拒绝权限,提示并 fallback 到默认的Barcelona位置
            Toast.makeText(this, "需要位置权限才能显示当前位置", Toast.LENGTH_SHORT).show()
            moveCameraToDefaultLocation()
        }
    }
}
4. 获取用户位置并移动地图相机

实现核心的位置获取方法,拿到位置后替换原来的Barcelona坐标:

private fun getUserCurrentLocation() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
        == PackageManager.PERMISSION_GRANTED) {
        fusedLocationClient.lastLocation.addOnSuccessListener { location: Location? ->
            location?.let {
                // 转换为地图可用的LatLng对象
                val userLatLng = LatLng(it.latitude, it.longitude)
                // 移动相机到用户位置,第二个参数是缩放级别(1-20,数值越大视角越近)
                val cameraUpdate = CameraUpdateFactory.newLatLngZoom(userLatLng, 15f)
                mMap.moveCamera(cameraUpdate)
                // 可选:给当前位置添加标记
                mMap.addMarker(MarkerOptions().position(userLatLng).title("你的位置"))
            } ?: run {
                // 若获取不到位置(比如刚打开APP还未完成定位),显示默认地点
                Toast.makeText(this, "暂时无法获取位置,显示默认地点", Toast.LENGTH_SHORT).show()
                moveCameraToDefaultLocation()
            }
        }
    }
}

// 原默认的Barcelona位置逻辑
private fun moveCameraToDefaultLocation() {
    val barcelona = LatLng(41.3851, 2.1734)
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(barcelona, 15f))
}
额外小贴士
  • 如果需要实时跟随用户位置移动,可以用fusedLocationClient.requestLocationUpdates监听位置变化,而不是只获取一次lastLocation
  • 若使用了实时位置监听,记得在onDestroy中移除监听,避免内存泄漏
  • 测试时优先用真机,模拟器需要手动设置模拟位置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:23:47