1.调用系统照相机

[java] view plaincopy

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

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

  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. setResult(RESULT_OK);   //直接返回RESULT_OK,并没有指定intent
  12. finish();
  13. } catch (IOException ex) {
  14. // ignore exception
  15. } finally {
  16. Util.closeSilently(outputStream);
  17. }
  18. } else {
  19. Bitmap bitmap = createCaptureBitmap(data);
  20. // 返回RESULT_OK,并包含一个Intent对象,其中Extra中科key为data,value为一个bitmap
  21. setResult(RESULT_OK, new Intent("inline-data").putExtra("data", bitmap));
  22. finish();
  23. }
 
 

Android_照相机Camera_调用系统照相机返回data为空的更多相关文章

  1. android 调用系统照相机拍照后保存到系统相册,在系统图库中能看到

    需求:  调用系统照相机进行拍照,并且保存到系统相册,调用系统相册的时候能看到   系统相册的路径:String cameraPath= Environment.getExternalStorageD ...

  2. 解决ajaxfileupload上传文件在IE浏览器返回data为空问题

    关于ajaxfileupload,建议还是别用,已经没有人维护的脚本了,笔者就是入了这个坑. 在IE浏览器中ajaxfileupload返回data为空 jq.ajaxFileUpload ( { u ...

  3. Android调用系统照相机

    ndroid调用系统相机实现拍照功能 在实现拍照的功能时遇到了很多问题,搜索了很多资料,尝试了很多办法,终于解决了,下面简要的描述下在开发过程中遇到的问题. 虽然之前看过android开发的书,但是没 ...

  4. Android 调用系统照相机拍照和录像

    本文实现android系统照相机的调用来拍照 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.a ...

  5. [项目总结]关于调用系统照相机Activity被销毁问题解决

    在项目中需要启用系统照相机来拍照.本来很容易的一个问题.但在适配中出现了问题. 简单说一下问题: 有些手机拍照成功,有些手机拍完照后确定返回后activity数据丢失,被销毁了. 问题查找: 经过代码 ...

  6. [android] 调用系统照相机和摄像机

    查看系统照相机源码,找到清单文件查看 查看意图过滤器,action是android.media.action.IMAGE_CAPTURE category是android.intent.categor ...

  7. IOS 调用系统照相机和相册

    /** *  调用照相机 */ - (void)openCamera { UIImagePickerController *picker = [[UIImagePickerController all ...

  8. 关于调用系统照相机Activity被销毁问题解决

    <activity                  android:name=".visitplan_finish"                  android:co ...

  9. Android调用系统相机、自己定义相机、处理大图片

    Android调用系统相机和自己定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,而且因为涉及到要把拍到的照片显示出来,该样例也会涉及到Android载入大图片时候的处 ...

随机推荐

  1. 解决springboot druid 数据库批量更新错误问题

    原文:https://www.2cto.com/kf/201712/706399.html springboot druid 数据库多SQL错误multi-statement not allow Ca ...

  2. How can I add a site title refiner

    一篇非常好的博客,收藏一下 https://sharepoint.stackexchange.com/questions/109409/how-can-i-add-a-site-title-refin ...

  3. [Android Pro] AndroidX了解一下

    cp : https://blog.csdn.net/qq_17766199/article/details/81433706 1.说明 官方原文如下: We hope the division be ...

  4. C# Queue 和Stack的实现

    Queue 和Stack的使用就不用多说吧,一个是先进先出,一个是后进先出. 这里我主要关注其实现原理. queue的实现如下: public class Queue<T> : IEnum ...

  5. Spark:实现行转列

    示例JAVA代码: import static org.apache.spark.sql.functions.col; import static org.apache.spark.sql.funct ...

  6. 调用 setState 之后发生了什么?

    (1)代码中调用 setState 函数之后,React 会将传入的参数对象与组件当前的状态合并,然后触发所谓的调和过程(Reconciliation).(2)经过调和过程,React 会以相对高效的 ...

  7. Python中调用自然语言处理工具HanLP手记

    手记实用系列文章: 1 结巴分词和自然语言处理HanLP处理手记 2 Python中文语料批量预处理手记 3 自然语言处理手记 4 Python中调用自然语言处理工具HanLP手记 5 Python中 ...

  8. vue Object.defineProperty Proxy 数据双向绑定

    Object.defineProperty 虽然已经能够实现双向绑定了,但是他还是有缺陷的. 只能对属性进行数据劫持,所以需要深度遍历整个对象 对于数组不能监听到数据的变化 虽然 Vue 中确实能检测 ...

  9. iPhone X 适配 ( iOS 11适配 )

    总结: 1.状态栏高度发生变化,解决方案:布局的时候这个高度不要写死,通过方法获取高度. 2.导航栏的视图层级结构发生变化而导致 UI(titleView.UIBarButtonItem) 问题. 3 ...

  10. 那天有个小孩教我WCF[一][2/3]

    接着上次的继续讲吧 我们开始吧 9.创建数据库 use master go --创建库 if exists(select * from sysdatabases where name='NewsDB' ...