导语:

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

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

错误报告:

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. View手动切换焦点注意事项

    这几天一直在解决一个焦点切换的问题,由于是直接用另外一家公司的代码,没有细看.当应用到测试那边,发现了这个问题,而且真机调试有些问题,不能单步调试,后来是看日志才发现这个问题. ViewA包含几个可以 ...

  2. 解决NetBeans运行web项目时出现的“未能正确设置java DB”问题

    1.在NetBeans导航器中,点击"服务"选项卡: 2.展开"数据库"菜单: 3.在"Java DB"上右键 –> 选择" ...

  3. UIRefreshControl

    在iOS6中UITableViewController 已经集成了UIRefreshControl 控件.UIRefreshControl目前只能用于UITableViewController

  4. Java算法之递归打破及在真实项目中的使用实例

    开心一笑 刚才领导问开发:"你觉得这个项目的最大风险是什么",开发说:"加班猝死" , 气氛尴尬了一分钟!!! 提出问题 1.递归算法简单复习 2.如何实现递归 ...

  5. 给钛度产品的一些建议(Note)

    背景:上一只鼠标坏了,今天299从京东如了一只钛度鼠标,核心用料据说都很高端,设计也不错.但是实际用起来发现了很多码农常识问题和产品建议,遂反馈给钛度客服,并记录于此. 传送门: http://bbs ...

  6. Unity Cookie

    1   在Unity里面,选择脚本单击左键打开 Sync Mono Development  这样就可以打开整个工程的脚本文件 进而才能在脚本中继续进行切换      Mesh    MeshFilt ...

  7. python import cv2 出错:cv2.x86_64-linux-gnu.so: undefined symbol

    之前写过一个python使用opencv处理图片的脚本,当时是可以使用的,现在突然发现执行时出错: ImportError: /usr/lib/python2.7/dist-packages/cv2. ...

  8. linux shell基础命令

    du -h  #查询磁盘文件大小和列表 df  -h   # 查询服务器磁盘使用情况 top/free   # 查询服务器内存,cpu等资源使用情况 iptables    # 防火墙相关的命令 vi ...

  9. [leetcode] 数字游戏

    169. Majority Element Given an array of size n, find the majority element. The majority element is t ...

  10. SGIP、SMGP 长短信发送问题小结

    长短信发送问题.1.将信息长度拆开发送.2.为了解决长短信拆分发送,在手机终端,收到的顺序错乱,所以在每一段短信发送完成后,延时5秒,这样在手机终端客户收到的信息,就会按照拆分的顺序发送. //信息总 ...