解释 Android 调用系统相机,在onActivityResult中接收的data为null的原因

本文主要是介绍解释 Android 调用系统相机,在onActivityResult中接收的data为null的原因,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    很多时候,我们在使用程序调用系统相机的时候,会发现在onActivityResult中接收的data为null,开始我也一直不明白,这是为什么,后来查看了源码才知道,今天在这记录一下,方便以后忘了。哈哈。
下面这个方法是我调用系统相机的方法,其中红色标记的方法是设置拍照后相片保存的地址。
	/*** 设置一些参数* */private void takePhoto () {Intent intent = new Intent(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(MediaStore.EXTRA_OUTPUT, <span style="color:#ff0000;">setFilePath()</span>);openCameraOrAlbum(intent, TAKE_PICTURE);}
       /*** 调用系统相机* @param intent* @param requestCode*/private void openCameraOrAlbum (Intent intent , int requestCode) {try {startActivityForResult(intent, requestCode);} catch (ActivityNotFoundException e) {ToastUtil.showShort(this, "无法打开相机");}}

拍完照片,返回时在onActivityResult(int requestCode, int resultCode , Intent data)  中接收,通常很多人都会以为data就是保存图片信息的,但我发现data是null的,这让我着实费解,花了很长时间,查看了源码才明白。先贴源码看下。

 在 com.android.camera.Camera类中找到 doAttach() 方法 ,下面是doAttach()方法中部分代码的截图

注:我是在grepCode上查看的源码,这是个源码查看网站,很强大哦)


请看1382行,mSaveUri这个变量保存的就是我上面setFilePath()方法创建的图片的地址,如上,我传入了这个值,但是在1389行,系统保存完图片后,直接setResult(RESULT_OK)了。

并没有创建intent返回,所有这就能理解为什么在onActivityResult中的data为null的原因。解决方法,就是在你调用系统相机的Activity声明一个变量,存储你图片的路径,如下,我在setFilePath()方法中

保存了图片的地址

	/*** 指定图片存储路径 * @return*/private Uri setFilePath() {String outPath = Environment.getExternalStorageDirectory().getAbsoluteFile() + "/takePic/" + System.currentTimeMillis()+".jpg";File outFile = FileUtil.createDirFile(outPath);<span style="color:#cc0000;">this.mCameraFilePath = outFile.getAbsolutePath();   // 保存图片的地址</span>Log.d("TAG", "图片地址:"+mCameraFilePath);return Uri.fromFile(outFile) != null ? Uri.fromFile(outFile) : null;}

这样在onActivityResult()中使用mCameraFilePath 去访问你拍的图片即可。   

以上说的是给图片设置自己存储路径的情况,那如果不设置会怎么样呢?请看上面源码截图,如果不设置路径,那么mSaveUri这个变量就为null , 在1398行系统会将图片转化成Bitmap并创建Intent 存放在data里面

所以在onActivityResult中通过 data.getExtras().get("data");就能拿到图片的Bitmap 当然系统并没有将图片保存到SD卡上,所以在手机中时找不到该图片的,它只会当即返回这个图片的bitmap对象。

但是,有个问题,如果不设置保存的路径,通过intent传递过去,则返回的图片对象是被压缩过的,图片会变得很小

没有原始图片清晰,所以这是比较坑爹的。因此建议大家还是在调用相机的时候设置下面这个参数。

intent.putExtra(MediaStore.EXTRA_OUTPUT, setFilePath());

那么拍照后保存的图片就是原始图片了。

好了,以上就是我查看源码得之的结果,希望能帮到大家。谢谢

这是我第一次写博客,觉得行就点个赞呗大笑。(改了好多次,哎不会用这个编辑器啊)


这篇关于解释 Android 调用系统相机,在onActivityResult中接收的data为null的原因的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978543

相关文章

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class