解释 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

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创