Android_照相机Camera_调用系统照相机返回data为空


​​本博文为子墨原创,转载请注明出处!



1.调用系统照相机


1. //实例化一个intent,并指定action  
2. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
3. //指定一个图片路径对应的file对象
4. uri = Uri.fromFile(ImageUtil.getImageFile());
5. intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
6. //启动activity
7. startActivityForResult(intent, REQUEST_CODE_CAMERA);


2.原因分析

于是我查看了Android系统框架Camera应用程序,找到了关于系统照相机如何处理返回值data问题!

默认情况下,即不需要指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);照相机有自己默认的存储路径,拍摄的照片将返回一个缩略图。如果想访问原始图片,可以通过dat extra能够得到原始图片位置。即,如果指定了目标uri,data就没有数据,如果没有指定uri,则data就返回有数据!现在想想,这种设计还是很合理的!

 

1. @Override  
2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
3. switch (requestCode) {
4. case REQUEST_CODE_CAMERA:
5. if (resultCode == RESULT_OK) {
6. if(data !=null){ //可能尚未指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
7. //返回有缩略图
8. if(data.hasExtra("data")){
9. "data");
10. //得到bitmap后的操作
11. }
12. else{
13. //由于指定了目标uri,存储在目标uri,intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
14. // 通过目标uri,找到图片
15. // 对图片的缩放处理
16. // 操作
17. }
18. }
19. }
20. }

3.Android系统照相机部分关键源码

 

1. // First handle the no crop case -- just return the value.  If the  
2. // caller specifies a "save uri" then write the data to it's
3. // stream. Otherwise, pass back a scaled down version of the bitmap
4. // directly in the extras.
5. if (mSaveUri != null) { //存在mSaveUri,即指定了目标uri
6. null;
7. try {
8. outputStream = mContentResolver.openOutputStream(mSaveUri);
9. outputStream.write(data);
10. outputStream.close();
11.
12. //直接返回RESULT_OK,并没有指定intent
13. finish();
14. catch (IOException ex) {
15. // ignore exception
16. finally {
17. Util.closeSilently(outputStream);
18. }
19. } else {
20. Bitmap bitmap = createCaptureBitmap(data);
21. // 返回RESULT_OK,并包含一个Intent对象,其中Extra中科key为data,value为一个bitmap
22. new Intent("inline-data").putExtra("data", bitmap));
23. finish();
24. }