GoogleMap에 Jetpack Compose 포함

https://cloud.google.com/blog/products/maps-platform/compose-maps-sdk-android-now-available
이런 느낌이 들어서 해봤어요.
지도의 삽입 자체는 이곳의 문장에 유지된다
정말 몇 줄만 쓰고 완성했어요. 아주 간단해서 놀랐어요.
그렇지만
Compose와 전혀 상관없이 자신이 현재 소재지를 취득하는 등 처리
너무 난해하니까 총결산해 보자(아직 잘 모르겠다)

현재 위치 가져오기 처리


권한 설정


<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
선언에 이것을 추가한다.
COARSE 는 로우 레벨, FINE 는 로우 레벨 검색 가능

권한 상태 확인


흔히 볼 수 있는 "프로그램이 hogehoge를 요구합니다. 허용합니까?"
이런 대화.
ContextCompat.checkSelfPermission()
이렇게 하면 허가 여부를 확인할 수 있다.
대화 상자 여기 있습니다.
ActivityCompat.requestPermissions()
를 참고하십시오.
다 귀납하면 이런 느낌이에요.
private val REQUEST_CODE_LOCATION = 100

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
//現在地取得処理を書く
        }
        else {
            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_CODE_LOCATION)
        }
  • ContextCompat.checkSelfPermission()을 통해 판정
  • 라이센스가 없는 경우 ActivityComportRequestPermissions()를 통해 대화 상자 표시
  • ActivityCompat.requestPermissions()는 매개변수입니다.
    context,array Of (필요 권한), 고유의 요청 코드를 설정해서 보냅니다.
  • 고유의 요청 코드가 되돌아오기 때문에
    그때 판정도 쓸 수 있을 것 같아.

    현재 소재지에서 처리를 얻다


    fusedLocationClient = FusedLocationProviderClient(requireActivity())
    
            // どのような取得方法を要求
            val locationRequest = LocationRequest.create().apply {
                interval = 10000                                   // 最遅の更新間隔(但し正確ではない。)
                fastestInterval = 5000                             // 最短の更新間隔
                priority = LocationRequest.PRIORITY_HIGH_ACCURACY  // 精度重視
            }
    
            // コールバック
            val locationCallback = object : LocationCallback() {
                override fun onLocationResult(locationResult: LocationResult) {
                    //locationResultに結果が入っているので後はよしなにする
    		
    		//removeLocationUpdatesをしないと永遠と位置情報を取得し続けるので消してあげる
                    fusedLocationClient.removeLocationUpdates(this)
                }
            }
    
    // 取得処理
    fusedLocationClient.requestLocationUpdates(
                                            locationRequest,
                                            locationCallback,
                                            Looper.myLooper()!!
                                        )
    
  • 관련 실례를 얻는 데 사용
  • LocationRequest.create()를 통한 다양한 설정
  • fusedLocationClient.RequestLocation Updates()를 통한 프로세스 가져오기
  • locationCalleback을 통해onlocationResult()로 돌아왔기 때문에 잘했다
  • 마지막은 fusedLocation Client입니다.removeLocation Updates()에서 처리를 종료합니다.

    허가 없이 처리하다


    private fun locationStart(
            getLocation: () -> Unit
        ) {
            // Instances of LocationManager class must be obtained using Context.getSystemService(Class)
            val locationManager =
                requireActivity().getSystemService(LOCATION_SERVICE) as LocationManager
    
            if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                Timber.d("debug", "location manager Enabled")
            } else {
                // to prompt setting up GPS
                val settingsIntent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
                startActivity(settingsIntent)
                Timber.d("debug", "not gpsEnable, startActivity")
            }
            if (ContextCompat.checkSelfPermission(
                    requireContext(),
                    Manifest.permission.ACCESS_FINE_LOCATION
                ) != PackageManager.PERMISSION_GRANTED
            ) {
                ActivityCompat.requestPermissions(
                    requireActivity(),
                    arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_CODE_LOCATION
                )
                Timber.d("debug", "checkSelfPermission false")
                showDialogToGetPermission()
                return
            }
    
            getLocation()
        }
        
    private fun showDialogToGetPermission() {
            val builder = AlertDialog.Builder(requireContext())
            builder.setTitle("現在地取得が利用できません")
                .setMessage("現在地取得を利用するには権限を許可してください")
    
            builder.setPositiveButton("OK") { _, _ ->
                val intent = Intent(
                    Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
                    Uri.fromParts("package", "hogehoge", null)
                )
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                startActivity(intent)   // 6
            }
            builder.setNegativeButton("CANCEL") { _, _ ->
                // ignore
            }
            val dialog = builder.create()
            dialog.show()
        }
    
  • ActivityCompat.RequestPermissions() 다음에 locationStart()
  • 거부되면 ShowDialogToGetPermission()에 불이 나서 응용 설정
  • 으로 옮겨집니다.
  • 이 도선을 만들지 않고 2번 이상 거절당하면 대화가 다시 나타나지 않아 곤란하다
  • 매개변수가 완전합니다.내가 너에게 그것을 건네주겠다

    참고 문장


    https://cloud.google.com/blog/products/maps-platform/compose-maps-sdk-android-now-available
    https://developer.android.com/training/location/retrieve-current?hl=ja
    https://hirauchi-genta.com/kotlin-location-permission/
    https://px-wing.hatenablog.com/entry/2021/03/22/065434
    https://medium.com/@hasperong/get-current-location-with-latitude-and-longtitude-using-kotlin-2ef6c94c7b76
    https://stackoverflow.com/questions/51313359/get-current-location-android-kotlin
    https://akira-watson.com/android/gps.html
    https://codechacha.com/ja/android-get-location-from-locationmanager/
    https://blog.dtdweb.com/2013/04/06/gps_desc/
    https://www.tabnine.com/code/java/methods/android.location.LocationManager/requestLocationUpdates
    https://akira-watson.com/android/kotlin/gps-simple.html
    https://codechacha.com/ja/android-request-runtime-permissions/
    https://tail-island.github.io/programming/2017/06/19/android-permission.html

    좋은 웹페이지 즐겨찾기