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

Android——从相机/相册获取图片

从相机获取图片

  • 设置权限
    <uses-permission android:name="android.permission.CAMERA" />
  • 点击跳转
    private static final int REQUEST_CODE_TAKE = 1;
    public void takePhoto(View view) {if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {doTake();} else {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_TAKE);}}
  • 权限结果回调
    @Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == REQUEST_CODE_TAKE) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {doTake();} else {Toast.makeText(this, "你没有获得摄像头权限", Toast.LENGTH_SHORT).show();}}}
        register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {if (result != null) {if (result.getResultCode() == Activity.RESULT_OK) {try {InputStream inputStream = getContentResolver().openInputStream(imageUri);Bitmap bitmap = BitmapFactory.decodeStream(inputStream);// 转成Base64字符串 方便上传到服务器imageBase64 = ImageUtil.imageToBase64(bitmap);ivAvatar.setImageBitmap(bitmap);} catch (FileNotFoundException e) {e.printStackTrace();}}}});
  • 在 onCreate 中注册 Activity 返回结果回调
    private void doTake() {File imageTemp = new File(getExternalCacheDir(), "imageOut.jpeg");if (imageTemp.exists()) {imageTemp.delete();}try {imageTemp.createNewFile();} catch (IOException e) {e.printStackTrace();}imageUri = Uri.fromFile(imageTemp);if (Build.VERSION.SDK_INT > 24) {imageUri = FileProvider.getUriForFile(this, "com.example.study_android.fileprovider", imageTemp);}Intent intent = new Intent();intent.setAction("android.media.action.IMAGE_CAPTURE");intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);register.launch(intent);}
  • 设置provider
        <providerandroid:authorities="com.example.study_android.fileprovider"android:name="androidx.core.content.FileProvider"android:exported="false"android:grantUriPermissions="true"><meta-data android:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/files"/></provider>
  • @xml/files
	<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-pathname="image_path"path="/"/></paths>

从相册获取图片

  • 设置权限
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • 打开相册(需判断权限)
    public void choosePhoto(View view) {// 权限WRITE_EXTERNAL_STORAGE表示同时授予程序对SD卡读和写的能力。if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {openAlbum();} else {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_CHOOSE);}}private void openAlbum() {Intent intent = new Intent("android.intent.action.GET_CONTENT");intent.setType("image/*");registerAlbum.launch(intent);}
  • 注册相册返回结果回调
        registerAlbum = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {if (result != null) {if (result.getResultCode() == Activity.RESULT_OK) {Intent intent = result.getData();if (Build.VERSION.SDK_INT < 19) {handleImageBeforeApi19(intent);} else {handleImageOnApi19(intent);}}}});
    private void handleImageBeforeApi19(Intent data) {Uri uri = data.getData();String imagePath = getImagePath(uri, null);displayImage(imagePath);}
    /** 因为Android系统从4.4版本开始,选取相册中的图片不再返回图片真实的Uri了,而是一个封装过的Uri* 因此如果是4.4版本以上的手机就需要对这个Uri进行解析才行* */@TargetApi(19)private void handleImageOnApi19(Intent data) {String imagePath = null;Uri uri = data.getData();if (DocumentsContract.isDocumentUri(this, uri)) {// 如果是document类型的Uri,则通过document id处理String documentId = DocumentsContract.getDocumentId(uri);if (TextUtils.equals(uri.getAuthority(), "com.android.providers.media.documents")) {String id = documentId.split(":")[1];String selection = MediaStore.Images.Media._ID + "=" + id;imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);} else if (TextUtils.equals(uri.getAuthority(), "com.android.providers.downloads.documents")) {if (documentId != null && documentId.startsWith("msf:")) {resolveMSFContent(uri);return;}Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));imagePath = getImagePath(contentUri, null);}} else if ("content".equalsIgnoreCase(uri.getScheme())) {// 如果是content类型的Uri,则使用普通方式处理imagePath = getImagePath(uri, null);} else if ("file".equalsIgnoreCase(uri.getScheme())) {// 如果是file类型的Uri,直接获取图片路径imagePath = uri.getPath();}displayImage(imagePath);}
    private void resolveMSFContent(Uri uri) {File file = new File(getCacheDir(), "temp_file" + getContentResolver().getType(uri).split("/")[1]);try {InputStream inputStream = getContentResolver().openInputStream(uri);OutputStream outputStream = new FileOutputStream(file);byte[] buffer = new byte[4 * 1024];int read;while ((read = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, read);}outputStream.flush();Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());ivAvatar.setImageBitmap(bitmap);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
    // 获取图片真实路径@SuppressLint("Range")private String getImagePath(Uri uri, String selection) {String path = null;// 通过Uri和selection来获取真实的图片路径Cursor cursor = getContentResolver().query(uri, null, selection, null, null);if (cursor != null) {if (cursor.moveToFirst()) {path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));}cursor.close();}return path;}

案例代码

相关文章:

Android——从相机/相册获取图片

从相机获取图片 设置权限 <uses-permission android:name"android.permission.CAMERA" />点击跳转 private static final int REQUEST_CODE_TAKE 1;public void takePhoto(View view) {if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAM…...

MySQL 数据库基准测试报告

MySQL 数据库基准测试报告 1. 引言 数据库基准测试是一项重要的性能评估活动&#xff0c;旨在通过模拟实际的工作负载&#xff0c;测试数据库在不同条件下的表现。这些测试有助于发现性能瓶颈并提供优化的依据。在本报告中&#xff0c;我们将基于 sysbench 工具对 MySQL 数据…...

计算机毕业设计Python+大模型神经网络电影推荐 知识图谱图神经网络电影推荐可视化系统 注意力机制 秒杀同类电影推荐项目 GNN GAT

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Python | Leetcode Python题解之第543题二叉树的直径

题目&#xff1a; 题解&#xff1a; class Solution:def diameterOfBinaryTree(self, root: TreeNode) -> int:self.ans 1def depth(node):# 访问到空节点了&#xff0c;返回0if not node:return 0# 左儿子为根的子树的深度L depth(node.left)# 右儿子为根的子树的深度R …...

【浪潮商城-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…...

如何设置VSCODE快捷键光标移到行首和行尾

{ "key": "cmdhome", "command": "cursorTop", },{ "key": "cmdend", "command": "cursorBottom", }...

Android——多线程、线程通信、handler机制

Android——多线程、线程通信、handler机制 模拟网络请求&#xff0c;会阻塞主线程 private String getStringForNet() {StringBuilder stringBuilder new StringBuilder();for (int i 0; i < 100; i) {stringBuilder.append("字符串" i);}try {Thread.sleep(…...

Java | Leetcode Java题解之第542题01矩阵

题目&#xff1a; 题解&#xff1a; class Solution {static int[][] dirs {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};public int[][] updateMatrix(int[][] matrix) {int m matrix.length, n matrix[0].length;// 初始化动态规划的数组&#xff0c;所有的距离值都设置为一个很大…...

docker安装低版本的jenkins-2.346.3,在线安装对应版本插件失败的解决方法

提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、网上最多的默认解决方法1、jenkins界面配置清华源2、替换default.json文件 二、解决低版本Jenkins在线安装插件问题1.手动下载插件并导入2.低版本jenkins在…...

CSS3新增渐变(线性渐变、径向渐变、重复渐变)

1.线性渐变 代码&#xff1a; 效果图&#xff1a; 使文字填充背景颜色&#xff1a; 效果图&#xff1a; 2.径向渐变 代码&#xff1a; 效果图&#xff1a; 代码图&#xff1a; 效果图&#xff1a; 3.重复渐变 代码&#xff1a; 效果图&#xff1a;...

汽车免拆诊断案例 | 2017款凯迪拉克XT5车组合仪表上的指针均失灵

故障现象 一辆2017款凯迪拉克XT5车&#xff0c;搭载LTG 发动机&#xff0c;累计行驶里程约为17.2万km。车主反映&#xff0c;组合仪表上的发动机转速表、车速表、燃油表及发动机冷却液温度表的指针均不指示&#xff0c;但发动机起动及运转正常&#xff0c;且车辆行驶正常。 故…...

Cloudera Hue深度解析:安装、配置到高级用法

Hue的介绍 HUE 是一个开源的 Apache Hadoop UI 系统&#xff0c;早期由 Cloudera 开发&#xff0c;它是基于 Python Web 框架 Django 实现&#xff0c;后来贡献给开源社区。它包括 3 个部分 hue ui&#xff0c;hue server&#xff0c; hue db。通过使用 Hue 我们可以通过浏览…...

17、论文阅读:VMamba:视觉状态空间模型

前言 设计计算效率高的网络架构在计算机视觉领域仍然是一个持续的需求。在本文中&#xff0c;我们将一种状态空间语言模型 Mamba 移植到 VMamba 中&#xff0c;构建出一个具有线性时间复杂度的视觉主干网络。VMamba 的核心是一组视觉状态空间 (VSS) 块&#xff0c;搭配 2D 选择…...

GPT-5 一年后发布?对此你有何期待?

GPT-5 一年后发布&#xff1f;对此你有何期待&#xff1f; 在最新技术的洪流中&#xff0c;GPT-5即将登场。你是否在思考&#xff0c;它将为我们的生活和工作带来哪些变革&#xff1f;接下来的探索&#xff0c;或许可以启发你对未来的想象。让我们一起深入这场关于未来AI语言模…...

2024中国国际数字经济博览会:图为科技携明星产品引领数智化潮流

10月24日&#xff0c;全球数智化领域的目光齐聚于中国石家庄正定&#xff0c;一场关于数字经济未来的盛会—2024中国国际数字经济博览会在此拉开帷幕。 云边端算力底座的领航者&#xff0c;图为科技携其明星产品惊艳亮相&#xff0c;期待与您共赴一场数智化的非凡之旅&#xff…...

大模型面试题:常见的微调方法有哪些说下原理并对比

更多实时面试题总结请关注我的公众号"算法狗" 或移步至 https://pica.zhimg.com/80/v2-7fd6e77f69aa02c34ca8c334870b3bcd_720w.webp?sourced16d100b 这里说的微调主要是指参数微调&#xff0c;参数微调的方法主要有以下几种&#xff1a; Adapter 在预训练模型每一层…...

CentOS 9 Stream 上安装 PostgreSQL 16

CentOS 9 Stream 上安装 PostgreSQL 16 CentOS 9 Stream 上安装 PostgreSQL 16设置密码并且远程连接 CentOS 9 Stream 上安装 PostgreSQL 16 在 CentOS 9 Stream 上安装 PostgreSQL 16 可以通过以下步骤完成&#xff1a; 添加 PostgreSQL 官方仓库&#xff1a; PostgreSQL 提…...

【数据分享】1901-2023年我国省市县镇四级的逐年最高气温数据(免费获取/Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月最高气温栅格数据和Excel和Shp格式的省市县镇四级逐月最高气温数据&#xff0c;原始的逐月最高气温栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据&#xff01;基于逐月数据我们采用求年平均值的方法得到逐年最高…...

使用C++和QT开发应用程序入门以及开发实例分享

目录 1、搭建开发环境&#xff08;VS2010和QT4.8.2&#xff09; 2、创建一个QT窗口 3、在QT窗口中添加子窗口 4、QT界面布局 5、QT信号&#xff08;SIGNAL&#xff09;和槽&#xff08;SLOT&#xff09; 6、最后 C软件异常排查从入门到精通系列教程&#xff08;专栏文章列…...

Openlayers高级交互(20/20):超级数据聚合,页面不再混乱

本示例在vue+openlayers中使用cluster生成聚合数据的效果。在OpenLayers中实现点聚合(clustering)是一个常见的需求,特别是在处理大量地理数据点时。聚合可以提高地图的性能并减少视觉上的混乱。 一、示例效果图 专栏名称内容介绍Openlayers基础实战 (72篇)专栏提供73篇文…...

14. 声明文件(Declaration Files)

14. 声明文件&#xff08;Declaration Files&#xff09; 1. 概述 声明文件&#xff08;.d.ts 文件&#xff09;用于描述 JavaScript 库的类型信息&#xff0c;让 TypeScript 能够理解和使用纯 JavaScript 编写的代码。声明文件只包含类型定义&#xff0c;不包含实现代码。 ┌─…...

minecraft-ondemand故障排查指南:解决AWS无服务器我的世界服务器常见问题

minecraft-ondemand故障排查指南&#xff1a;解决AWS无服务器我的世界服务器常见问题 【免费下载链接】minecraft-ondemand Templates to deploy a serverless Minecraft Server on demand in AWS 项目地址: https://gitcode.com/gh_mirrors/mi/minecraft-ondemand mine…...

免费开源AMD Ryzen调试工具SMUDebugTool:释放处理器性能的终极指南

免费开源AMD Ryzen调试工具SMUDebugTool&#xff1a;释放处理器性能的终极指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址…...

凡亿AD22--AD软件泪滴的添加与移除

一、泪滴的基础认知1.1 泪滴的定义泪滴是PCB设计中&#xff0c;在走线与焊盘、走线与过孔&#xff08;导孔&#xff09;连接位置添加的「圆弧状或渐变状过渡结构」&#xff0c;本质是连接部位的“过渡加固层”&#xff0c;肉眼可见为类似水滴或圆弧的形态&#xff0c;核心作用是…...

AI+HR 全生命周期智能管理实战指南:从概念到落地,解锁组织效能新增长!​

在企业数字化转型的浪潮中&#xff0c;人力资源管理正经历着前所未有的变革。据行业数据&#xff0c;61% 的 HR 领导者已进入 GenAI 实施进阶阶段&#xff0c;82% 的企业计划在 12 个月内部署 AI 智能体&#xff0c;而 AI 驱动的企业人均效能已实现3.2 倍提升。当传统 HR 深陷事…...

国内大学生必备的AI论文写作工具有哪些?

国内高校学生常用的 AI 论文写作工具&#xff0c;以本土化全流程工具为主&#xff0c;结合通用大模型与专业辅助功能&#xff0c;覆盖选题、框架搭建、初稿撰写、查重降重、格式调整等关键环节&#xff0c;以下是主流工具详解与对比&#xff1a;一、本土全流程论文 AI 工具&…...

Zed与VSCode争议背后真相:性能瓶颈到底是谁的锅

别被骗了&#xff01;Zed比VS Code快&#xff1f;真正的原因让你哭笑不得&#xff01;本文深入分析开发者社区对Zed编辑器与VS Code的争议&#xff0c;澄清性能瓶颈的真相在于语言服务器协议(LSP)而非编辑器本身&#xff0c;揭示Zed真正的优势在于原生Vim模式和架构简洁性&…...

C++的内存管理详细解释

一、C/C内存分布栈又叫堆栈&#xff0c;非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。内存映射段是高效的I/O映射方式&#xff0c;用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存&#xff0c;做进程间通信。堆用于程序运行时动态内存分…...

宏裕塑胶代理沙伯基础创新SABIC(原GE塑料)全线工程塑料产品与技术服务

宏裕塑胶依托源头直采模式&#xff0c;整合沙伯基础创新 SABIC&#xff08;原 GE 塑料&#xff09;等国际一线品牌工程塑料原料&#xff0c;为制造业企业提供高性价比、稳定可控的供应链解决方案&#xff0c;助力客户降本增效&#xff0c;适用于汽车零配件、精密电子、注塑生产…...

AI人工智能行业的现状:为什么说AI从业者的需求越来越大

一、AI产业爆发式增长&#xff1a;需求激增的时代底色2026年&#xff0c;人工智能产业已步入爆发式增长的黄金期&#xff0c;成为驱动全球经济复苏与产业变革的核心引擎。从全球市场来看&#xff0c;2025年AI市场规模达7575.8亿美元&#xff0c;同比增长18.7%&#xff0c;预计2…...