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

一、配置拍照和读写权限

<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...><providerandroid:name="androidx.core.content.FileProvider"android:authorities="你的package包名.fileprovider"android:exported="false"android:grantUriPermissions="true"tools:replace="android:authorities"><meta-dataandroid: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-pathname="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);//用来打开相机的Intentif(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.xmluri = 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获取filepublic 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.mzph.cn/news/8716.shtml

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

相关文章

通过RPM方式安装,升级,卸载,以及配置使用MySQL

通过RPM方式安装&#xff0c;升级&#xff0c;卸载&#xff0c;以及配置使用MySQL 一、下载 MySQL是一种开源的关系数据库管理系统&#xff0c;被广泛应用于各种业务应用中。本文将讲解如何下载和安装MySQL的rpm安装包。下载rmp安装包有多种方式&#xff1a; 1、可以到MySQL的…

嵌入式C常用关键字解析

1、static关键字的作用 修饰局部变量 作用域&#xff1a;无变化 生命周期&#xff1a;函数--->程序&#xff08;数据段&#xff09; 特点&#xff1a;只初始化一次 修饰全局变量 作用域&#xff1a;整个工程----->本模块 生命周期&#xff1a;无变化 修饰函数 作…

【C++初阶】 priority_queue(优先级队列)

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C初阶 ⭐代码仓库&#xff1a;C初阶 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们的支持是我…

python简单入门

python简单入门 文章目录 python简单入门0. 地址链接1. 官网2.2. 下载地址3. 官方文档 1. 第一章1.1 python解释器1.2 基础语法1.2.1 常见数据类型1.2.2 强制类型转换1.2.3 注释1.2.4 运算符1.2.5 字符串1.2.5.1 字符串的定义1.2.5.2 字符串拼接1.2.5.3 格式化字符串1.2.5.3 精…

vue指令-插值表达式

vue指令-插值表达式 1、什么是插值表达式2、Vue变量声明在哪里 1、什么是插值表达式 双大括号&#xff0c;可以把vue数据变量直接显示在标签内 2、Vue变量声明在哪里 data函数返回对象上&#xff0c;用key属性声明 示例&#xff1a; <template><div id"app&…

【防火墙】iptables防火墙(二)

1.写在命令行的备份和还原 2.把我们的规则配置在服务的文件当中&#xff0c;形成永久生效 iptables-save > /opt/ky30.bak iptables-restore < /opt/ky30.bak cat /etc/sysconfig/iptables 永久生效的配置文件 自定义链&#xff1a; 1.创建自定义链&#xff1a; i…

正则表达式 —— Sed

Sed Sed 类似于vim就是一个文本编辑器&#xff0c;按行来进行编辑和排序 Sed的原理&#xff1a;读取&#xff0c;执行&#xff0c;显示 读取&#xff1a;读取文本内容之后&#xff0c;读取到的内容存放到临时的缓冲区—模式空间 执行&#xff1a;在模式空间&#xff0c;根据…

第二天 kali代理配置

文章目录 环境一、虚拟机网络模式&#xff08;1&#xff09;NAT&#xff08;2&#xff09;NAT模式&#xff08;3&#xff09;桥接模式&#xff08;4&#xff09;仅主机模式&#xff08;5&#xff09;总结 二、配置代理&#xff08;桥接模式&#xff09;1、基础设置2、虚拟机浏览…

记录安装stable diffusion webui时,出现的gfpgan安装卡住的问题

参考链接&#xff1a;(145条消息) 使用stable diffusion webui时&#xff0c;安装gfpgan失败的解决方案&#xff08;windows下的操作&#xff09;_新时代原始人的博客-CSDN博客

【el-tree查询并高亮】vue使用el-tree组件,搜索展开并选中对应节点,高亮搜索的关键字,过滤后高亮关键字,两种方法

第一种&#xff08;直接展开并高亮关键字&#xff09; 效果图这样的&#xff0c;会把所有的有这些关键字的节点都展开 代码&#xff1a; 这里的逻辑就是通过递归循环把所有和关键字匹配的节点筛选出来 然后通过setCheckedKeys方法把他展开选中 然后通过filterReal把关键字高亮…

