Google Mapを表示して現在位置を表示するアプリを作ってみた。

地図を表示
作ってみたと言っても、地図を表示するだけなら、すでにテンプレートがある。
新規でプロジェクトを作り、GoogleMapsActivityを選択する。
親切にマニフェストファイルに以下の記述をしてくれている。
TODO: Before you run your application, you need a Google Maps API key. To get one, follow the directions here: https://developers.google.com/maps/documentation/android-sdk/get-api-key
APIキーを取得しないと、地図が表示できない。ということらしい。
上記のURLをクリックして、手順に従ってAPIキーを入手。
マニフェストファイルにmetaデータというタグがあるので、そこにAPIキーを記載する。
これで地図の表示は完了。
現在地の取得
まず、2つのパーミッションをマニフェストファイルに記載する。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
次にコードを書いていく。
以下の3つの関数を作成する。
- パーミッションの取得状態を確認し、パーミッション・リクエストをする。
- パーミッション・リクエストした後のコールバック
- 位置情報をオンにする
override fun onMapReady(googleMap: GoogleMap) { mMap = googleMap // Add a marker in Sydney and move the camera // val sydney = LatLng(-34.0, 151.0) // mMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney")) // mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)) checkPermission() } //パーミッションの状態を確認する private fun checkPermission(){ if(ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){ myLocationEnable() }else{ ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),1) } } //requestPeermissionsのコールバック override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if(grantResults[0] == PackageManager.PERMISSION_GRANTED){ Toast.makeText(this,"許可されました",Toast.LENGTH_SHORT).show() myLocationEnable() }else{ Toast.makeText(this,"拒否されました",Toast.LENGTH_SHORT).show() } } //自分の位置情報をオンにする private fun myLocationEnable(){ if (ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) { //許可されていない return }else{ mMap.isMyLocationEnabled = true } }
補足
一度、「許可しますか?」の許可画面で選択をすると、アプリを再起動しても許可画面は出てこなくなる。
アプリをアンインストールすると、許可画面がまた出てくるようになる。
アプリの開発時に覚えておくと便利。
緯度と経度
緯度と経度を取得する方法について。
FusedLocationProviderClientを使うために、Gradleに以下を追加する。
implementation 'com.google.android.gms:play-services-location:19.0.1'
クライアントとコールバックの変数をグローバルで追加。
lateinit var fusedLocationProviderClient : FusedLocationProviderClient var locationCallback: LocationCallback? = null
onCreateの中で初期化する。
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
myLocationEnableの中に追記する。
}else{ mMap.isMyLocationEnabled = true locationCallback = object : LocationCallback() { override fun onLocationResult(p0: LocationResult) { super.onLocationResult(p0) var currentLatLog = LatLng(p0.lastLocation.latitude, p0.lastLocation.longitude) mMap.moveCamera(CameraUpdateFactory.newLatLng(currentLatLog)) textview.text = "Lat:${currentLatLog.latitude}, Long:${currentLatLog.longitude}" } } val locationRequest = LocationRequest.create().apply { interval = 10000 fastestInterval = 5000 priority = LocationRequest.PRIORITY_HIGH_ACCURACY } fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback as LocationCallback,mainLooper) }