位置情報取得はLocationManagerでもできますが、こちらを使うのが推奨っぽいのでためしてみました
https://developer.android.com/develop/sensors-and-location/location
以下の依存関係追加
com.google.android.gms:play-services-location
<manifest
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />import android.os.Looper
import androidx.core.content.ContextCompat
class MainActivity : ComponentActivity() {
lateinit var fusedLocationClient: FusedLocationProviderClient
val locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 500)
val locationCallback: LocationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
super.onLocationResult(locationResult)
locationResult.lastLocation?.apply {
location.update { "$latitude, $longitude" }
}
}
}
val location = MutableStateFlow("")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
val locationPermissionRequest = registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
when {
permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> {
Log.d("MainActivity", "ACCESS_FINE_LOCATION false")
}
permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> {
Log.d("MainActivity", "ACCESS_COARSE_LOCATION false")
}
else -> {}
}
}
locationPermissionRequest.launch(
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)
)
...
}
override fun onResume() {
super.onResume()
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
fusedLocationClient.requestLocationUpdates(
locationRequest.build(),
locationCallback,
Looper.getMainLooper()
)
}
}
override fun onStop() {
super.onStop()
fusedLocationClient.removeLocationUpdates(locationCallback)
}
}
@Composable
fun Screen(text: String, modifier: Modifier = Modifier) {
Text(text = text, modifier = modifier)
}
エミュレータで試しているのであれば位置情報変更も簡単にできます

LocationManager
せっかく?なのでLocationManagerの場合は以下
class MainActivity : ComponentActivity() {
lateinit var locationManager: LocationManager
val locationListener: LocationListener = object : LocationListener {
override fun onLocationChanged(location: Location) {
locate.update { "${location.latitude}, ${location.longitude}" }
}
}
val locate = MutableStateFlow("")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
...
}
override fun onResume() {
super.onResume()
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION)
}
else {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
1000,
50f,
locationListener)
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
1000,
50f,
locationListener)
}
}
override fun onPause() {
super.onPause()
locationManager.removeUpdates(locationListener)
}
}Android Studio Koala 2024.1.1 Patch 1 built on July 11, 2024
