2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Android】Android 13から始める revokeOwnPermissionOnKill

Last updated at Posted at 2022-03-23

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アプリ内かざして検索にてカメラを利用しているのでスクショを添付

  1. Requestボタンでカメラの権限リクエスト
  2. Revokeボタンで権限の取り消しリクエスト
  3. アプリを一度キルして再度立ち上げる
Request Revoke
request.png revoke.png

最後に

単体だけでなく、複数権限を同時に取り消すことも可能でした。
また、取り消しリクエスト後もexitProcess(0)を呼ぶのは現実的ではないと思うので、ユーザーにアプリキルを促す体験など込みで考える必要がありそうです。
利用ケースとしては、特定の権限ありきで提供していた機能の削除時に呼んでおくといったところでしょうか。ユーザーと開発者の双方にとってメリットになる機能なので積極的に取り込んでいけると良さそうです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?