本文主要是介绍解释 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的原因的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!