Android11 相机拍照权限,以及解决resolveActivity返回null

news2024/11/23 3:36:26

一、配置拍照和读写权限

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

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

二、手动申请权限

        implementation 'com.permissionx.guolindev:permissionx:1.4.0'

        1、手动申请读写,拍照权限

PermissionX.init(this)
    .permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.CAMERA)
            .request((allGranted, grantedList, deniedList) -> {
                if(allGranted){

                }
            });

        2、手动申请文件管理权限

if (Build.VERSION.SDK_INT >= 30 && !Environment.isExternalStorageManager()) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
    intent.setData(Uri.parse("package:" + getPackageName()));
    startActivity(intent);
}

三、Manifest中配置queries(解决resolveActivity为null)

<application
    ...>
    ...
</application>

<queries>
    <intent>
        <action android:name="android.media.action.IMAGE_CAPTURE"/>
    </intent>
    <intent>
        <action android:name="android.media.action.VIDEO_CAPTURE"/>
    </intent>
</queries>

四、Manifest中配置provider

<application
    ...>
    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="你的package包名.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true"
        tools:replace="android:authorities">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            tools:replace="android:resource"
            android:resource="@xml/file_paths" />
    </provider>
</application>

五、配置file_paths文件

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <!--目录为:Environment.getExternalStorageDirectory()-->
    <external-path
        name="download"
        path="Download" />

    <external-path name="external_files" path="." />
</paths>

六、调用相机(FileUtil类)

