[Android] 011. FusedLocationProviderClient(位置情報)

位置情報取得は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