Andorid之拍照及相册选取照片回显

Android调用相机拍照并显示在界面上 三、在res目录下新建xml文件夹,并创建file_paths.xml文件。二、在AndroidManifest.xml文件中注册内容提供器。 阅读详情


前言

提示:我们常见的应该就是APP换头像了,可以拍照以及相册选取,虽然这个功能很常见,但很多比较麻烦,今天分享一个简单的实现方法


一、全局变量定义

    private String headStr;//最终上传路径
    private Uri imageUri;//图片路径
    private int REQUEST_CODE = 88;//相机
    private int REQUEST_CODEXC = 99;//相册

二、得到图片后转String路径工具类

  package com.wzj.footprint.utils;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.util.Log;

import java.io.File;


public class UriToPathUtil {


    /**
     *Uri 转 path
     */
    public static String getPathFromUri(Context context, Uri uri) {
        String path = null;
        if (DocumentsContract.isDocumentUri(context, uri)) {
            //如果是document类型的Uri,通过document id处理,内部会调用Uri.decode(docId)进行解码
            String docId = DocumentsContract.getDocumentId(uri);
            //primary:Azbtrace.txt
            //video:A1283522
            String[] splits = docId.split(":");
            String type = null, id = null;
            if(splits.length == 2) {
                type = splits[0];
                id = splits[1];
            }
            switch (uri.getAuthority()) {
                case "com.android.externalstorage.documents":
                    if("primary".equals(type)) {
                        path = Environment.getExternalStorageDirectory() + File.separator + id;
                    }
                    break;
                case "com.android.providers.downloads.documents":
                    if("raw".equals(type)) {
                        path = id;
                    } else {
                        Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
                        path = getMediaPathFromUri(context, contentUri, null, null);
                    }
                    break;
                case "com.android.providers.media.documents":
                    Uri externalUri = null;
                    switch (type) {
                        case "image":
                            externalUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                            break;
                        case "video":
                            externalUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                            break;
                        case "audio":
                            externalUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                            break;
                    }
                    if(externalUri != null) {
                        String selection = "_id=?";
                        String[] selectionArgs = new String[]{ id };
                        path = getMediaPathFromUri(context, externalUri, selection, selectionArgs);
                    }
                    break;
            }
        } else if (ContentResolver.SCHEME_CONTENT.equalsIgnoreCase(uri.getScheme())) {
            path = getMediaPathFromUri(context, uri, null, null);
        } else if (ContentResolver.SCHEME_FILE.equalsIgnoreCase(uri.getScheme())) {
            //如果是file类型的Uri(uri.fromFile),直接获取图片路径即可
            path = uri.getPath();
        }else {
            path = uri.getPath();
        }
        //确保如果返回路径,则路径合法
        return path == null ? null : (new File(path).exists() ? path : null);
    }



    private static String getMediaPathFromUri(Context context, Uri uri, String selection, String[] selectionArgs) {
        String path;
        String authroity = uri.getAuthority();
        path = uri.getPath();
        String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
        if(!path.startsWith(sdPath)) {
            int sepIndex = path.indexOf(File.separator, 1);
            if(sepIndex == -1) path = null;
            else {
                path = sdPath + path.substring(sepIndex);
            }
        }

        if(path == null || !new File(path).exists()) {
            ContentResolver resolver = context.getContentResolver();
            String[] projection = new String[]{ MediaStore.MediaColumns.DATA };
            Cursor cursor = resolver.query(uri, projection, selection, selectionArgs, null);
            if (cursor != null) {
                if (cursor.moveToFirst()) {
                    try {
                        int index = cursor.getColumnIndexOrThrow(projection[0]);
                        if (index != -1) path = cursor.getString(index);
                        Log.i("Uri 转 path ", "getMediaPathFromUri query " + path);
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                        path = null;
                    } finally {
                        cursor.close();
                    }
                }
            }
        }
        return path;
    }




}

