导语:

如今的安卓应用在选择图片的处理上大多合并使用拍照和从相册中选择这两种方式

今天在写一个这样的功能时遇到一个尴尬的问题,同样是拍照获取图片功能,在不同手机上运行的效果不一样,下面是在某型手机上测试的报错结果

错误报告:

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();
}
}

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

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

    Qt 打开安卓相冊选择图片并获取图片的本地路径 过程例如以下: 通过 Intent 打开安卓的系统相冊. 推荐使用 QAndroidJniObject::getStaticObjectField 获取 ...

  2. input file获取选择图片的本地路径和base64路径

    input file获取选择图片的本地路径和base64路径 本地路径: myHeadFile: function (e) { // 这里是input file 的onchange事件 ] const ...

  3. android中使用Nine-Patch图片

    android中可以把图片进行处理,如果图片被拉伸的话,允许让图片部分区域不拉伸,部分区域拉伸.这个功能非常好,比如聊天的气泡,如果整个气泡被拉伸的话,会非常的丑. 老版的sdk中提供的有draw9p ...

  4. Android中的ImageView的getDrawableCache获取背景图片的时候注意的问题

    获取ImageView的背景图片使用getDrawableCache方法,不要使用getDrawable方法,后者获取不到图片的. 1.在调用imageView.getDrawableCache()之 ...

  5. Android中 Bitmap Drawable Paint的获取、转换以及使用

    比如Drawable中有一系列连续的图片,img_0.png, img_1.png, img_2.png ... 如果要动态获取这些图片,通过"R.drawable.img_x"的 ...

  6. Android 打开照相机、获取相册图片、获取图片并裁减

    一.调用照相机 注:surfaceView在当Activity不在前台的时候,会被销毁(onPause方法之后,执行销毁方法)当Activity回到前台时,在Activity执行onResume方法之 ...

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

    Android中LocationManager的提供了一系列方法来地理位置相关的问题,包括查询上一个已知位置:注册/注销来自某个 LocationProvider的周期性的位置更新:以及注册/注销接近 ...

  8. Android中常见的图片加载框架

    图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行 ...

  9. Android 调用图库选择图片实现和参数详解

    //选择图片,调用图库        bt4.setOnClickListener(new OnClickListener() { @Override            public void o ...

随机推荐

  1. SB Admin 2 学习笔记1

    需要掌握能够搭建起一个 dashboard 的能力, 因为很少有运维开发团队有专职的前端, bootstrap 也要讲个基本法. SB Admin 2, 一个免费的 bootstrap theme, ...

  2. Gnome_Terminal

    快捷键 ctrl shift m 我自定义的快捷键,可以给终端命名 ctrl shift t 新建标签页,并且目录为当前目录 ctrl shift pageup 标签页往前移 ctrl shift p ...

  3. 【转载】Shell判断字符串包含关系的几种方法

    http://www.cnblogs.com/ginsonwang/p/5525340.html 下面是直接copy的内容: (本来是不打算copy的,但是每次用到或看的时候都要跳转,感觉挺麻烦的.就 ...

  4. ionic + cordova+angularJs 搭建的H5 App完整版总结

      为期半个月的项目实践开发,已完整告一段落,团队小组获得第一名,辛苦总算没有白费,想起有一天晚上,整个小组的人,联调到12点才从公司回去,真是心酸.这里总结一下,项目过程中遇到的问题 和感悟.哈哈, ...

  5. js 与 jq 的节点添加删除实例

    JavaScript实例:XML DOM节点的添加 <!DOCTYPE html> <html> <head> <meta charset="utf ...

  6. JAX-RS规范-常用注解浅析(WebServer)

    一.@Path 若希望一个Java类能够处理REST请求,则这个类必须至少添加一个@Path("/")的annotation: 对于方法,这个annotation是可选的,如果不添 ...

  7. Linux学习日记之磁盘与档案系统

    主要定义 磁盘的物理组成磁盘主要由圆形磁盘(多张).机械手臂.磁头等组成.每张磁盘都有不同的磁道,半径相同的磁道组成了磁柱,沿着中心划线可将磁盘分成若干扇区,每个扇区的大小是512Bytes. 磁盘分 ...

  8. php转化IP为整形

    <?php function a($ip){ $intIP = ip2long($ip); return $intIP; } function b($intIP){ $IPStr = long2 ...

  9. YUV格式介绍

    原文链接:http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html YUV格式有两大类:planar和packed.对于plana ...

  10. 分享篇——我的Java学习路线

    虽然之前我是开发出身,但是我学习的语言是Objective-c,这个语言使用起来范围比较窄,对于自动化学习来说也是无用武之地,所以我自己学习了Java,对于一个有开发经验的人来说学习一门新语言相对来说 ...