본문 바로가기
안드로이드

안드로이드 코틀린 - 권한(Permission) 요청

by Dokon Jang 2021. 9. 26.
반응형

안드로이드에서 위치, 저장소 읽기/쓰기 등을 하기 위해서는 권한이 필요합니다.

앱에서 사용자에게 권한을 요청하는 방법입니다.

1. AndroidManifast.xml에 필요한 권한을 추가합니다.

   위치 권한(ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION)을 추가했습니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test">

    ...
    
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

 

2. 앱이 실행하면 권한이 부여되지 않으면 요청합니다.

class MainActivity : AppCompatActivity() {

    val MY_PERMISSION_ACCESS_ALL = 100
    ...

    override fun onCreate(savedInstanceState: Bundle?) {
        
        ...

        if(ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            || ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            var permissions = arrayOf(
                android.Manifest.permission.ACCESS_FINE_LOCATION,
                android.Manifest.permission.ACCESS_COARSE_LOCATION
            )
            ActivityCompat.requestPermissions(this, permissions, MY_PERMISSION_ACCESS_ALL)
        }
    }

}

 

3. 사용자가 권한을 거부(Deny)하면 앱을 종료하도록 처리합니다.

(1) 권한 요청이 완료되면 onRequestPermissionsResult 함수를 호출하며 권한 요청에 대한 결과를 아규먼트로 받을 수 있습니다.

  onRequestPermissionsResult  함수를 오버라이딩합니다.

  (메뉴 Code > Override Methods에서 쉽게 추가 할 수 있습니다.)

class MainActivity : AppCompatActivity() {

    val MY_PERMISSION_ACCESS_ALL = 100

    ...

    override fun onCreate(savedInstanceState: Bundle?) {
        
        ...
        
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)

        if (requestCode === MY_PERMISSION_ACCESS_ALL) {
            if (grantResults.size > 0) {
                for (grant in grantResults) {
                    if (grant != PackageManager.PERMISSION_GRANTED) System.exit(0)
                }
            }
        }
    }
}

 

4. 실행 결과

반응형

댓글