revokeOwnPermissionOnKill とは
Android13 DP2(Tiramisu)から追加された機能で、Runtime Permissionを意図的に削除させることができます。
ちなみに、DP1ではselfRevokePermissionと呼ばれていたのでStable時には変わっている可能性は大いにありそうです。
以下抄訳↓
- 1つ以上の権限を取り消すトリガー
- 取り消しは、非同期で行われる
- アプリがフォアグラウンドにいる間や、他のアプリがContentProviderにアクセスしている場合はトリガーは発火しない
- すぐ実行して欲しい場合は、 プロセスを終了させる
Process.kt
exitProcess(0)
実際に試してみる
1. target sdkをTiramisuDP2以上に設定する
build.gradle
android {
compileSdkVersion "android-Tiramisu"
defaultConfig {
targetSdkVersion "Tiramisu"
minSdkVersion "Tiramisu"
}
}
2. 使用するmoduleのManifestへ任意のpermissionを追加する
AndroidManifest.xml
<uses-permission android:name="android.permission.CAMERA" />
3. permissionのrequestとrevoke処理を追加する
MainActivity.kt
companion object {
// Permission
private val PERMISSION_REQUIRED = Manifest.permission.CAMERA
}
private val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
if (isGranted) {
// granted
} else {
// not granted
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
permitRequestBtn.setOnClickListener {
if (ContextCompat.checkSelfPermission(context, PERMISSION_REQUIRED) != PackageManager.PERMISSION_GRANTED) {
// request
requestPermissionLauncher.launch(PERMISSION_REQUIRED)
}
}
permitRevokeBtn.setOnClickListener {
if (ContextCompat.checkSelfPermission(context, PERMISSION_REQUIRED) == PackageManager.PERMISSION_GRANTED) {
// revoke
context.revokeOwnPermissionOnKill(PERMISSION_REQUIRED)
}
}
}
4. 試してみる
※わかりやすい例として、HOME'Sアプリ内かざして検索にてカメラを利用しているのでスクショを添付
- Requestボタンでカメラの権限リクエスト
- Revokeボタンで権限の取り消しリクエスト
- アプリを一度キルして再度立ち上げる
Request | Revoke |
---|---|
最後に
単体だけでなく、複数権限を同時に取り消すことも可能でした。
また、取り消しリクエスト後もexitProcess(0)を呼ぶのは現実的ではないと思うので、ユーザーにアプリキルを促す体験など込みで考える必要がありそうです。
利用ケースとしては、特定の権限ありきで提供していた機能の削除時に呼んでおくといったところでしょうか。ユーザーと開発者の双方にとってメリットになる機能なので積極的に取り込んでいけると良さそうです。