解释 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());

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

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

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


  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值