public class FileUtil {
    public static String takePhoto(Activity activity) { //照相
        //调用相机
        Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//用来打开相机的Intent
        if(takePhotoIntent.resolveActivity(activity.getPackageManager())!=null){
            //Constant.PIC_DIR = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Download"
            File file=new File(Constant.PIC_DIR);
            if(!file.exists())file.mkdir();
            // 保存路径
            file = getFile(Constant.PIC_DIR, System.currentTimeMillis()+ ".jpg");
            Uri uri;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                //设置7.0以上共享文件,分享路径定义在xml/file_paths.xml
                uri = FileProvider.getUriForFile(activity, "你的package包名.fileprovider", file);
            } else {
                // 7.0以下,共享文件
                uri = Uri.fromFile(file);   // 将路径转换为Uri对象
            }
            takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);    // 表示录制完后保存的录制,如果不写,则会保存到默认的路径,在onActivityResult()的回调,通过intent.getData中返回保存的路径
            //Constant.REQ_CODE为任意整数,用于回调
            activity.startActivityForResult(takePhotoIntent, Constant.REQ_CODE);  // 跳转
            return file.getAbsolutePath();
        }
        return null;
    }

    public static File getFile(String filePath, String fileName){
        File dir = new File(filePath);
        if (!dir.exists()){//如果不存在,进行创建
            dir.mkdirs();
        }
        File soundFile = new File(dir,fileName);
        if (!soundFile.exists()){
            try {
                soundFile.createNewFile();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        return soundFile;
    }

    //通过URI获取file
    public static File getFileFromContentUri(Uri contentUri, Context context) {
        if (contentUri == null) {
            return null;
        }
        File file = null;
        String filePath;
        String[] projection = { MediaStore.Files.FileColumns.DATA };
        ContentResolver contentResolver = context.getContentResolver();
        Cursor cursor = contentResolver.query(contentUri, projection, null,
                null, null);
        if (cursor != null && cursor.moveToFirst()) {
            filePath = cursor.getString(0);
            cursor.close();
            if (!filePath.isEmpty()) {
                file = new File(filePath);
            }
        }
        return file;
    }
}

七、处理拍照 / 本地图片回调(Activity类)

private String curSelectPhoto = "";

//启动相机
private void takePhoto(){
    curSelectPhoto = FileUtil.takePhoto(this);
}

//从本地获取图片
private void getPhotoFromLocal(){
    Intent i = new Intent();
    i.setAction(Intent.ACTION_PICK);
    i.setType("image/*");
    //Constant.PHOTO_LOCAL为任意整数,用于获取本地图片回调
    startActivityForResult(i, Constant.PHOTO_LOCAL);
}

@Override
public void onActivityResult(final int requestCode, int resultCode, final Intent data) {
    super.onActivityResult(requestCode,resultCode,data);
    if(resultCode==RESULT_OK){
        ThreadManager.getThreadPool().exeute(() -> {
            File file=null;
            if(requestCode==Constant.REQ_CODE){    //拍照
                file = new File(curSelectPhoto);
            }else{  //从本地上传
                Uri uri = data.getData();  //图片的保存路径
                file = FileUtil.getFileFromContentUri(uri,getApplicationContext());
            }
        });
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

swagger快速升级方案

背景 在使用SpringBoot 2.6以前去创建API文档工具一般会采用SpringFox提供的Swagger库&#xff0c;但是由于SpringBoot版本的不断升级和SpringFox摆烂不更新&#xff0c;导致了SpringBoot2.6之后的项目无法使用SpringFox去生成API文档&#xff0c;或者可以使用但是有很多的bug…

PyTorch深度学习实战(6)——神经网络性能优化技术

PyTorch深度学习实战&#xff08;6&#xff09;——神经网络性能优化技术 0. 前言1. 数据准备1.1 数据集分析1.2 数据集加载 2. 使用 PyTorch 训练神经网络2.1 神经网络训练流程2.2 PyTorch 神经网络训练 3. 缩放数据集4. 修改优化器5. 构建深层神经网络小结系列链接 0. 前言 …

AcWing167. 木棒(DFS+剪枝)

输入样例&#xff1a; 9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0输出样例&#xff1a; 6 5 解析&#xff1a; DFS 搜索顺序&#xff1a;根据木棒的长度从小到大枚举每根木棒&#xff0c;对于每根木棒&#xff0c;枚举可以由哪些木棍拼成&#xff0c;如果所有的木棍拼成了长度相等的多…

Cisco学习笔记(CCNA)——Equipment Infrastructure Management

Equipment infrastructure management 路由器组件 路由器的组成及功能 CPU&#xff1a;执行操作系统的指令 随机访问存储器&#xff08;RAM内存&#xff09;&#xff1a;RAM中内容断电丢失 只读存储器&#xff08;ROM&#xff09;&#xff1a;开机自检软件&#xff0c;路由…

速锐得智能汽车车身域CANFD控制芯片MCU接口电路原理图

CAN总线技术不仅涉及汽车电子和轨道交通&#xff0c;还涉及医疗器械、工业控制、智能家居和机器人网络互连&#xff0c;这些行业对CAN产品的稳定性和抗干扰能力都有很高的要求。 上篇我们讲了在汽车CAN FD上&#xff0c;数据出错可能导致数据位被错误地解析为填充位&#xff0c…

MB5B在HDB上的性能调优

背景 MB5B是用于查询物料的收发以及现有库存。日常业务查询,通常会按照月份查看某片地区物料的库存以及收发状态。 调优思路 按照客户日常操作的习惯,得到日常操作的数据范围,选出数据量最为突出最有代表性的地区和物料;利用SE30分别运行不同数量级的数据,比如20个门店、…

系统程序的编译与处理

目录&#xff1a; 一&#xff0c;程序的编译与执行 二&#xff0c;预处理详解 三&#xff0c;#define的运用 四&#xff0c;条件编译 一&#xff0c;程序的编译与执行 1&#xff0c;编译环境 首先&#xff0c;要说明的是&#xff0c;计算机只能识别二进制指令&#xff0c…

文件共享服务器(五)sicis

目录 前言 一、概述 1.iscsi概念 2.iscsi介绍 3.相关名词 二、实验 1.构建iscsi服务 2.实现步骤 服务器端 客户端 3.注意事项 总结 前言 iSCSI是由IBM发明的基于以太网的存储协议&#xff0c;该协议与SUN的NFS协议都是为了解决存储资源共享问题的解决方案。两者意图…

传统商超苦战即时零售,或沦为炮灰

眼下&#xff0c;在美团闪购、京东到家、饿了么、淘宝买菜/淘鲜达、盒马&#xff0c;还有朴朴超市、叮咚买菜等一众类超市App或者平台的绝情裹挟下&#xff0c;包含沃尔玛、家乐福、永辉、大润发、联华、华润万家、步步高、中百等等这些传统商超企业巨头&#xff0c;正过得越来…

Unity噪声图生成(编辑器扩展)

最近发现项目里很多shader都需要噪声图&#xff0c;&#xff08;shadergraph中有自己的噪声图生成&#xff09;当遇到需要噪声图时去寻找很麻烦&#xff0c;所以从网上查阅资料编写了一个Unity扩展的噪声图生成。 Perlin噪声 Perlin噪声是一种渐变噪声算法&#xff0c;由Ken …

【面试】 redis击穿现象?如何防止击穿?

文章目录 背景击穿案例解决方案:通过synchronized双重检查机制&#xff1a;某个key只让一个线程查询&#xff0c;阻塞其它线程设置value永不过期&#xff08;设置热点数据永不过期&#xff09;使用互斥锁(mutex key) 背景 大家都知道,计算机的瓶颈之一就是IO,为了解决内存与磁…

组件化开发复习

1.vue的根组件使用 // 1.创建appconst app Vue.createApp({// data: option apidata() {return {message: "Hello Vue",counter: 0,counter2: 0,content: ""}},watch: {content(newValue) {console.log("content:", newValue)}}}) createApp 函…

C#之事件

目录 一、发布者和订阅者 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;有关事件的重要事项 &#xff08;三&#xff09;有关事件的私有委托需要了解的重要事项 二、源代码组件概览 三、声明事件 事件是成员 四、订阅事件 五、触发事件 六、标准事件的…

分析-WinHttpReceiveResponse失败问题追踪

Windows中的WinHttp库提供了比较完善的访问HTTP资源的接口API&#xff0c;一次在使用WinHTTP爬取QQ邮箱过程中&#xff0c;WinHttpReceiveResponse的调用总是失败&#xff0c;于是对此问题进行跟踪。 开始分析QQ邮箱的HTTP交互协议时&#xff0c;用到了代理工具Fiddler&#xf…

t.einsum(‘ijk,jkl->ijl‘, [a,b])

这个东西虽然计算起来真的方便的很多&#xff0c;但是对于人的理解难度是真的加大的&#xff0c;特别是高纬度的时候&#xff0c;例如&#xff1a;t.einsum(‘ijk,jkl->ijl’, [a,b])三维计算的时候。因此&#xff0c;最好的方法就是举个例子并且换一种方式来实现相同的功能…

安卓开发--4步实现Menu菜单动态显示隐藏

MenuInflater用法_韦_恩的博客-CSDN博客MenuInflater是用来加载menu布局文件的.应用程序运行时会预先加载资源中的布局文件&#xff0c;如果Menu布局中的资源比较多&#xff0c;会影响性能&#xff0c;所以可以选择MenuInflater方式用的时候加载&#xff0c;这样减轻了应用程序…

C语言通讯录

在本博客中&#xff0c;我们将介绍如何使用C语言构建一个基本的通讯录。主要涉及C语言的指针、结构体、动态内存管理、文件操作等方面的知识。我们还将学习如何使用C语言的各种功能和技巧来实现通讯录的各种操作&#xff0c;如添加联系人、编辑联系人、删除联系人和搜索联系人等…

并发与并行的区别(详细介绍)

并发和并行的区别为&#xff1a;意思不同、侧重不同、处理不同。 一、意思不同 1、并发&#xff1a;并发是指两个或多个事件在同一时间间隔发生&#xff0c;把任务在不同的时间点交给处理器进行处理。在同一时间点&#xff0c;任务并不会同时运行。 2、并行&#xff1a;并行…

【uniapp】更改富文本编辑器图片大小

代码块 //<view v-html"productDetails"></view><rich-text :nodes"productDetails"></rich-text>// 假设htmlContent字段是后台返回的富文本字段var htmlContent res.result.productDetailsconst regex new RegExp(<img, gi…

macOS Big Sur 11.7.9 (20G1426) 正式版 ISO、PKG、DMG、IPSW 下载

macOS Big Sur 11.7.9 (20G1426) 正式版 ISO、PKG、DMG、IPSW 下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Window…