緯度経度の取得(連続的な取得)
AndroidManifest.xml
<manifest>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> ※1
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> ※2
<application ...>
</manifest>
※1 … 高精度のGPS位置情報
※2 … Wifiやモバイルネットワークを使う位置情報
build.gradle (Module: app)
dependencies {
implementation("com.google.android.gms:play-services-location:21.0.1")
}
MainActivity.kt
package com.example.application0210
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import android.Manifest
import android.annotation.SuppressLint
import android.content.pm.PackageManager
import android.location.Location
import android.util.Log
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.ActivityCompat
import com.google.android.gms.location.*
import com.google.android.gms.location.FusedLocationProviderClient
class MainActivity : AppCompatActivity() {
private lateinit var fusedLocationClient: FusedLocationProviderClient
private lateinit var locationCallback: LocationCallback
private lateinit var locationRequest: LocationRequest
private lateinit var textLocation: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
//
textLocation = findViewById(R.id.textLocation)
// 位置情報のクライアントを取得
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
// 位置情報を5秒に1回リクエストする
locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 5000).build()
// 位置情報の更新を受け取るコールバック
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
for (location in locationResult.locations) {
logLocation(location)
}
}
}
// 権限をリクエスト
requestLocationPermissions()
}
private fun requestLocationPermissions() {
val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
if (permissions[Manifest.permission.ACCESS_FINE_LOCATION] == true ||
permissions[Manifest.permission.ACCESS_COARSE_LOCATION] == true) {
startLocationUpdates()
} else {
Log.e("Location", "位置情報の権限が拒否されました")
textLocation.text = "権限がありません"
}
}
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissionLauncher.launch(
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)
)
} else {
startLocationUpdates()
}
}
@SuppressLint("MissingPermission")
private fun startLocationUpdates() {
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null)
}
private fun stopLocationUpdates() {
fusedLocationClient.removeLocationUpdates(locationCallback)
}
private fun logLocation(location: Location) {
Log.d("Location", "緯度: ${location.latitude}, 経度: ${location.longitude}")
val locationText = "緯度: ${location.latitude}, 経度: ${location.longitude}"
textLocation.text = locationText
}
override fun onDestroy() {
super.onDestroy()
stopLocationUpdates()
}
}