前言
大家可能遇到了这样的情况,调用Camera,然后指定自定义的保存路径,结果返回的Intent为空。我们来分析一下原因。
分析
首先看Camera的部分逻辑,在源码中的Camera.java的doAttach()方法里面。
// First handle the no crop case -- just return the value. If the // caller specifies a "save uri" then write the data to it's // stream. Otherwise, pass back a scaled down version of the bitmap // directly in the extras. if (mSaveUri != null) { OutputStream outputStream = null; try { outputStream = mContentResolver.openOutputStream(mSaveUri); outputStream.write(data); outputStream.close(); setResult(RESULT_OK); finish(); } catch (IOException ex) { // ignore exception } finally { Util.closeSilently(outputStream); } } else { Bitmap bitmap = createCaptureBitmap(data); setResult(RESULT_OK, new Intent("inline-data").putExtra("data", bitmap)); finish(); }
注释也有明确解释,假如mSaveUri不为空,则直接返回RESULT_OK,不会回传其他任何东西。假如为空,则会回传一个bitmap。
再看看我们调用Camera的代码。
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Date date = new Date(); String photoDCIM = Environment.getExternalStorageDirectory() + File.separator + Environment.DIRECTORY_DCIM; // 默认相册的路径 String path = photoDCIM + File.separator + date.getTime() + ".jpg"; intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(path ))); startActivityForResult(intent, PICTURE_CAMERA);
上面带指定的保存路径path ,就是Camera中的mSaveUri。所以结果就是Camera只会返回RESULT_OK。
结论
我们调用Camera可以有2种方式获得拍照的图片:
第1种是指定保存路径。
如上面的示例代码,将path设置为成员变量,在onActivityResult()中,直接读取该值即可。
第2种是不指定保存路径。
调用方法如下:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); getActivity().startActivityForResult(intent, PICTURE_CAMERA);
onActivityResult中
Bitmap bitmap= data.getParcelableExtra("data");
这样就能得到拍照的图片了。
总结
在日常使用过程中,推荐使用指定保存路径,这样可以方便获得File,然后做其他的操作。
调用Camera返回为空的分析及处理方法
时间: 2024-10-10 18:29:44