Androidで位置情報を取得するためのKotlinのサンプルコードを教えてください。
以下は、Androidで位置情報を取得するためのKotlinのサンプルコードです。
import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.location.Location
import android.location.LocationListener
import android.location.LocationManager
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
class MainActivity : AppCompatActivity() {
private var locationManager: LocationManager? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
// 位置情報を取得するためのパーミッションを取得する
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), 1)
} else {
// 位置情報を取得する
locationManager?.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, locationListener)
}
}
private val locationListener = object : LocationListener {
override fun onLocationChanged(location: Location) {
// 位置情報が更新された時の処理
val latitude = location.latitude
val longitude = location.longitude
// 取得した緯度経度を使って何かする
}
override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {}
override fun onProviderEnabled(provider: String) {}
override fun onProviderDisabled(provider: String) {}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
when (requestCode) {
1 -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 位置情報を取得する
locationManager?.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, locationListener)
}
return
}
}
}
}
上記のコードでは、 LocationManager
を使用して位置情報を取得しています。また、 LocationListener
を使用して、位置情報が更新された時の処理を記述しています。
また、位置情報を取得するためには、ACCESS_FINE_LOCATIONとACCESS_COARSE_LOCATIONのパーミッションが必要です。そのため、パーミッションのチェックや取得のコードも記述されています。
このサンプルコードは、GPSプロバイダーから位置情報を取得していますが、他にもネットワークプロバイダーやPassiveプロバイダーなどがありますので、必要に応じて使い分けることができます。
位置情報を取得するために、ACCESS_FINE_LOCATIONとACCESS_COARSE_LOCATIONのパーミッションを取得する方法を教えてください。
- AndroidManifest.xmlにパーミッションを記述します。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
- アプリが実行される際に、パーミッションを取得するためのダイアログを表示します。
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), 1)
}
- ユーザーがパーミッションの許可/拒否を選択した際の処理を記述します。
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
when (requestCode) {
1 -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// パーミッションを取得できた場合の処理
} else {
// パーミッションを取得できなかった場合の処理
}
return
}
}
}
上記のようにして、ACCESS_FINE_LOCATIONとACCESS_COARSE_LOCATIONのパーミッションを取得することができます。
実際に実装する際には、パーミッション周りを便利に使えるライブラリを導入することが多いです。