20.相机权限
动态权限
Android 中的权限 | Android 开发者 | Android Developers
权限类型
Android 将权限分为不同的类型,包括安装时权限、运行时权限和特殊权限 安装时权限
- 一般权限
- 签名权限。
运行时权限 特殊权限
运行时权限
运行时权限也称为危险权限,此类权限授予应用对受限数据的额外访问权限,或允许应用执行对系统和其他应用具有更严重影响的受限操作。因此,您需要先在应用中请求运行时权限,然后才能访问受限数据或执行受限操作。
PictureSelector 3.0
一款针对Android平台下的图片选择器,支持从相册获取图片、视频、音频&拍照,支持裁剪(单图or多图裁剪)、压缩、主题自定义配置等功能,支持动态获取权限&适配Android 5.0+系统的开源图片选择框架。 https://github.com/LuckSiege/PictureSelector/blob/version_component/README_CN.md
groovy
// PictureSelector 基础 (必须)
implementation 'io.github.lucksiege:pictureselector:v3.10.7'
// 图片压缩 (按需引入)
implementation 'io.github.lucksiege:compress:v3.10.7'
// 图片裁剪 (按需引入)
implementation 'io.github.lucksiege:ucrop:v3.10.7'
// 自定义相机 (按需引入)
implementation 'io.github.lucksiege:camerax:v3.10.7'
除此之外我们还需要引入Glide网络图片权限依赖
groovy
//引入第三方库glide
implementation 'com.github.bumptech.glide:glide:4.13.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.13.0'
然后在Menifest.xml文件中需要加入权限
xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
Android 13版本适配,细化存储权限
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
Android 11 读取用户SD卡需要单独配置
xml
android:requestLegacyExternalStorage="true"
Android 11 使用相机,需要再AndroidManifest.xm 添加如下代码:与Application标签同级
xml
<queries package="${applicationId}">
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE">
</action>
</intent>
<intent>
<action android:name="android.media.action.ACTION_VIDEO_CAPTURE">
</action>
</intent>
</queries>
权限请求框架
『Android基础入门』手电筒GitHub - getActivity/XXPermissions: Android 权限请求框架,已适配 Android 13 请求权限,读存储卡,写存储卡,相机,录音权限
java
XXPermissions.with(this)
.permission(Permission.READ_EXTERNAL_STORAGE)
.permission(Permission.WRITE_EXTERNAL_STORAGE)
.permission(Permission.RECORD_AUDIO)
.permission(Permission.CAMERA)
.request((permissions, all) -> {
if(!all){
Toast.makeText(AddActivity.this,"获取部分权限成功,但部分权限未正常授予",Toast.LENGTH_SHORT).show();
return;
}
Toast.makeText(AddActivity.this,"获取所有权限成功,但部分权限未正常授予",Toast.LENGTH_SHORT).show();
});
拍照
监听一个点击事件、,实现拍照
java
binding.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PictureSelector.create(AddActivity.this)
.openCamera(SelectMimeType.ofImage())
.forResult(new OnResultCallbackListener<LocalMedia>() {
@Override
public void onResult(ArrayList<LocalMedia> result) {
//返回的是一个列表因为可能会选择多张图片
//打印图片默认保存的路径
Log.d(TAG, "onResult: "+result.get(0).getRealPath());
}
@Override
public void onCancel() {
}
});
}
});
返回图片路径,并不是直接返回图片。因此我们可以通过Glide框架加载图片到我们的界面上 通过Glide框架加载图片到我们的界面上
java
Glide.with(AddActivity.this).
load(Uri.fromFile(new File(result.get(0).getRealPath())))
.into(binding.addShopImg);