返回

Fragment与Activity权限申请详解:秒懂权限动态申请!

Android

Fragment和Activity权限申请指南:掌控动态权限

在Android开发中,动态权限申请是至关重要的,它允许应用在运行时请求访问特定资源或功能的权限。本文将深入探究在Fragment和Activity中如何申请权限,涵盖文件读写、相册和相机等常见权限,以及Android 11及以上版本的权限申请变化。

Fragment中权限申请

Android 11及以下版本

在Android 11及以下版本中,Fragment中权限申请与Activity类似。只需在Fragment中调用requestPermissions()方法即可。

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == REQUEST_CODE_WRITE_EXTERNAL_STORAGE) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限已授予
        } else {
            // 权限未授予
        }
    }
}

Android 12及以上版本

在Android 12及以上版本中,Fragment中权限申请需要使用registerForActivityResult()方法。

val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { result ->
    if (result.containsValue(false)) {
        // 权限未授予
    } else {
        // 权限已授予
    }
}

requestPermissionLauncher.launch(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE))

Activity中权限申请

Android 11及以下版本

在Android 11及以下版本中,Activity中权限申请与Fragment类似,调用requestPermissions()方法即可。

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == REQUEST_CODE_WRITE_EXTERNAL_STORAGE) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限已授予
        } else {
            // 权限未授予
        }
    }
}

Android 12及以上版本

在Android 12及以上版本中,Activity中权限申请也需要使用registerForActivityResult()方法。

val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { result ->
    if (result.containsValue(false)) {
        // 权限未授予
    } else {
        // 权限已授予
    }
}

requestPermissionLauncher.launch(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE))

常见权限申请

文件读写权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

相册权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

相机权限

<uses-permission android:name="android.permission.CAMERA" />

Android 11及以上版本权限申请变化

Android 11

新增ACCESS_BACKGROUND_LOCATION权限,允许在后台访问位置信息。

Android 12

新增BLUETOOTH_SCAN权限,允许扫描蓝牙设备。

Android 13

新增NEARBY_WIFI_DEVICES权限,允许扫描附近的Wi-Fi设备。

结论

本文深入介绍了在Fragment和Activity中如何申请权限,涵盖了常见权限以及Android 11及以上版本的权限申请变化。通过掌握这些知识,开发者可以确保他们的应用以安全且合规的方式访问必要的资源,从而提升用户体验。

常见问题解答

  • 为什么需要动态权限申请?

    • 动态权限申请允许应用在运行时请求权限,而不是在安装时一次性请求所有权限。这提供了更好的用户控制,并允许应用在需要时仅获取必要的权限。
  • 为什么Android 11及以上版本权限申请有所变化?

    • Android 11及以上版本引入了更严格的隐私保护措施,旨在为用户提供对应用访问敏感信息和功能的更多控制。
  • 如何在Fragment中申请多个权限?

    • 使用requestPermissions()方法时,可以传递一个字符串数组,其中包含要请求的所有权限。
  • 如何在Activity中取消权限请求?

    • 可以使用revokePermissions()方法取消应用已获得的权限。
  • 如何检查应用是否拥有特定的权限?

    • 可以使用checkSelfPermission()方法检查应用是否已获得特定权限。