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

    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();
    }
  • 相关阅读:
    9、实战快速上手
    8、路由【前端实现页面的跳转】
    7、Webpack的学习【打包工具】
    6、vue的安装【nodejs、vue-cli】
    5、计算属性、内容分发、自定义事件
    4、Axios异步通信
    3、Vue表单的双向绑定以及第一个Vue组件
    2、Vue的基本属性
    PHP算法之寻找两个有序数组的中位数
    PHP算法之无重复字符的最长子串
  • 原文地址:https://www.cnblogs.com/childhooding/p/4388462.html
Copyright © 2011-2022 走看看