반응형

포트폴리오 프로젝트에 사용자의 현재 위치가 필요한 기능이 있었다. 당연히 모바일 기기의 위치 서비스(GPS)가 켜져있어야 했는데 열심히 알아봐도 해당 명령어가 deprecated 됐다는 둥, Intent로 Settings에 들어가서 직접 켜고 와야 하는 둥 내가 원하는 방식이 아니었다.

 

 

Intent로 Settings에 접근

거의 대부분의 사이트에서는 Intent로 단순히 위치 서비스(GPS) 옵션 화면으로 보내주는 방법을 소개하고 있었다. 물론 이렇게 해도 기능에는 아무 문제가 없지만 원하는 방식도 아니었고 개인적으로 이 방법은 사용자 측면에서 번거로웠다.

 

혹시 진짜 보안 문제 때문에 사라졌나?
 

하지만 이상했다. deprecated 됐다면 특별한 경우를 제외하고는 대체할 수 있는 기능을 알려주는데 그마저도 보이지 않았고, 제일 말이 안 되는 건 내가 원하는 그 기능을 '카카오 맵'이나 '티맵(T Map)'처럼 거의 모든 위치 관련 어플리케이션들에서 사용 중인걸 알고 있기 때문이었다.

 

 

카카오맵의 위치 서비스 설정 팝업

내가 원한 건 이거였다. 현재 기기의 위치 서비스(GPS)가 꺼져있을 경우 켜야 한다고 알리며 '확인'을 누르면 바로 위치 서비스(GPS)가 켜지는 팝업이다. deprecated 됐다면 이게 불가능할 것이다.

 

그러면 커스텀 팝업인가?
 

라는 생각도 했지만 완전히 똑같은 텍스트의 팝업 창을 다른 어플리케이션들에서도 봤었기 때문에 그것도 아닐 거라고 생각했고, 설마 이런 '라이브러리'가 있나? 까지 생각했지만 보이지 않았다.

 

 

https://www.tutorialsbuzz.com/2021/04/android-request-device-location-settings-gps.html

 

Android Request To Turn On GPS Pragmatically

Android Turn on GPS programmatically , Prompt gps request using fused location api

www.tutorialsbuzz.com

그렇게 질리도록 검색하던 중 드디어 발견했다. (그러면 그렇지 보안이니 커스텀이니 그럴 리가 없지... 그냥 내가 못 찾은 거였어)


build.gradle에 의존성 추가

implementation "com.google.android.gms:play-services-location:20.0.0"

 

 

코드 작성
package com.solution.myapplication

import android.content.IntentSender
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.google.android.gms.common.api.ResolvableApiException

import com.google.android.gms.location.*
import com.google.android.gms.tasks.Task

class MainActivity : AppCompatActivity() {
    val TAG = "SOL_LOG"


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        test()
    }

    private fun test() {
        val locationRequest = LocationRequest.create().apply {
            interval = 10000
            fastestInterval = 5000
            priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        }

        val builder = LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest)

        val client: SettingsClient = LocationServices.getSettingsClient(this)
        val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())

        task.addOnSuccessListener {
            // GPS가 켜져있을 경우
        }

        task.addOnFailureListener { exception ->
            // GPS가 꺼져있을 경우
            if (exception is ResolvableApiException) {
                Log.d(TAG, "OnFailure")
                try {
                    exception.startResolutionForResult(
                        this@MainActivity,
                        100
                    )
                } catch (sendEx: IntentSender.SendIntentException) {
                    Log.d(TAG, sendEx.message.toString())
                }
            }
        }
    }
}

주석으로 넣어두긴 했지만,

OnSuccessListener는 위치 서비스(GPS)가 켜져 있을 경우 실행되는 리스너이고,

OnFailureListener는 꺼져 있을 경우 실행되는 리스너이다.

 

 

빌드해서 확인

위치 서비스(GPS) 기능 요청

위치 서비스(GPS)가 꺼져있는 상태에서 빌드했기 때문에 기능을 요청하는 팝업이 나왔다. 만약 켜져 있는 상태에서 빌드했다면 아무런 팝업도 나오지 않는다.

팝업의 '확인'을 누르면 위치 서비스(GPS)가 켜지는 걸 확인해볼 수 있을 것이다.

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기