본문 바로가기

DEV/JAVA&Android

안드로이드 11 권한 자동 삭제 기능 대응(Auto Revoke Permissions)

Android 11에서 추가되었던 권한 자동삭제 기능을 대응하는 로직.

기존까진 문제가 없어서 추가하지 않고 있다가 최근에 권한 자동 삭제 기능으로 추정되는 문제가 발생해 추가하면서 로그성 포스팅입니다.

 

이 기능에 영향을 받는 권한은 런타임 권한으로, 흔히 앱에서 shouldShowRequestPermissionRationale을 이용해 사용자에게 허락을 구하는 권한들이 영향을 받게됩니다.

 

Android 11용 API

- Android 11이상에서만 동작하는 로직입니다.

fun autoRevokePermissionCheck(context: Context) {
	val TAG = "autoRevokePermissionCheck"
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        if (!context.packageManager.isAutoRevokeWhitelisted) {
            Log.d(TAG, "AUTO_REVOKE_PERMISSION : FALSE -> 사용하지 않는 앱 권한 삭제 기능 사용 중. 설정 화면으로 이동")
			val intent = Intent(Intent.ACTION_AUTO_REVOKE_PERMISSIONS)
            intent.data = Uri.fromParts("package", context.packageName, null)
            context.startActivity(intent)
        }
        else {
            Log.d(TAG, "AUTO_REVOKE_PERMISSION : TRUE -> 사용하지 않는 앱 권한 삭제 기능 화이트리스트 등록됨.")
        }
    }
}

 

크로스 플랫폼 API

2021년 12월 부터 Android11이상을 포함한 Android 6.0부터 10버전까지의 모든 안드로이드에서 Google Play Services를 통해 기능이 확대되어 Android 6.0이상을 지원하는 앱에선 해당 로직을 사용하면 됩니다.

 

fun autoRevokePermissionCheck(context: Context, activity: Activity) {
	val TAG = "autoRevokePermissionCheck"
	val future = PackageManagerCompat.getUnusedAppRestrictionsStatus(context)
    future.addListener({
        when (future.get()) {
            UnusedAppRestrictionsConstants.DISABLED -> {
                Log.d(TAG, "AUTO_REVOKE_PERMISSION : TRUE -> 사용하지 않는 앱 권한 삭제 기능 화이트리스트 등록됨.")
            }
            UnusedAppRestrictionsConstants.API_30_BACKPORT,
            UnusedAppRestrictionsConstants.API_30,
            UnusedAppRestrictionsConstants.API_31 -> {
                Log.d(TAG, "AUTO_REVOKE_PERMISSION : FALSE -> 사용하지 않는 앱 권한 삭제 기능 사용 중. 설정 화면으로 이동")
                val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, context.packageName)
                activity.startActivityForResult(intent, MasterActivity.AUTO_REVOKE_PERMISSION)
            }
        }
    }, ContextCompat.getMainExecutor(context))
}

 

위의 크로스 플랫폼 API는 Jetpack Core 라이브러리 v1.7.0 이상에서 지원됩니다.

 

// build.gradle
implementation "androidx.core:core-ktx:$core_version"
implementation "com.google.guava:guava:31.0.1-android"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.6.0"
// To use CallbackToFutureAdapter
implementation "androidx.concurrent:concurrent-futures:1.1.0"
반응형