三、onActivityResult返回值

  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == REQUEST_CODEXC) {//相册
            imageUri = data.getData(); //获取系统返回的照片的Uri
//            Bitmap bitmap = null;
//            try {
//                bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
//                imag_logo.setImageBitmap(bitmap);
//            } catch (FileNotFoundException e) {
//                e.printStackTrace();
//            }
            headStr = UriToPathUtil.getPathFromUri(PersonalInformation.this, imageUri);//将Uri转path;
            System.out.println("上传路径返回值打印--相册:" + headStr);
            OSSImag(headStr);//oss上传
        } else {//相机
            headStr = UriToPathUtil.getPathFromUri(PersonalInformation.this, imageUri);//将Uri转path;
            System.out.println("上传路径返回值打印--拍照:" + headStr);
            OSSImag(headStr);
        }
    }

四、拍照及相册选取

1.拍照

代码如下(示例):

  // 创建File对象,用于存储拍照后的图片
                //存放在手机SD卡的应用关联缓存目录下
                File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
               /* 从Android 6.0系统开始,读写SD卡被列为了危险权限,如果将图片存放在SD卡的任何其他目录,
                 都要进行运行时权限处理才行,而使用应用关联 目录则可以跳过这一步
                 */
                try {
                    if (outputImage.exists()) {
                        outputImage.delete();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                /*
                 7.0系统开始,直接使用本地真实路径的Uri被认为是不安全的,会抛 出一个FileUriExposedException异常。
                 而FileProvider则是一种特殊的内容提供器,它使用了和内 容提供器类似的机制来对数据进行保护,
                 可以选择性地将封装过的Uri共享给外部,从而提高了 应用的安全性
                 */
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    //大于等于版本24(7.0)的场合
                    imageUri = FileProvider.getUriForFile(PersonalInformation.this, "com.wzj.footprint.fileprovider", outputImage);
                } else {
                    //小于android 版本7.0(24)的场合
                    imageUri = Uri.fromFile(outputImage);
                }
                //启动相机程序
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                //MediaStore.ACTION_IMAGE_CAPTURE = android.media.action.IMAGE_CAPTURE
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(intent, REQUEST_CODE);

2.相册

代码如下(示例):

//在这里跳转到手机系统相册里面
//在这里跳转到手机系统相册里面
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_CODEXC);

五、权限

<!-- 拍照选取相册图片需要权限 -->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

总结

     有没有感觉很简单,大致流程就是这样,1:权限  2:跳转拍照或者相册  3:拿返回值进行显示。an
Android基础进阶 - 调用拍照、获取图片 本篇给大家带来的是拍照回传的初级使用,用的同样是数据回传的方式,首先 startActivityForResult 确定 Action、requestCode,之后重写 onActivityResult 进行逻辑操作,拍照的照片回传,AndroidMainfest 添加权限。 阅读详情

相关推荐

Workbench中基于nCode的列车转向架随机振动疲劳寿命预测方法

本文详细介绍了在ANSYS Workbench中结合nCode进行列车转向架随机振动疲劳寿命预测的完整方法。通过几何清理、模态分析、PSD载荷定义及随机振动求解,并重点阐述了nCode中Dirlik等疲劳算法的选择与应用,为轨道交通关键部件的可靠性设计提供了系统的仿真分析流程与工程实践指导。

weixin_29234423的博客 473

Android调用相机拍照,展示拍摄的图片

重写onActivityResult方法。

qq_44255741的博客 756

R以及Rstudio超详细安装教程(包括安装过程中出现的问题)

R安装及Rstudio安装,以及安装中出现的问题

2301_76908257的博客 1万+

Android调用相机拍照并返回给Imageview

android调用相机进行拍照

huangsikai1的博客 825

机器人视觉伺服控制入门:从IBVS到PBVS的实战指南(附Python代码示例)

本文深入解析机器人视觉伺服控制,对比了基于图像的视觉伺服和基于位置的视觉伺服两大核心方法。通过实战案例与Python代码示例,详细阐述了从误差计算、交互矩阵到速度控制的全流程,帮助读者掌握如何利用视觉反馈实现机器人的实时闭环控制,提升其在动态环境中的作业能力。

weixin_29061997的博客 259

Bode图、ABCD矩阵与EET结合:三步搞定复杂电路传递函数分析

