안드로이드/개발관련(Kotlin)

안드로이드 권한(Permisson) 요청

닉네임못짓는사람 2022. 2. 8. 09:44
반응형

안드로이드를 통한 개발 시 특정 기능을 사용하기 위해선 Manifest파일에 권한을 선언해야 한다.

이번 글에서는 Manifest파일에 권한을 선언하는 방법, 위험 권한을 사용자에게 요청하는 방법 등에 대해 알아보자.

 

권한 등급


안드로이드에서의 권한은 일반 권한, 위험 권한, 서명 권한의 세 가지 보호 수준으로 나뉜다.

또한 각 수준마다 앱 사용 시 사용자에게 권한을 요청하여야만 해당 권한을 사용하는 기능이 제대로 동작할 수 있다.

 

일반 권한(Normal Permission)


일반 권한에는 인터넷(INTERNET), 블루투스 상태 확인(BLUETOOTH), 기기 간 근거리 통신 사용(NFC)등의 권한이 있으며,

앱 설치 시 사용자에게 권한 승인을 결정하는 팝업창을 보여준다.

 

권한 선언은 Manifest파일에 아래와 같이 작성하여 선언할 수 있다.

<uses-permission android:name="android.permission.INTERNET"/>

먼저 uses-permission이라는 태그를 사용하고, name이후 큰따옴표(") 안에 필요한 권한을 명시한다.

위에서는 인터넷 사용 권한을 선언한 것이다.

 

위험 권한(Dangerous Permission)


위험 권한은 사용자의 개인정보나 다른 앱 및 기기의 작동에 영향을 줄 수 있는 권한들이다.

카메라, 기기 저장소, 통화 관련 등의 권한이 이에 속한다.

 

위험 권한의 경우 일반 권한과 달리 개발자가 코드를 작성하여 사용자에게 권한을 요청하여야 한다.

코드를 통해 사용자에게 위치 정보를 요청하는 방법에 대해 알아보도록 하자.

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

먼저 Manifest파일에 위의 두 권한을 선언해준다.

 

그 뒤, MainActivity로 가서 사용자에게 권한을 요청하는 코드를 작성한다.

private fun checkPermissions(){
    val locPermission = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION)
    if(locPermission != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION), requestCode)
    }
}

일단 사용자의 기기에 설치된 앱이 해당 권한을 가지고 있는지 확인한다.

위치 권한의 경우 Manifest파일에선 ACCESS_FINE_LOCATION과 ACCESS_COARSE_LOCATION을 선언했지만

사용자에게 권한을 요청할 경우 ACCESS_FINE_LOCATION만 요청해주어도 된다.

 

앱이 권한을 가지고 있지 않다면 ActivityCompat.requestPermissions를 통해 사용자에게 권한을 요청한다.

이때 들어가는 인자로는 context, 권한 목록(배열), 요청 코드가 있다.

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if(requestCode == this.requestCode){
        if(grantResults.size > 0){
            grantResults.forEach {
                if(it != PackageManager.PERMISSION_GRANTED){
                    Toast.makeText(this, "권한이 거부되었습니다.", Toast.LENGTH_SHORT).show()
                    System.exit(0)
                }
            }
        }
    }
}

그다음 onRequestPermissionsResult함수를 override 하여

사용자가 권한을 승인하거나 거부했을 때 수행할 동작을 설정할 수 있다.

위 코드에선 사용자가 권한을 거부했을 경우 앱을 종료하도록 자성했다.

 

전체 코드

package com.example.example

import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.*
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.example.example.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private val requestCode = 101

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

        checkPermissions()
    }

    private fun checkPermissions(){
        val locPermission = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION)
        if(locPermission != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION), requestCode)
        }
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if(requestCode == this.requestCode){
            if(grantResults.size > 0){
                grantResults.forEach {
                    if(it != PackageManager.PERMISSION_GRANTED){
                        Toast.makeText(this, "권한이 거부되었습니다.", Toast.LENGTH_SHORT).show()
                        System.exit(0)
                    }
                }
            }
        }
    }
}

 

서명 권한(Signature Permission)


서명 권한은 권한을 사용하려는 앱(B)과 다른 앱(A)이 동일한 인증서로 서명되어 있을 경우

A의 권한이 B앱에 부여되어 A에 선언된 권한을 사용할 수 있는 것이다.

반응형