【Kotlin】Googleマップと現在位置を表示する

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つの関数を作成する。

  1. パーミッションの取得状態を確認し、パーミッション・リクエストをする。
  2. パーミッション・リクエストした後のコールバック
  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)
        }

 

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog