Skip to content

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"

image.pngimage.png 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>

image.png

权限请求框架

『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框架加载图片到我们的界面上 image.png 通过Glide框架加载图片到我们的界面上

java
Glide.with(AddActivity.this).
    load(Uri.fromFile(new File(result.get(0).getRealPath())))
    .into(binding.addShopImg);