很多时候,我们在使用程序调用系统相机的时候,会发现在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());
那么拍照后保存的图片就是原始图片了。
好了,以上就是我查看源码得之的结果,希望能帮到大家。谢谢
这是我第一次写博客,觉得行就点个赞呗。(改了好多次,哎不会用这个编辑器啊)