Kotlin适配安卓13打开拍照 相册选择动态权限申请

本文介绍了如何在使用Kotlin开发的安卓应用中,针对Android 13系统动态申请拍照和访问相册的权限。通过引入XXPermissions库,详细阐述了在build.gradle中添加依赖、在AndroidManifest.xml中配置权限,以及在代码中请求权限的步骤。

使用XXPermissions资源库来申请权限

1.在build.gradle文件添加依赖

    implementation 'com.github.getActivity:XXPermissions:18.5'

2.在AndroidManifest.xml文件中添加相关权限

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
        android:maxSdkVersion="32"/>
  <uses-permission android:name="android.permission.CAMERA"
        tools:ignore="PermissionImpliesUnsupportedChromeOsHardware" />
  <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

3.在需要申请权限地方添加下面代码

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU){//sdk大于等于33
            permissions.add( Manifest.permission.CAMERA)
            permissions.add( Manifest.permission.READ_MEDIA_IMAGES)
            permissions.add( Manifest.permission.WRITE_EXTERNAL_STORAGE)
### Android 11 系统相机拍照打开相册适配方法 #### 权限处理 在Android 11中,为了保护用户隐私,应用需要更严格地遵循分区存储原则。因此,在尝试访问媒体文件之前,必须先请求必要的权限。 对于从相册选择照片的操作,需申请读取外部存储的权限: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE); } ``` 此外,针对Android 11及以上版本,还需要声明`MANAGE_EXTERNAL_STORAGE`权限来获取对整个共享存储空间的完全访问权[^2]。 #### 使用 `MediaStore API` 由于Android 11实施了严格的分区存储策略,传统的路径方式不再适用。推荐采用`MediaStore API`来进行图片的选择与保存工作。下面给出一段用于启动图库选取图片并将其返回给应用程序的代码片段: ```java Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, PICK_IMAGE_REQUEST); ``` 当涉及到拍摄新照片时,则应指定一个临时的内容URI作为目标地址,并通过该URI完成后续的数据交互过程。 #### 创建 Content URI 考虑到不同API级别的兼容性差异,特别是自Android 7.0起引入的安全机制——即不允许直接暴露真实文件路径的情况下,应当利用`FileProvider`组件生成安全可控的内容URI。具体做法是在项目的`res/xml/`目录下定义名为`provider_paths.xml`的配置文件,其中指定了允许被映射成Content Uri的具体路径模式;接着更新清单文件(`AndroidManifest.xml`)注册对应的`FileProvider`服务实例[^3]。 以下是设置`FileProvider`的一个例子: ```xml <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> ``` 同时,在Java/Kotlin端构建实际使用的Content Uri对象如下所示: ```kotlin val photoFile: File? = try { createImageFile() } catch (ex: IOException) { null } photoUri = FileProvider.getUriForFile( this, "com.example.android.fileprovider", photoFile!! ) takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri) ``` 这里假设已经实现了辅助函数`createImageFile()`用来创建一个新的图像文件实体[^5]。 #### 图片方向修正与优化 值得注意的是,某些设备可能会遇到所选或拍下的图片旋转角度不对的问题。这通常是因为EXIF元数据中的方位信息未得到妥善处理所致。为此,可以考虑借助第三方库(如Glide、Picasso等)自动解析这些属性并对Bitmap做相应调整[^4]。 另外,为了避免因原图尺寸过大而导致OOM错误的发生,建议事先设定合理的最大宽高限制,并据此比例缩小原始输入源后再显示出来。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z_Try

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值