Android平台使用Kotlin结合Google Map获取当前位置求助
Android Kotlin 结合 Google Map 获取当前位置(初学者友好版)
前置准备
- 添加依赖
在你的app/build.gradle.kts(Module级别)的dependencies块中加入:
implementation("com.google.android.gms:play-services-maps:18.2.0") implementation("com.google.android.gms:play-services-location:21.0.1")
- 配置权限与API密钥
在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-feature android:name="android.hardware.location.gps" android:required="false" />
同时在<application>标签内加入Google Map的API密钥(替换成你自己的密钥):
<meta-data android:name="com.google.android.geo.API_KEY" android:value="你的Google Maps API密钥" />
布局文件(activity_main.xml)
用SupportMapFragment展示地图:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <fragment android:id="@+id/map_fragment" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
主Activity代码(MainActivity.kt)
核心逻辑包含权限请求、地图初始化、获取当前位置并标记:
import android.Manifest import android.content.pm.PackageManager import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat 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.maps.model.MarkerOptions import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.LocationServices class MainActivity : AppCompatActivity(), OnMapReadyCallback { private lateinit var mMap: GoogleMap private lateinit var fusedLocationClient: FusedLocationProviderClient private val LOCATION_PERMISSION_REQUEST_CODE = 1001 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化位置客户端 fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) // 获取地图Fragment val mapFragment = supportFragmentManager.findFragmentById(R.id.map_fragment) as SupportMapFragment mapFragment.getMapAsync(this) } override fun onMapReady(googleMap: GoogleMap) { mMap = googleMap checkLocationPermission() } // 检查位置权限 private fun checkLocationPermission() { if (ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) { // 请求权限 ActivityCompat.requestPermissions( this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), LOCATION_PERMISSION_REQUEST_CODE ) return } // 权限已获取,获取当前位置 getCurrentLocation() } // 获取当前位置 private fun getCurrentLocation() { if (ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) { return } fusedLocationClient.lastLocation.addOnSuccessListener { location -> location?.let { val currentLatLng = LatLng(it.latitude, it.longitude) // 在地图上标记当前位置 mMap.addMarker(MarkerOptions().position(currentLatLng).title("我的位置")) // 移动相机到当前位置,缩放级别15 mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng, 15f)) } ?: run { Toast.makeText(this, "无法获取当前位置,请检查位置服务是否开启", Toast.LENGTH_SHORT).show() } } } // 权限请求结果回调 override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { getCurrentLocation() } else { Toast.makeText(this, "需要位置权限才能获取当前位置", Toast.LENGTH_SHORT).show() } } } }
示例项目说明
这个项目核心结构简单清晰:
app/src/main/AndroidManifest.xml:配置权限和API密钥app/src/main/res/layout/activity_main.xml:地图Fragment布局app/src/main/java/com/你的包名/MainActivity.kt:核心逻辑实现
使用时记得替换API密钥,开启设备位置服务,首次启动会请求权限,允许后就能看到地图上标记你的当前位置。
内容的提问来源于stack exchange,提问作者Anand Nishad
相关产品推荐
相关产品推荐

