• 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. }  
     
     
  • 相关阅读:
    MSDTC故障排除,DTCTester用法 (二)
    如何清除WebBrowser的Cookies
    修改远程桌面连接端口3389,RDP-Tcp的portnumber要用十六进制修改
    JavaScript Patterns 4.9 Configuration Objects
    JavaScript Patterns 4.8 Function Properties
    JavaScript Patterns 4.7 Init-Time Branching
    JavaScript Patterns 4.6 Immediate Object Initialization
    JavaScript Patterns 4.5 Immediate Functions
    JavaScript Patterns 4.4 Self-Defining Functions
    JavaScript Patterns 4.3 Returning Functions
  • 原文地址:https://www.cnblogs.com/summers/p/4324076.html
Copyright © 2020-2023  润新知