본문 바로가기
개발/안드로이드

[안드로이드]코틀린 : 위치 정보 권한 얻는 아주 괜찮은 방법

by 핸디(Handy) 2020. 7. 1.

2020/06/24 - [개발/안드로이드] - [안드로이드]코틀린 : 구글 지도를 사용하는 방법

이전 글에서 코틀린으로 구글 지도를 표시하는 방법에 대해 알아보았습니다. 

이번 글에서는 안드로이드의 위치 정보 권한 체크를 하는 기능과 이를 표시해주는 alert diagram를 만드는 방법에 대해 알아보겠습니다. alert diagram를 만들기 위해 사용하는 라이브러리 anko에 대해서도 추가적으로 공부해보죠.

결과

전체적인 코드는 onResume 가 될때마다 권한 체크를 하고 권한이 되어있으면 위치리스너를 붙입니다. 그리고 앱이 pause 가 되면 위치리스너를 제거하는것이 방식입니다.

< MapsActivity.kt >

 private val REQUEST_ACCESS_FIND_LOCATION = 1000
    private fun permissionCheck(cancel:() -> Unit, ok:() -> Unit){
        if(ContextCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){

            if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
                cancel();
            } else {
                ActivityCompat.requestPermissions(this,
                    arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
                    REQUEST_ACCESS_FIND_LOCATION)
            }
        } else {
            ok()
        }
    }

    private fun showPermissionInfoDialog() {
        alert("현재 위치 정보를 얻으려면 위치 권환이 필요합니다.", "권한이 필요한 이유"){
            yesButton {
                ActivityCompat.requestPermissions(this@MapsActivity,
                    arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
                    REQUEST_ACCESS_FIND_LOCATION)
            }
            noButton {  }
        }.show()
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when(requestCode) {
            REQUEST_ACCESS_FIND_LOCATION -> {
                if ( (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) ){
                    addLocationListener()
                } else {
                    toast("권한이 거부되었습니다.")
                }

            }
        }
    }

 

* 안드로이드 권한 체크를 위한 manifest import 시에 android.Manifest껄로 해야합니다.

import android.Manifest

 

  override fun onResume() {
        super.onResume()
        //권한 요청
        permissionCheck(cancel = {
            showPermissionInfoDialog()
        }, ok = {
            addLocationListener()
        })
    }

    override fun onPause() {
        super.onPause()
        removeLocationListener()
    }

여기 부분은 액티비티가 다시 실행될때 권한 체크하는 부분입니다. 그리고 중단되면 위치리스너를 제거하는 코드입니다.

코드를 좀더 상세히 살펴보겠습니다.

private fun permissionCheck(cancel:() -> Unit, ok:() -> Unit)

여기 보시면 cancel 과 ok 가 있습니다. 간단하게 callback 개념으로 보시면 됩니다. 
그래서 권한이 없으면 cancel() , 있으면 ok() 가 실행되고 각각의 콜백에 따라 showPermissionInfoDialog(), addLocationListener() 가 실행됩니다.

그리고 이제 안코(anko)가 유용하게 쓰입니다.

   private fun showPermissionInfoDialog() {
        alert("현재 위치 정보를 얻으려면 위치 권환이 필요합니다.", "권한이 필요한 이유"){
            yesButton {
                ActivityCompat.requestPermissions(this@MapsActivity,
                    arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
                    REQUEST_ACCESS_FIND_LOCATION)
            }
            noButton {  }
        }.show()
    }

보시면 alertDialog를 호출하는 메소드입니다. anko의 경우 복잡한 코드를 아주 간결하게 표현해주는 좋은 친구입니다.

 

Kotlin/anko

Pleasant Android application development. Contribute to Kotlin/anko development by creating an account on GitHub.

github.com

사용하기 위해선 build.gradle (module) 의 dependencies 안에

    implementation "org.jetbrains.anko:anko:$anko_version"

build.gradle (project) 의 buildscript 안에 

    ext.anko_version = '0.10.5'

보시면
alert("보여주고자 하는 메시지" , "메시지 타이틀") {
    yesButton{ yes 버튼 클릭시 이벤트 }
    noButton{ no 버튼 클릭시 이벤트 }
}.show()

아주 간단하게 표시가능합니다. 그래서 yes 클릭시 requestPermissions 를 날리고 no 클릭시 아무것도 없습니다.(다이얼로그가 꺼지는건 디폴트 설정!)

그러니 이렇게 편한 anko를 잘 사용합니다.!! 끝!


 

모든 코드는 이곳에서

 

gyeongseokKang/Random_Meal

init. Contribute to gyeongseokKang/Random_Meal development by creating an account on GitHub.

github.com

 

댓글