当前位置: 首页 > news >正文

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.lryc.cn/news/95730.html

相关文章:

  • MAXENT模型的生物多样性教程
  • CISA学习笔记-第一章、信息系统审计过程
  • 回调函数的使用:案例一:c语言简单信号与槽机制。
  • python matplotlib库 设置字体字号等
  • 【MySQL】SQL性能分析 (七)
  • 超越想象的GPT医疗 20230723
  • 【N32L40X】学习笔记03-gpio输出库
  • WebClient,HTTP Interface远程调用阿里云API
  • 飞书ChatGPT机器人 – 打造智能问答助手实现无障碍交流
  • React、Vue框架如何实现组件更新,原理是什么?
  • 常见面试题之设计模式--策略模式
  • redis多key问题
  • kafka第三课-可视化工具、生产环境问题总结以及性能优化
  • 2_Apollo4BlueLite中断控制器NVIC
  • WAIC2023:图像内容安全黑科技助力可信AI发展
  • 微信小程序quickstartFunctions中云函数的应用
  • Go学习 2、程序结构
  • SpringBoot整合JavaMail
  • Spring6——入门
  • 【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 17 日论文合集)
  • 为什么需要GP(Global Platform)认证?
  • eclipse 格式化代码 快捷键
  • 深入探索Socks5代理与网络安全
  • 【NLP】如何使用Hugging-Face-Pipelines?
  • 网络安全(黑客)自学笔记
  • spring数据校验
  • 因材施教,有道发布“子曰”教育大模型,落地虚拟人口语教练等六大应用
  • golang waitgroup
  • 单列模式多学两遍
  • Spring Cloud【SkyWalking网络钩子Webhooks、SkyWalking钉钉告警、SkyWalking邮件告警】(十六)