앱의 특정 기능에 부여하는 접근 권한을 말한다. A 앱과 B 앱이 있을 때 A 앱에서 permission을 설정하지 않으면 B 앱에서 A 앱의 컴포넌트에 접근해 사용할 수 있다. 하지만 A 앱에서 permission을 설정했을 경우 B 앱은 manifest 파일에 <user-permission> 으로 해당 permission을 이용하겠다고 설정해줘야 한다.
manifest 파일에 <permission> 태그와 아래의 속성을 사용하면 된다.
<permission android:name="com.example.permission.TEST_PERMISSON"
android:label="Test Permission"
android:description="@string/permission_desc"
android:protectionLevel="dangerous"/>
예를 들어 아래와 같이 manifest 파일이 설정되어있다고 하자.
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
이렇게 설정하면 앱의 접근 권한 화면에서 protectionLevel이 dangerous 인 것만 보호된다. manifest 파일에 <permission>을 설정하고 컴포넌트에 android: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 파일에 선언해줘야 한다.
<user-permission android:name="com.example.persmission.TEST_PERMISSON" />
API 레벨 23 이전에는 <user-permission>으로 선언하면 permission을 사용할 수 있었지만, 23 이후에는 사용자로부터 허가를 받아야 한다. checkSelfPermission() 함수를 사용하여 사용자가 permission을 허용했는지 확인할 수 있다.
open static fun checkSelfPermission(
@NonNull context: Context,
@NonNull permission: String
): Int
두번째 매개변수 permission이 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를 실행하고 결과를 돌려받을 때이다.
ActivityResultLauncher 객체는 registerForActivityResult() 함수로 만든다.
public final <I, 0> ActivityResultLauncher<I> register
ForActivityResult(
@NonNlul ActivityResultContract<I, 0> contract,
@NonNull ActivityResultCallback<0> callback )
val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted ->
if (isGranted) {
Log.d("Kkang", "callback, granted..")
} else {
Log.d("kkang", "callback, denied..")
}
}
registerForActivityResult() 함수로 ActivityResultLauncher 객체를 만들면 launch() 함수로 요청을 실행한다.
requestPermissionLauncher.launch("android.permission.ACCESS_FINE_LOCATION)
요청 결과는 registerForActivityResult() 함수의 두번째 매개변수인 콜백함수로 전달된다.