Android中获取选择图片与获取拍照返回结果差异

导语:

如今的安卓应用在选择图片的处理上大多合并使用拍照和从相册中选择这两种方式(当然这是产品dog的事,开篇跑题。。。)

今天在写一个这样的功能模块遇到一个尴尬的问题,同样是拍照获取图片功能,在同事的三星上跑没问题,但是在我的手机上一跑就崩(吐槽一下国产厂商对android的系统级改造真是太大,连错误日志都打不出来,还有老板啥时候给我配个测试机呗),下面是在某型手机上测试的报错结果

错误报告:

10-21 17:41:43.634: E/AndroidRuntime(32683): FATAL EXCEPTION: main

10-21 17:41:43.634: E/AndroidRuntime(32683): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=10, result=-1, data=Intent { act=inline-data (has extras) }} to activity {*****}: java.lang.NullPointerException

问题分析:

这是出错部分代码,可以看到我直接从返回Intent中获取uri,但实际上有些手机在拍照后uri是空的,所以空指针异常也不奇怪了

       if (resultCode == RESULT_OK) {
                Uri uri = data.getData();
                ContentResolver cr = this.getContentResolver();
                try {
                    if (bmp != null)
                        bmp.recycle();
                    bmp = BitmapFactory.decodeStream(cr.openInputStream(uri));
                    bmp = MediaStore.Images.Media.getBitmap(cr, uri);
                    imagedata = StreamUtils.stream2ByteArray(cr
                            .openInputStream(uri));
                    AVFile img_file = new AVFile("photo_1", imagedata);
                    img_file.saveInBackground();
                    images.add(img_file);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                photo.setImageBitmap(bmp);
            } else {
                Toast.makeText(PublishActivity.this, "请重新选择图片",
                        Toast.LENGTH_SHORT).show();
            }

所以解决方法就是分别处理从相册选取和拍照这两种情况,以便能适应更多的设备

解决办法

10代表拍照,20代表从相册选取。

     if (requestCode == 10) {
         if (resultCode == RESULT_OK) {
                if (bmp != null)
                    bmp.recycle();

                bmp = (Bitmap) data.getExtras().get("data");
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);
                imagedata = baos.toByteArray();
                AVFile img_file = new AVFile("photo_1", imagedata);
                img_file.saveInBackground();
                images.add(img_file);
                photo.setImageBitmap(bmp);
            } else {
                Toast.makeText(PublishActivity.this, "请重新选择图片",
                        Toast.LENGTH_SHORT).show();
            }
        }
        if (requestCode == 20) {
            if (resultCode == RESULT_OK) {
                Uri uri = data.getData();
                ContentResolver cr = this.getContentResolver();
                try {
                    if (bmp != null)
                        bmp.recycle();
                    bmp = BitmapFactory.decodeStream(cr.openInputStream(uri));
                    bmp = MediaStore.Images.Media.getBitmap(cr, uri);
                    imagedata = StreamUtils.stream2ByteArray(cr
                            .openInputStream(uri));
                    AVFile img_file = new AVFile("photo_1", imagedata);
                    img_file.saveInBackground();
                    images.add(img_file);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                photo.setImageBitmap(bmp);
            } else {
                Toast.makeText(PublishActivity.this, "请重新选择图片",
                        Toast.LENGTH_SHORT).show();
            }
        }
时间: 2024-10-13 22:56:33

Android中获取选择图片与获取拍照返回结果差异的相关文章

Qt 打开安卓相册选择图片并获取图片的本地路径

Qt 打开安卓相册选择图片并获取图片的本地路径 步骤如下: 通过 Intent 打开安卓的系统相册. 推荐使用 QAndroidJniObject::getStaticObjectField 获取静态字段. QAndroidJniObject action = QAndroidJniObject::getStaticObjectField( "android/content/Intent", "ACTION_GET_CONTENT", "Ljava/lan

Android中sqlite之从网上获取数据更新UI

Android中sqlite之从网上获取数据更新UI 在这里,本人主要想做一个 1.首先从网上获取数据 2.将获取的数据存储到本地 3.地图上显示屏幕范围内的marker. 4.当地图状态改变时,要查询本地数据库,并更新地图. BaiduMap有个setOnMapStatusChangeListener监听类,该类监听BaiduMap的状态,共有三个方法--onMapStatusChangeStart(),onMapStatusChangeFinish(),onMapStatusChange()

android中如何显示图片的一部分

android中如何显示图片的一部分 分类: Android应用开发系列教程 Android应用开发技巧 2012-04-25 23:42 1728人阅读 评论(0) 收藏 举报 androidmatrixfloatconstructorclassnull 作者:张宗硕 在android应用程序中加载一张图片,然后把它显示出来这是一件非常容易的事情,那怎么才能显示一张图片的一小部分呢,一种做法是把图片ps一下,要显示的那部分单独存成一张图片,然后程序中加载它,并把它显示出来.但这样会增加程序的图

Android中播放Gif图片的方法

Android中播放Gif图片的方法. 主要原理是取出Gif中的每一帧图片,分别设置到ImageView上边展示出来 使用到Code.Google上边的一个开源类库GifDecoder,下载不了的可以从我后边给出的Demo中搬运. 准备一个类继承自ImageView重写其构造方法同时传入一个输入流. [java] view plaincopyprint? <span style="font-size:18px;">public class GifDecoderView ex

android中实现带图片和checkbox的listview

android中实现带图片和checkbox的listview

Android 从图库选择图片,拍照图片,裁剪图片

我直接写代码了 1先来几个常亮 private static final int PHOTO_REQUEST_CAREMA = 1;// 拍照private static final int PHOTO_REQUEST_GALLERY = 2;// 从相册中选择private static final int PHOTO_REQUEST_CUT = 3;// 结果private static final String PHOTO_FILE_NAME = "temp_photo.jpg"

[原创]Android中LocationManager的简单使用,获取当前位置

Android中LocationManager的提供了一系列方法来地理位置相关的问题,包括查询上一个已知位置:注册/注销来自某个 LocationProvider的周期性的位置更新:以及注册/注销接近某个坐标时对一个已定义Intent的触发等.今天我们就来看看Android 中LocatinManager的简单使用,以获取当前所在的位置为例. 首先,我们需要获取LocationManager的一个实例,这里需要注意的是他的实例只能通过下面这种方式来获取,直接实例化LocationManager是

在android中画圆形图片的几种办法

在开发中经常会有一些需求,比如显示头像,显示一些特殊的需求,将图片显示成圆角或者圆形或者其他的一些形状.但是往往我们手上的图片或者从服务器获取到的图片都是方形的.这时候就需要我们自己进行处理,将图片处理成所需要的形状.正如茴香豆的的"茴"写法大于一种,经过我的研究,画出特殊图片的方法也不是一种,我发现了三种,且听我一一道来. 使用Xfermode 两图相交方式 通过查找资料发现android中可以设置画笔的Xfermode即相交模式,从而设置两张图相交之后的显示方式,具体模式见下图,源

Android中常见的图片加载框架

图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行图片加载. 开源框架的源码还是挺复杂的,但使用较为简单.大部分框架其实都差不多,配置稍微麻烦点,但是使用时一般只需要一行,显示方法一般会提供多个重载方法,支持不同需要.这样会减少很不必要的麻烦.同时,第三方框架的使用较为方便,这大大的减少了工作量.提高了开发效率.本文主要介绍四种常用的图片加载框架,