LocationManagerを介してGPS、Networkの位置情報を得ることができます。
位置情報を取得する方法は、 LocationManager.getLastKnownLocation()
で、最後に記録された位置情報を取得または
LocationManager.requestLocationUpdates()
でListenerを登録して、位置が変更されるたびにイベントを受け取ることができます。
Locationパーミッション
位置情報を取得するには、次のパーミッションのいずれかは、AndroidManifestに定義する必要があります。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
ACCESS_COARSE_LOCATION
:都市Block単位の精度の位置情報を取得することができますACCESS_FINE_LOCATION
:ACCESS_COARSE_LOCATION
より精密な位置情報を得ることができます
Runtime Permission要求の詳細実装は、Android - Runtime permissionリクエスト方法を参照してください。
最後に確認された位置情報を取得する
LocationManager.getLastKnownLocation(provider)
APIで最後に確認された位置情報を得ることができます。
長い間、Location更新がないなどの理由で、非常に長い時間前に保存された位置情報が戻されることがあります。
または、当該Providerの格納された位置情報がないときは、nullが返されることがあります。
引数として渡されたProviderの種類には、一般的にGPSの位置を提供してくれる GPS_PROVIDER
とネットワークの位置を提供してくれるNETWORK_PROVIDER
があります。
次のように位置情報の緯度(latitude)と経度(longitude)を得ることができます。
val location : Location? = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER)
if (location != null) {
val latitude = location.latitude
val longitude = location.longitude
Log.d("Test", "GPS Location changed, Latitude: $latitude" +
", Longitude: $longitude")
}
Location
は、次のような情報を提供しています。
getAccuracy()
:正確getLatitude()
:上記getLongitude()
:軽getTime()
:生成された時刻(UTCgetElapsedRealtimeNanos()
:生成された時間(Elapsed time
次のように Location.getElapsedRealtimeNanos()
でいつ生成されたLocationオブジェクトであるか知ることができ、現在ので数秒前に生成されたかどうかを計算することができます。
これで古いデータはフィルタすることができます。
val location : Location? = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER)
val ageMs = TimeUnit.NANOSECONDS.toMillis(SystemClock.elapsedRealtimeNanos()
- location.getElapsedRealtimeNanos())
位置情報の変更のListener
次のように位置情報のリスナーを登録することができ、リスナーを登録すると、Callbackが渡されます。
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
10000, // 10-second interval.
10.0f, // 10 meters
gpsListener)
var gpsListener: LocationListener = object : LocationListener {
override fun onLocationChanged(location: Location) {
val latitude = location.latitude
val longitude = location.longitude
Log.d("Test", "GPS Location changed, Latitude: $latitude" +
", Longitude: $longitude")
}
override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {
}
override fun onProviderEnabled(provider: String) {
}
override fun onProviderDisabled(provider: String) {
}
}
requestLocationUpdates()
の引数には、次のような内容が渡されます。
- Provider:
GPS_PROVIDER
またはNETWORK_PROVIDER
することができます - minInterval(ms):10秒に設定すると、更新があったとき、少なくとも10秒間隔でイベントを送出します
- minDistance(meters):設定された距離だけの変化があったときのイベントを転送します
- Listener:Listenerオブジェクトを渡します
Listenerの登録解除
Listenerを使用していないときは、次のように終了することができます。
locationManager.removeUpdates(listener);
使用可能なProviderあることを確認
次のようにデバイスのGPSまたはNetworkプロバイダが使用可能かどうかを確認することができます。
val isGPSEnabled =
locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
val isNetworkEnabled =
locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
もしGPSの設定がオフになっている場合は GPS_PROVIDER
が無効にされたと返されます。
このような場合には、次のようにSettings画面を実行して、ユーザーにGSPを有効にするようにガイドすることができます。
private fun enableLocationSettings() {
val settingsIntent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
startActivity(settingsIntent)
}
参考
Related Posts
- Android - FusedLocationProviderClientに位置情報を取得する
- Android - GPS、Network位置情報を取得する(LocationManager)
- Android - adbコマンドでActivity実行
- アンドロイド - MediaStoreにメディアファイルを保存する方法
- Android - Runtime permissionリクエスト方法と例(kotlin)
- Android11 - Storage(ストレージ)の変更まとめ
- Jetpack Compose - RowとColumn
- Android 13 - 細かいメディアファイルの権限
- Android 13でNotification権限をリクエスト、通知を表示する
- エラー解決:android gradle plugin requires java 11 to run. you are currently using java 1.8.
- Query method parameters should either be a type that can be converted into a database column or a List
- Android - TabLayoutの実装方法(+ ViewPager2)
- Android - adbコマンドで特定のパッケージのプロセスの終了
- Android - adb push、pullでファイルのコピー、ダウンロード
- Android - adbコマンドでsettings value確認、変更、
- Android 12 - IntentFilterのexported明示的な宣言
- Android - adb logcatコマンドでログ出力
- Android - ACTION_BOOT_COMPLETEDイベント受信
- Android - Foreground Service実行
- Android - ファイル入出力の例(Read、Write、内部、外部ストレージ)
- Android - アプリの権限を確認(Permission check)
- Android - adbで実行中のプロセス、スレッドリスト及びメモリ情報の確認
- Android - Broadcast Receiver登録およびイベントの受信方法
- Android - Cleartext HTTP ... not permitted例外解決方法
- Androidのビルドエラー - Calls to Java default methods are prohibited in JVM target 1.6
- アンドロイド - Assetsでファイルを読み取る方法
- アンドロイドのさまざまなNotification種類と実装方法
- アンドロイド - INSTALL_FAILED_TEST_ONLYエラー解決方法
- Android EspressoのCustom Matcher実装方法
- Android Espressoを使用してUIをテストする方法(3)
- アンドロイド - CTS hostsideをgradleで構築する方法
- Androidのアプリのデータフォルダーのパスと内部/外部ストレージ説明
- アンドロイド - 最初のApp作成
- Androidをインストールする方法(Windows)