在模拟电路与电源控制设计中,传递函数和频率响应是衡量系统稳定性的核心指标。Bode图以直观的幅频/相频曲线揭示带宽与相位裕度,ABCD二端口矩阵可将级联网络结构化表达,而EET额外元素定理则针对寄生电容、负载效应等局部修正提供显式公式。三者互补,组合成一套从整体拓扑到局部寄生修正的完整分析方法:先用ABCD搭建主体网络,再用EET快速加入额外元件,最后用Bode图验证传递函数和稳定裕度。该方法适用于滤波器设计、电源环路补偿、运放稳定性分析等线性小信号场景,支持Python/SciPy和SPICE交叉验证,显

weixin_32496547的博客 363

Android问题与解决方案:调用系统相机拍照并返回图片

第一步:设置权限 第二步:处理版本冲突 第三步:封装获取相机存储路径和隐式意图启动相机的代码 第四步:隐式意图启动相机 第五步:回调函数处理 第一步:设置权限 &lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt; &lt;uses-permission androi...

sailist的记录站 1397

【自用】吉林大学计算机系统结构第二章:缓存优化 曲冠南老师版 笔记

容量8KB,2的十三次方,块大小16B,一块用掉四位,剩余2的九次方是标志位,则有512行,每个元素8B,则一块两个元素,a数组150块,b数组152块,不出现容量失效。不管是否交换内容,在同一“伪相联”组中的两块都是用同一个索引得到的,因此失效率相同,即:失效率伪相联=失效率2路。伪相联cache的命中时间等于直接映象cache的命中时间加上伪相联查找过程中的命中时间*该命中所需的额外开销。(6) 由编译器控制的预取,硬件预取的替代方法,在编译时加入预取的指令,在数据被用到之前发出预取请求。

weixin_73587775的博客 1616

android 调用相机拍照并回显

import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.MediaStore; import..

叶上初阳_285557的博客 512

sylar学习系列一

开发环境 Centos7最小系统 gcc 9.1 cmake 环境可能存在的一些问题 可能存在的问题,linux最小系统没有一些常用命令,如果我们处于外网我们可以yum安装,但却遇到以下问题 can not find a valid baseurl for repo: base/7/x86-64 可修改网络配置 vi /etc/sysconfig/network-scripts/ifcfg-ens123 # 不是每个主机都是ens123 把ONBOOT=no,改为ONBOOT=yes 重启网络

wuguinianjing的博客 1018

YOLOv8安防监控实战:跌倒/闯入/徘徊实时检测(附TensorRT加速+声光报警部署代码)

精准性:针对跌倒/闯入/徘徊的行为特征优化,准确率达89.3%,误报率低于5次/天;实时性:TensorRT加速到50+FPS,报警延迟<1秒,满足安防“黄金响应时间”;低成本:无需专用AI芯片,RTX 3060或Jetson Orin就能跑,硬件成本比传统方案低60%;易部署:代码全开源,提供从模型训练到硬件联动的完整流程,2天即可搭起原型系统。如果你的安防监控还在“漏报误报”“响应慢”,建议先从跌倒检测的姿态过滤改起——用100张样本测试,再集成TensorRT加速,90%能看到明显改善。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 680

2022-02-26 AndroidR 11 调用文件管理器并返回选中文件的路径

一、Android8 调用文件管理器并返回选中文件的路径的时候可以参考这个文章。 Android中调用文件管理器并返回选中文件的路径_潘侯爷的博客-优快云博客 二、Android11的从图标打开ExternalStorage是跟之前一样的。但是是打开Recent、Images、Downloads的时候各种问题,同样的软件在android8的时候可以运行,到Android11就不行,这里简单总结一下在Android11的时候打开浏览器的demo。 1、打开文件管理器的效果。 ...

海月汐辰 8323

AI大模型探索之路-应用篇11:AI大模型应用智能评估(Ragas)

随着人工智能技术的飞速发展,AI大模型(LLM)已经成为了推动技术创新和应用的关键因素。这些大模型在语言理解、图像识别、自然语言生成等领域展现出了惊人的能力。然而,随着模型规模的增大,它们对计算资源的消耗、环境适应性、模型稳定性、安全性和可解释性等方面也提出了新的挑战。因此,对AI大模型进行智能评估变得至关重要,以确保它们在实际应用中的稳定性、可靠性和有效性。本文将详细介绍Ragas框架,一个专为AI大模型设计的智能评估工具。

