Fragment与Activity权限申请详解:秒懂权限动态申请!
2023-02-19 18:23:18
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()
方法检查应用是否已获得特定权限。
- 可以使用