您的位置:首页 > 移动开发 > Android开发

调用系统相机 data返回null

2015-08-25 18:44 846 查看


1.调用系统照相机

[java] view
plaincopy





//实例化一个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就返回有数据!现在想想,这种设计还是很合理的!

[java] view
plaincopy





@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系统照相机部分关键源码

[java] view
plaincopy





// 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();  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 相机