퍼미션(permission)

Hyeon·2023년 4월 19일
0

Android

목록 보기
11/15

퍼미션(permission)이란?

앱의 특정 기능에 부여하는 접근 권한을 말한다. A 앱과 B 앱이 있을 때 A 앱에서 permission을 설정하지 않으면 B 앱에서 A 앱의 컴포넌트에 접근해 사용할 수 있다. 하지만 A 앱에서 permission을 설정했을 경우 B 앱은 manifest 파일에 <user-permission> 으로 해당 permission을 이용하겠다고 설정해줘야 한다.

  • <permission> : 기능을 보호하려는 앱의 manifest 파일에 설정한다.
  • <user-permission> : permission으로 보호된 기능을 사용하려는 앱의 manifest 파일에 설정한다.

permission 사용 방법

permission 설정

manifest 파일에 <permission> 태그와 아래의 속성을 사용하면 된다.

  • name : permission 의 이름으로 식별자 역할을 한다.
  • label, description : 이 permission을 사용할 외부 앱에서 권한 인증 화면에 출력할 permission의 정보이다.
  • protectionLevel : 보호 수준
    • normal : 낮은 수준의 보호. 사용자에게 권한 요청할 필요 없음
    • dangerous : 높은 수준의 보호. 사용자에게 권한 요청 필수
    • signature : 같은 키로 인증한 앱만 실행된다.
    • signatureOrSystem : 안드로이드 시스템 앱이거나 같은 키로 인증한 앱만 실행된다.
<permission android:name="com.example.permission.TEST_PERMISSON"
	android:label="Test Permission"
	android:description="@string/permission_desc"
	android:protectionLevel="dangerous"/>

permission 사용 설정

예를 들어 아래와 같이 manifest 파일이 설정되어있다고 하자.

  • ACCESS_NETWORK_STATE
    네트워크에 접근하는데 필요하며, protectionLevel이 normal이다.
  • ACCESS_FINE_LOCATION
    사용자 위치를 추적하는데 필요한 protectionLevel이 dangerous이다.
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />                

이렇게 설정하면 앱의 접근 권한 화면에서 protectionLevel이 dangerous 인 것만 보호된다. manifest 파일에 <permission>을 설정하고 컴포넌트에 android:permission 속성을 사용해 적용해야한다.

컴포넌트에 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에 의해 보호되며 이 컴포넌트를 사용하는 곳에서는 <user-permission>을 manifest 파일에 선언해줘야 한다.

permission 사용 설정

<user-permission android:name="com.example.persmission.TEST_PERMISSON" />

permission 허용 확인

checkSelfPermission()

API 레벨 23 이전에는 <user-permission>으로 선언하면 permission을 사용할 수 있었지만, 23 이후에는 사용자로부터 허가를 받아야 한다. checkSelfPermission() 함수를 사용하여 사용자가 permission을 허용했는지 확인할 수 있다.

open static fun checkSelfPermission( 
	@NonNull context: Context, 
    @NonNull permission: String
): Int

두번째 매개변수 permission이 permission을 구분하는 이름이다.

결괏값은 아래 둘 중 하나로 전달된다.

  • PackageManager.PERMISSION_GRANTED: 권한을 허용한경우
  • PackageManager.PERMISSION_DENIED: 권한을 거부한경우

permission 허용 확인 예시

val status = ContextCompat.checkSelfPermission(this,
	"android.permission.ACCESS_FINE_LOCATION")
if ( status = = PackageManager.PERMISSION_GRANTED) {
	Log.d("kkang", "permission granted") 
}else{
	Log.d("Kkang", "permission denied") 
}

사용자에게 permission 허용을 요청할 때는 ActivityResultLauncher 클래스를 이용한다. Activity에서 결과를 돌려받아야 할 때 사용하며 대표적으로 permission 허용과 다른 Activity를 실행하고 결과를 돌려받을 때이다.

registerForActivityResult()

ActivityResultLauncher 객체는 registerForActivityResult() 함수로 만든다.

public final <I, 0> ActivityResultLauncher<I> register
ForActivityResult(
	@NonNlul ActivityResultContract<I, 0> contract,
    @NonNull ActivityResultCallback<0> callback )
  • 매개변수
    • contract
      ActivityResultContract 타입의 객체로 다양한 요청에 대응하는 서브 클래스들이 있다.
      • StartActivityForResult : 다른 Activity를 실행하고 결과를 돌려받을 때
      • RequestPermission : permission 허용을 요청할 때
    • callback
      결과를 받았을 때 호출되는 콜백 함수이다.

permission 허용 요청 확인

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

permission 허용 요청 실행

registerForActivityResult() 함수로 ActivityResultLauncher 객체를 만들면 launch() 함수로 요청을 실행한다.

requestPermissionLauncher.launch("android.permission.ACCESS_FINE_LOCATION)

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

참고자료

  • Do it 안드로이드 도서
profile
컴공학부생입니다.

0개의 댓글