返回

无痛解决Android权限申请痛点:Activity Result API详解

Android

前言

权限申请,可谓是Android开发中绕不过的一道坎。繁琐的代码、复杂的使用场景,令开发者们叫苦不迭。而Activity Result API的出现,无疑为我们带来了曙光,它提供了一种简便易用的权限申请方式,让开发者的工作变得更加轻松。

Activity Result API概览

Activity Result API是一个在Android 4.3及以上版本中引入的框架,它允许Activity、Fragment请求和接收其他Activity或Fragment的结果。其中,权限申请就是Activity Result API的一个重要应用场景。

Activity Result API的工作原理是使用一个名为ActivityResultLauncher的对象来启动一个新的Activity或Fragment。该对象可以用来请求权限,而当权限申请完成后,结果将返回给启动者。

单权限申请

使用Activity Result API进行单权限申请非常简单。首先,我们需要创建一个ActivityResultLauncher对象,并将其与我们想要请求的权限关联起来。然后,我们可以调用ActivityResultLauncher对象的launch()方法来启动权限申请流程。

val launcher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
    if (isGranted) {
        // 权限已授予
    } else {
        // 权限被拒绝
    }
}

launcher.launch(Manifest.permission.CAMERA)

多权限申请

如果我们需要同时申请多个权限,可以使用ActivityResultContracts.RequestMultiplePermissions()合约。该合约允许我们一次性请求多个权限,并接收一个Map<String, Boolean>类型的结果,其中键是权限名称,值是权限是否被授予。

val launcher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { result ->
    result.forEach { permission, isGranted ->
        if (isGranted) {
            // 权限已授予
        } else {
            // 权限被拒绝
        }
    }
}

launcher.launch(arrayOf(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO))

处理特殊场景

在某些情况下,我们需要处理一些特殊场景,例如权限被永久拒绝或权限申请被取消。Activity Result API提供了对应的回调方法,让我们可以对这些场景进行处理。

  • 权限被永久拒绝 :当用户选择“不再询问”时,权限会被永久拒绝。我们可以通过ActivityResultLauncher的getShouldShowRequestPermissionRationale()方法来判断权限是否被永久拒绝。
  • 权限申请被取消 :当用户点击后退按钮或系统对话框关闭时,权限申请会被取消。我们可以通过ActivityResultLauncher的getResultCode()方法来判断权限申请是否被取消。

结论

Activity Result API为Android权限申请提供了便捷高效的方式。通过使用ActivityResultLauncher对象,我们可以轻松发起单权限或多权限申请,并对特殊场景进行处理。如果您还没有使用过Activity Result API,强烈建议您在下一个项目中尝试一下,相信它将极大地简化您的开发工作。