用Java写网络聊天系统你会吗???

1.使用Socket进行编写代码&#xff1a;这里还涉及多线程的简单应用。 2.首先创建一个MyWriter类&#xff0c;用于发送客户端和服务器端的聊天信息。 /** Copyright (c) 2020, 2023, All rights reserved.**/import java.io.PrintWriter; import java.net.Socket; import java.…

MATLAB | 产生阿尔法稳定分布噪声并作出概率密度函数

一、问题描述 想产生不同特征参数的α稳定随机变量&#xff0c;并且作出其概率密度函数进行对比。 二、解决思路 运行了MATLAB的官方实例代码&#xff1a; openExample(‘stats/ComparePDFsOfStableDistributionsExample’) &#xff08;1&#xff09;使用makedist()函数生成…

数据可视化(2)

1.柱状图 #柱状图 #bar(x,height,width,*,aligncenter,**kwargs) #height柱子的高度&#xff0c;即y轴上的数据 #width数组的宽度&#xff0c;默认值0.8 #*表示后面的参数为匿名关键字&#xff0c;必须传入参数 #kwargs关键字参数x[1,2,3,4,5] height[random.randint(10,100)f…

OpenAI Code Interpreter 的开源实现:GPT Code UI

本篇文章聊聊 OpenAI Code Interpreter 的一众开源实现方案中&#xff0c;获得较多支持者&#xff0c;但暂时还比较早期的项目&#xff1a;GPT Code UI。 写在前面 这篇文章本该更早的时候发布&#xff0c;但是 LLaMA2 发布后实在心痒难忍&#xff0c;于是就拖了一阵。结合 L…

Python函数

1.传递可更改对象与不可更改对象区别 Python的可更改类型包括&#xff1a;列表List、字典Dictionary、集合Set 当传递的参数是可更改类型时&#xff0c;这就相当于是C的引用传递&#xff0c;函数内部对参数进行更改&#xff0c;函数之外也会进行更改&#xff0c;因为操作的同一…

Jmeter 中 Beanshell 的使用

目录 前言&#xff1a; Beanshell 介绍 常用内置变量 log vars 和 props vars 常用方法&#xff1a; props 常用方法&#xff1a; prev 综合运用 前言&#xff1a; JMeter 是一个广泛使用的性能测试工具&#xff0c;它支持许多不同的测试技术和方法。其中&#xff0c…

6 | 中国天气网

文章目录 用Python爬取中国天气网的天气预报信息1. 获取HTML页面内容2. 解析HTML并提取数据3. 保存数据到CSV文件4. 主函数5. 爬虫脚本用Python爬取中国天气网的天气预报信息 在这篇博客中,我将会展示如何使用Python编程语言来从中国天气网爬取天气预报信息。这将涵盖如何获取…

Qt实现双控制柄的Slider

目标 实现带有左右两个控制柄的滑动条&#xff1b;控件可设定最小值和最大值&#xff1b;控件可设定控制柄的最小距离&#xff1b; 效果演示 思路 1. 标准的Slider控件只有一个Handle&#xff0c;所以想要通过改造QSlider来实现两个Handle是非常困难的&#xff0c;“自绘”…

Vue+Nodejs 使用WebSocket创建一个简易聊天室

文章目录 一、页面效果二、架构流程三、技术细节1.客户端2. 服务端 一、页面效果 二、架构流程 使用vue编写前端页面&#xff0c;nodejs处理服务端消息&#xff0c;WebSocket进行实时通信 三、技术细节 1.客户端 <template><div><form onsubmit"return…

【itext7】itext7操作PDF文档之添加表单控件(单行文本框、多行文本框、单选框、复选框、下拉框、按钮)

这篇文章&#xff0c;主要介绍itext7操作PDF文档之添加表单控件&#xff08;单行文本框、多行文本框、单选框、复选框、下拉框、按钮&#xff09;。 目录 一、itext操作PDF表单 1.1、添加单行文本框 1.2、添加多行文本框 1.3、添加单选框 1.4、添加复选框 1.5、添加下拉框…