티스토리 뷰

Android App Coding

안드로이드 권한 Permission

IT Knowledge Share 2021. 7. 18. 20:45
반응형

앱을 사용하다보면, 권한을 묻는 경우가 많습니다.

 

권한은 일반 권한 및 위험 권한으로 나뉘는데, 일반 권한은 인터넷 사용 권한과 같은 것으로, Manifest.xml 파일에 등록만 하면 바로 사용이 가능합니다.

 

위험 권한은 개인 정보 및 프라이버시와 관련된 권한들로 저장소, 카메라, 연락처 등을 말합니다. 이러한 권한은 사용자로부터 '허락'을 받아야 권한과 연계된 기능을 사용할 수 있습니다.

 

권한을 얻는 타이밍은 앱을 설치하자마 필요한 권한을 묻는 경우와 특정 기능을 사용하려고 할 때 묻는 경우가 있는데, 앱 개발 시 구글 정책상 특정 기능을 사용할 때 권한을 묻게 하도록 코딩하는 것이 가장 좋습니다.

 

그럼 권한을 어떻게 사용하는 직접 알아 봅니다.

 

우선 Manifest.xml 파일에 카메라 권한을 허용할 수 있도록 코딩해줍니다.

<uses-permission android:name="android.permission.CAMERA" />
반응형

그리고 권한을 연습할 액티비티 파일을 만들어 줍니다.

액티비티에 연관된 레이아웃 파일에 권한을 묻는 버튼을 하위뷰로 넣어줍니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".PermissionActivity">


    <Button
        android:id="@+id/permission_btn"
        android:layout_width="100dp"
        android:layout_height="100dp" />


</LinearLayout>

그럼 액티비티 파일을 확인해 봅니다. 아래 클래스에서 보다시피, permission_btn을 클릭 시 권한을 물을 수 있도록 코딩해줍니다. 리스너 안에 PermissionCheck 변수를 선언합니다. 

 

ContextCompat의 checkSelfPermission 메소드는 액티비티와 권한의 종류를 인자로 받게 됩니다.

해당 메소드는 권한을 요청하도록 도와주는 메소드로, 액티비티는 context를 통해 가져오고, android.Manifest.permission에서 CAMERA 권한을 가져옵니다.

 

PermissionCheck에서 Integer 타입의 카메라 권한을 가져오면, PackageManager.PERMISSION_GRANTED와 같은지 if문을 통해서 비교합니다. 패키지 매니저의 PERMISSION_GRANTED 또한 정수 타입이므로 일치하면 권한이 있는 것이고, 일치하지 않으면 권한을 얻어야 합니다.

 

일치하지 않는 다면(!=), ActivityCompat.requestPermissions을 통해 권한을 요청하는데, 인자로는 액티비티(this), 얻으려는 권한, 요청 코드가 오게됩니다. 요청 코드는 아무렇게 설정하면 되며, 이 코드 '200'은 나중에 onRequestPermissionResult 메소드에서 사용될 것입니다.

얻으려는 권한은 Array 리스트에서 가져와야 하므로, arrayOf 함수를 사용합니다.

class PermissionActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_permission)


        permission_btn.setOnClickListener {
            val PermissionCheck = ContextCompat.checkSelfPermission(
                this@PermissionActivity,
                android.Manifest.permission.CAMERA
            )
            if (PermissionCheck != PackageManager.PERMISSION_GRANTED) {
                
                ActivityCompat.requestPermissions(
                    this,
                    arrayOf(android.Manifest.permission.CAMERA),
                    200
                )
            } else {
                
                Log.d("permission_acquired", "권한 획득")
            }
        }
    }

이제 권한을 물어보면, 사용자의 반응에 따라 기능이 실행되어야 합니다. 메소드 오버라이딩을 실행하면, onRequestPermissionResult 함수가 있는데, 해당 함수를 오버라이딩합니다.

 

requestCode의 일치 여부에 따라, 카메라 요청에 관한 권한을 승낙 또는 거부한 경우로 코딩을 했습니다.

현재 요청받는 권한은 카메라 하나이므로, grantResults[0]는 당연히 Array 리스트의 0번째, 즉 카메라 권한 요청이 와야 합니다. 

override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == 200) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //권한 승낙
                Log.d("accept", "권한 승낙")
            } else {
                //권한 거부
                Log.d("deny", "권한 거부")
            }
        }

이렇게 간단하게 권한에 대한 설명을 마치겠습니다.

반응형
댓글