[Android Studio] 10장 - 퍼미션 설정하기

이상협·2022년 9월 9일
0

안드로이드스튜디오

목록 보기
38/43

퍼미션

앱의 특정 기능에 부여하는 접근 권한을 말한다.
내가 개발하는 앱이 다른 앱이나 안드로이드 시스템에서 보호하는 특정 기능을 이용할 때 퍼미션 사용을 설정해야 한다.

퍼미션 설정과 사용 설정

퍼미션 설정

앱의 컴포넌트를 보호하고 싶을 때 manifest 파일에서 퍼미션을 설정할 수 있다.

/*
name: 퍼미션의 이름
label, description: 퍼미션을 설명
protectionLevel: 보호 수준
*/
<permission android:name="com.example.permission.TEST_PERMISSION"
    android:label="Test Permission"
    android:description="@string/permission_desc"
    android:protectionLevel="dangerous" />

protectionLevel 속성값

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

퍼미션 사용 설정

// manifest 파일
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

ACCESS_NETWORK_STATEACCESS_FINE_LOCATION은 시스템에 선언된 퍼미션으로 각각 네트워크에 접근하고 사용자 위치를 추적하는 데 필요하다.
각각의 protectionLevel은 normaldangerous이다.

컴포넌트에 퍼미션 적용

manifest 파일에 permission을 설정했다고 해서 컴포넌트가 보호되지는 않는다.
이 퍼미션으로 보호하려는 컴포넌트에 적용을 해야 한다.

<activity android:name=".OneActivity"
    android:permission="com.example.TEST_PERMISSION">
  <intent-filter>
    <action android:name="android.intent.action.PICK" />
  </intent-filter>
</activity>

이 컴포넌트는 com.example.TEST_PERMISSION에 의해 보호되며 이 컴포넌트를 이용하는 곳에서는 manifest 파일에 uses-permission 태그를 선언해 줘야 정상적으로 실행이 된다.

안드로이드 시스템에서 보호하는 기능

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

퍼미션 허용 확인

퍼미션이 API 레벨 23버전부터 정책이 바뀌어서 그 이전 버전에서는 uses-permission 태그로 선언만 하면 기능을 사용하는 데 문제가 없었지만, 23버전부터 허가제로 바뀌었다.
개발자가 uses-permission 태그로 선언했더라도 사용자가 권한 화면에서 이를 거부할 수 있게 되었다.

  • 사용자가 퍼미션을 허용했는지 확인하려면 checkSelfPermission() 함수를 사용
open static fun checkSelfPermission(
	@NonNull context: Context,
    @NonNull permission: String
): Int

두 번째 매개변수가 퍼미션을 구분하는 이름이고, 결괏값은 상수로 전달된다.

  • PackageManager.PERMISSION_GRANTED: 권한을 허용한 경우
  • PackageManager.PERMISSION_DENIED: 권한을 거부한 경우
  • 퍼미션 허용 확인 예
val status = ContextCompat.checkSelfPermission(this,
    "android.permission.ACCESS_FINE_LOCATION")
if(status == PackageManager.PERMISSION_GRANTED) {
    Log.d("gildong", "permission granted")
} else {
	Log.d("gildong", "permission denied")
}

퍼미션 허용 요청

퍼미션을 거부한 상태라면 사용자에게 해당 퍼미션을 허용해 달라고 요청해야한다.

  • ActivityResultLauncher를 사용
액티비티에서 결과를 돌려받아야 할 때 사용
대표적으로 퍼미션 허용 요청과 다른 액티비티를 실행하고 결과를 돌려받을 때 사용
  • ActivityResultLauncher 객체는 registerForActivityResult() 함수를 호출해서 만듬
public final<I, O> ActivityResultLauncher<I> 
	registerForActivityResult(
    	@NonNull ActivityResultContract<I, O> contract,
        @NonNull ActivityResultCallback<O> callback)
  • registerForActivityResult() 함수는 매개변수가 2개로
    첫번째는 어떤 요청인지를 나타내는 객체이며, 다양한 요청에 대응하는 서브 클래스들이 있다.
    • 다른 액티비티를 실행하고 결과를 돌려받을 때
      StartActivityForResult
    • 퍼미션 허용을 요청할 때
      RequestPermission
  • 두번째 매개변수는 결과를 받았을 때 호출되는 콜백이다.

퍼미션 허용 요청 확인

val requestPermissionLauncher = registerForActivityResult(
	ActivityResultContracts.RequestPermission()
) { isGranted ->
	if (isGranted) {
    	Log.d("test", "callback, granted..")
    } else {
    	Log.d("test", "callback, denied..")
    }
}

퍼미션 허용 요청 실행

requestPermissionLauncher.launch("android.permission.ACCESS_FINE_LOCATION")

요청 결과는 registerForActivityResult() 함수의 두 번째 매개변수로 등록한 콜백으로 전달된다.


참고

  • Do it! 깡쌤의 안드로이드 프로그래밍 with 코틀린 (개정판)

0개의 댓글