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