寻道AI,探索AI无限可能! 5544

图片的上传功能以及手机端回显问题总结含解决方法

图片的上传功能以及手机端回显问题总结含解决方法

zero00122的博客 1028

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android系统相机的使用、及解决拍照闪退的问题

转自  http://blog.youkuaiyun.com/lang791534167/article/details/39647263 相机已成为android手机不可或缺的一部分,我们在开发可能也会涉及到关于相机的使用,以及在使用中会遇到一些问题(重点),下面把我个人的一点经验贴出来,仅供大家参考学习。 最简单的方式直接调用系统相机进行拍照,虽然能满足拍照的要求,但拍照的功能和界面却局限

qq_25474979的博客 5192

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android11适配-实现清理其他应用缓存目录

随着315的曝光,很多清理产品被陆续下架整改,我们公司也有。相信你也听说了,正好这段时间我的手机更新到了Android11,

斯普润丶的博客 7989

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android R 如何访问Android/data目录

前言 Android R上分区存储的限制得到进一步加强,无论APP的targetsdkversion是多少,都将无法访问Android/data和Android/obb这二个应用私有目录。这无疑对会部分APP的业务场景及用户体验造成冲击,典型的如下 文件管理类软件:微信、QQ传输的文件无法展示给用户以便捷使用 垃圾清理类软件:清理缓存功能受阻 “你有你的张良计,我有我的过墙梯”,现市面上文件管理类软件(如MT管理器)已解决上述系统限制,本文将浅析其实现方案,并主要分析以下2个问题: SAF是通过何种

cmyperson的博客 2万+

Android:Kotlin实现调用相机资源拍照并显示

解决了startActivityForResult的过期问题,实现用kotlin语言实现的相机调用

m0_56184347的博客 2782

Android DocumentFile 基本使用

Android DocumentFile API操作文件,可以操作外部私有目录,文件管理器访问Android/data的方式

特立独行的博客 3万+

Android 5.0文件管理操作公开

Android 5.0 DocumentProvider探究

独行者103的专栏 1万+

android 调用相机点击确定不返回

android 调用相机点击确定不返回 出现问题的问题:相机照相成功后点击确定就是不放回,

mxiaoyem的博客 3294

Android 7.0及以上调用系统相机拍照并返回照片

前言 最近想重新实现调用系统相机的功能,发现之前写的调用相机功能都失效了, 也就是调用对应代码完全不起作用,只能重新摸索、实现,现记录如下。 正文 我们在Android低版本上调用系统相机只需要简单的几行代码就可以搞定,这也是我之前的代码: Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Uri ima...

波风水门 1571

单张图片上传回显

<input type="file" name="filePath" id="filePath" class="file-list"> <div> <img id="imgage" /> </div> //当前选择上传的文件 var curFile; //选择文件按钮 $file = $("#filePath"); //回显图片 function reviewFile(file) { .

weixin_46305078的博客 230

Android存储访问框架的使用

存储访问框架,简称:SAF, 就是系统文件选择器。通常用来选择文件,和Windows的文件选择框一样。 其实绝大多数app,都不会使用这个东西,因为太不方便了。图片,视频,普通文件,需要用户去翻文件夹找,这样的用户体验实在太差了。所以大家都是用第三方的或者自己写一个文件选择器。 之所以讲SAF,一,是因为Android11以后,使用MediaStore无法访问到非多媒体文件了,需要依赖SAF了。二,外卡和SD卡的操作依赖于存储访问框架授权。 打开系统文件选择器与文件过滤 Int

zjuter的专栏 1万+

Android调用相机拍照并返回路径和调用系统图库选择图片

调用系统图库: Intent intent = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(intent, REQUEST_CODE_IMAGE); 获取图片路径 @Overrideprotected void onActivityRes...

weixin_30556959的博客 752

打开android自带的文件管理(指定路径)

打开指定路径文件夹

weixin_45444971的博客 5912
上一篇: Android之USB打印
下一篇: Android之上传图片到OSS
叶已初秋
博客等级 码龄11年 2684粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶已初秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值