zoukankan      html  css  js  c++  java
  • Android_照相机Camera_调用系统照相机返回data为空

    1.调用系统照相机

    [java] view plaincopy在CODE上查看代码片派生到我的代码片

     
    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);  
    但是在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就返回有数据!现在想想,这种设计还是很合理的!

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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.                     Bitmap thumbnail = data.getParcelableExtra("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系统照相机部分关键源码

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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.     OutputStream outputStream = null;  
    7.     try {  
    8.         outputStream = mContentResolver.openOutputStream(mSaveUri);  
    9.         outputStream.write(data);  
    10.         outputStream.close();  
    11.   
    12.         setResult(RESULT_OK);   //直接返回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.     setResult(RESULT_OK, new Intent("inline-data").putExtra("data", bitmap));  
    23.     finish();  
    24. }  
     
     
  • 相关阅读:
    [WinJS] Promise 用法
    Python 统计代码行
    mac下Apache + MySql + PHP网站开发
    android中,获取网速的方法实现
    如何屏蔽掉两个activity切换时的动画效果
    dp与px的相互转化
    毫秒的格式化
    关于android中事件传递和分发的一些小理解
    汉字转拼音
    关于实现无限循环的做法
  • 原文地址:https://www.cnblogs.com/summers/p/4324076.html
Copyright © 2011-2022 走看看