這次做一個地圖應用,通過 Google Map 顯示自己的位置以及對應的座標。
功能
接觸的內容
通過在 App 上右鍵的方式建立一個 Activity,點開 Gallery 以後會看到 Google Maps Activity。
IDE 會同時幫我們建立一個 Activity 以及一個對應的 Layout。
而 IDE 同時還會建立一個 google_maps_api.xml 文件,這裡面會需要寫上我們的 Google Map 金鑰。
我在 Github 上有看到一些人是將 key 放在 /values/strings/ 底下,又或者在 values 下另外建立文件來使用。
<string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">Your Google API Key</string>
而在 AndroidManifest.xml 文件中,IDE 也幫我們加了一些東西,比如:
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_key" />
<activity
android:name=".MapsActivity"
android:label="@string/title_activity_maps" />
這裡發現 google_maps_key 又或者 MapsActivity 的 title 都是通過 @string/key 的方式來引用。
<resources>
<string name="app_name">MyLocation</string>
<string name="title_activity_maps">Map</string>
<string name="title_activity_map">Map</string>
</resources>
@string/key 的內容部分是來自下圖中的 strings.xml
在 Android 中,可以通過 Intent 來切換 Activity。
val intentMapActivity = Intent(this, MapsActivity::class.java)
startActivity(intentMapActivity)
這次會用到定位的權限,需要在 AndroidManifest 加入:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), MY_PERMISSIONS_REQUEST_LOCATION)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray){
if (requestCode == MY_PERMISSIONS_REQUEST_LOCATION) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
showMapsActivity()
} else {
Toast.makeText(this, "需要定位功能", Toast.LENGTH_SHORT).show()
}
}
}
我們實例化一個 locationManager 並且嘗試獲取用戶當前位置,並委派一個 locationListener。
// Create persistent LocationManager reference
locationManager = getSystemService(LOCATION_SERVICE) as LocationManager?
try {
// Request location updates
locationManager?.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0L, 0f, locationListener)
} catch(ex: SecurityException) {
Log.d("myTag", "Security Exception, no location available")
}
在取得座標的時候,將地圖移動到座標所在位置,並且將座標顯示在 locationTextView 上。
private val locationListener: LocationListener = object : LocationListener {
override fun onLocationChanged(location: Location) {
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(LatLng(location.latitude, location.longitude), 12.0f))
locationTextView.text = "${location.latitude} - ${location.longitude}"
}
override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {}
override fun onProviderEnabled(provider: String) {}
override fun onProviderDisabled(provider: String) {}
}