导语:

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

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

错误报告:

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是空的,所以空指针异常也不奇怪了

  1.        if (resultCode == RESULT_OK) {
  2. Uri uri = data.getData();
  3. ContentResolver cr = this.getContentResolver();
  4. try {
  5. if (bmp != null)
  6. bmp.recycle();
  7. bmp = BitmapFactory.decodeStream(cr.openInputStream(uri));
  8. bmp = MediaStore.Images.Media.getBitmap(cr, uri);
  9. imagedata = StreamUtils.stream2ByteArray(cr
  10. .openInputStream(uri));
  11. AVFile img_file = new AVFile("photo_1", imagedata);
  12. img_file.saveInBackground();
  13. images.add(img_file);
  14. } catch (FileNotFoundException e) {
  15. e.printStackTrace();
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. photo.setImageBitmap(bmp);
  20. } else {
  21. Toast.makeText(PublishActivity.this, "请重新选择图片",
  22. Toast.LENGTH_SHORT).show();
  23. }

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

解决办法

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

  1.      if (requestCode == 10) {
  2.     if (resultCode == RESULT_OK) {
  3. if (bmp != null)
  4. bmp.recycle();
  5.  
  6. bmp = (Bitmap) data.getExtras().get("data");
  7. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  8. bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);
  9. imagedata = baos.toByteArray();
  10. AVFile img_file = new AVFile("photo_1", imagedata);
  11. img_file.saveInBackground();
  12. images.add(img_file);
  13. photo.setImageBitmap(bmp);
  14. } else {
  15. Toast.makeText(PublishActivity.this, "请重新选择图片",
  16. Toast.LENGTH_SHORT).show();
  17. }
  18. }
  19. if (requestCode == 20) {
  20. if (resultCode == RESULT_OK) {
  21. Uri uri = data.getData();
  22. ContentResolver cr = this.getContentResolver();
  23. try {
  24. if (bmp != null)
  25. bmp.recycle();
  26. bmp = BitmapFactory.decodeStream(cr.openInputStream(uri));
  27. bmp = MediaStore.Images.Media.getBitmap(cr, uri);
  28. imagedata = StreamUtils.stream2ByteArray(cr
  29. .openInputStream(uri));
  30. AVFile img_file = new AVFile("photo_1", imagedata);
  31. img_file.saveInBackground();
  32. images.add(img_file);
  33. } catch (FileNotFoundException e) {
  34. e.printStackTrace();
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. photo.setImageBitmap(bmp);
  39. } else {
  40. Toast.makeText(PublishActivity.this, "请重新选择图片",
  41. Toast.LENGTH_SHORT).show();
  42. }
  43. }

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. Python之Web框架Django

    Python之Web框架: Django 一. Django Django是一个卓越的新一代Web框架 Django的处理流程 1. 下载地址  Python 下载地址:https://www.pyt ...

  2. AnyImgUpload

    @{ ViewBag.Title = "ImgForAny"; Layout = null; } <h2>ImgForAny</h2> <script ...

  3. October 31st Week 45th Monday 2016

    While there is life there is hope. 一息若存,希望不灭. Go on living even if there is no hope. Knowing is not ...

  4. Lintcode 102.带环链表

    ------------------------ 只要设置两个指针,称为快慢指针,当链表没有环的时候快指针会走到null,当链表有环的时候快指针早晚会追上慢指针的. AC代码: /** * Defin ...

  5. 使用PowerShell来修改文件访问,创建,修改时间属性

    Function Set-FileTimeStamps { Param ( [Parameter(mandatory=$true)] [string[]]$path, [datetime]$date ...

  6. 【leetcode】Roman to Integer

    题目描述: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range fr ...

  7. 【转载】 wpf无边框的方法以及拖拽的问题

    今天在做wpf程序的时候遇到了一个制作无边框的窗体并且有透明圆角的问题,我把解决的过程写下来,和大家学习 正常窗体必须把WindowStyle="None"这个属性加上去,但是加上 ...

  8. UWP 颜色选择器(ColorPicker) 和 自定义的Flyout(AdvancedFlyout)

    ColorPicker 故事背景 项目里面需要一个像Winfrom里面那样的颜色选择器,如下图所示: 在网上看了一下.没有现成的东东可以拿来使用.大概查看了一下关于颜色的一些知识,想着没人种树,那就由 ...

  9. 激光打印机的Color/paper, Xerography介绍

    Color Basic 看见色彩三要素: 光源,物体,视觉 加色色彩模型:R,G,B 多用于显示器 减色色彩模型:C,M,Y,K 多用于打印复印 Paper 东亚地区常用A系列标准用纸,在多功能一体机 ...

  10. Beginning Scala study note(7) Trait

    A trait provides code reusability in Scala by encapsulating method and state and then offing possibi ...