Android 퍼미션

timothy jeong·2021년 11월 3일
0

Android with Kotlin

목록 보기
14/69

퍼미션은 앱의 특정 기능에 부여하는 접근 권한을 말한다. 내가 개발하는 앱이 다른 앱이나 안드로이드 시스템에서 보호하는 특정 기능을 이용할 때 퍼미션 사용을 설정해야한다. 마찬가지로 내가 만든 기능을 다른 앱에서 사용할 수 없도록 보호하고 권한을 얻은 앱에서만 허용하고 싶을 때 퍼미션을 설정한다.

퍼미션 설정과 사용 설정

퍼미션은 메니페스트 파일에 설정한다. 즉, 내가 만든 앱의 컴포넌트에 대한 퍼미션을 설정하는 것이다.

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

  <permission android:name="com.example.testmodule.WHOLE_PERMISSION"
        android:label="Test Permission"
        android:description="test permission"
        android:protectionLevel="dangerous"/>
    
  <application ...>
  </application>
  
  • name : 퍼미션의 이름(퍼미션을 구별하는 식별자 이므로 자세히 설정)
  • label, description : 퍼미션 설명
  • protectionLevel : 보호 수준

protectionLevel

  • normal : 사용자에게 권한 허용을 요청하지 않아도 된다.
  • dangerous : 사용자에게 권한 허용을 요청해야 한다.
  • signature : 같은 키로 인증한 앱만 실행한다.
  • signatureOrSystem : 안드로이드 시스템 앱이거나 같은 키로 인증한 앱만 실행한다.

퍼미션이 필요한 기능에 접근하는 방법은 다음과 같다.

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

안드로이드 시스템이 보호하는 대표적인 기능은 다음과 같다.

permission 이름permission 내용
ACCESS_FINE_LOCATION위치 정보 접근
ACCESS_NETWORK_STATE네트워크 정보 접근
ACCESS_WIFI_STATE와이파이 네트워크 정보 접근
BATTERY_STATUS배터리 정보 접근
BLUETOOTH블루투스 장치에 연결
BLUETOOTH_ADMIN블루투스 장치를 검색하고 페어링
CAMERA카메라 장치에 접근
INTERNET네트워크 연결
READ_EXTERNAL_STORAGE외부 저장소에서 파일 읽기
WRITE_EXTERNAL_STORAGE외부 저장소에 파일 쓰기
READ_PHONE_STATE전화기 정보 접근
SEND_SMS문자 메시지 발신
RECEIVE_SMS문자 메시지 수신
RECEIE_BOOT_COMPLETED부팅 완료 시 실행
VIBRATE진동 울리기

퍼미션 허용 확인

<uses-permission> 으로 메니페스트 파일에 설정하였더라도, 요청한 permission 이 normal 등급이 아니라면 사용자의 허가를 받아야한다. 따라서 코드상에서 이 앱이 사용자에게 permission 을 얻었는지, 얻지 않았는지 확인할 필요가 있다.

아래의 함수를 이용해서 퍼미션이 허가됐는지 확인한다.

ContextCompat.checkSelfPermission(context : Context, permission : String)
fun permissionCheck(context: Context, permission : String): String {
    if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED) {
      return "$permission : permission granted"
    }
    return "$permission : permission denied"
}

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        println ( """ ${permissionCheck(this, Manifest.permission.ACCESS_NETWORK_STATE)}
            ${permissionCheck(this, Manifest.permission.ACCESS_COARSE_LOCATION)}
            ${permissionCheck(this, Manifest.permission.ACCESS_FINE_LOCATION)}""".trimIndent())
}

퍼미션 허용 요청

requestPermission() 함수를 이용한다. onRequestPermissionsResul 함수를 override 하면 permission 요청후 결과 값을 확인할 수 있다.

requestPermission(activity: Activity, 
permissions: Array<String!>,
requestCode: Int) : Unit
ActivityCompat.requestPermissions(this, arrayOf<String>("android.permission.ACCESS_FINE_LOCATION"), 100)

override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Log.d("info", "permission granted")
        } else {
            Log.d("info", "permission denied")
        }
    }
profile
개발자

0개의 댓글