1.调用系统照相机
//实例化一个intent,并指定action Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //指定一个图片路径对应的file对象 uri = Uri.fromFile(ImageUtil.getImageFile()); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); //启动activity startActivityForResult(intent, REQUEST_CODE_CAMERA);但是在onActivityResult(int requestCode, int resultCode, Intent data)代码中得到的data总为null?
2.原因分析
于是我查看了Android系统框架Camera应用程序,找到了关于系统照相机如何处理返回值data问题!
默认情况下,即不需要指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);照相机有自己默认的存储路径,拍摄的照片将返回一个缩略图。如果想访问原始图片,可以通过dat extra能够得到原始图片位置。即,如果指定了目标uri,data就没有数据,如果没有指定uri,则data就返回有数据!现在想想,这种设计还是很合理的!
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_CODE_CAMERA: if (resultCode == RESULT_OK) { if(data !=null){ //可能尚未指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); //返回有缩略图 if(data.hasExtra("data")){ Bitmap thumbnail = data.getParcelableExtra("data"); //得到bitmap后的操作 } }else{ //由于指定了目标uri,存储在目标uri,intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); // 通过目标uri,找到图片 // 对图片的缩放处理 // 操作 } } } }
3.Android系统照相机部分关键源码
// 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) { //存在mSaveUri,即指定了目标uri OutputStream outputStream = null; try { outputStream = mContentResolver.openOutputStream(mSaveUri); outputStream.write(data); outputStream.close(); setResult(RESULT_OK); //直接返回RESULT_OK,并没有指定intent finish(); } catch (IOException ex) { // ignore exception } finally { Util.closeSilently(outputStream); } } else { Bitmap bitmap = createCaptureBitmap(data); // 返回RESULT_OK,并包含一个Intent对象,其中Extra中科key为data,value为一个bitmap setResult(RESULT_OK, new Intent("inline-data").putExtra("data", bitmap)); finish(); }