Android中获取选择图片与获取拍照返回结果差异
导语:
如今的安卓应用在选择图片的处理上大多合并使用拍照和从相册中选择这两种方式
今天在写一个这样的功能时遇到一个尴尬的问题,同样是拍照获取图片功能,在不同手机上运行的效果不一样,下面是在某型手机上测试的报错结果
错误报告:
10-21 17:41:43.634: E/AndroidRuntime(32683): FATAL EXCEPTION: main
问题分析:
这是出错部分代码,可以看到我直接从返回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中获取选择图片与获取拍照返回结果差异的更多相关文章
- Qt 打开安卓相冊选择图片并获取图片的本地路径
Qt 打开安卓相冊选择图片并获取图片的本地路径 过程例如以下: 通过 Intent 打开安卓的系统相冊. 推荐使用 QAndroidJniObject::getStaticObjectField 获取 ...
- input file获取选择图片的本地路径和base64路径
input file获取选择图片的本地路径和base64路径 本地路径: myHeadFile: function (e) { // 这里是input file 的onchange事件 ] const ...
- android中使用Nine-Patch图片
android中可以把图片进行处理,如果图片被拉伸的话,允许让图片部分区域不拉伸,部分区域拉伸.这个功能非常好,比如聊天的气泡,如果整个气泡被拉伸的话,会非常的丑. 老版的sdk中提供的有draw9p ...
- Android中的ImageView的getDrawableCache获取背景图片的时候注意的问题
获取ImageView的背景图片使用getDrawableCache方法,不要使用getDrawable方法,后者获取不到图片的. 1.在调用imageView.getDrawableCache()之 ...
- Android中 Bitmap Drawable Paint的获取、转换以及使用
比如Drawable中有一系列连续的图片,img_0.png, img_1.png, img_2.png ... 如果要动态获取这些图片,通过"R.drawable.img_x"的 ...
- Android 打开照相机、获取相册图片、获取图片并裁减
一.调用照相机 注:surfaceView在当Activity不在前台的时候,会被销毁(onPause方法之后,执行销毁方法)当Activity回到前台时,在Activity执行onResume方法之 ...
- [原创]Android中LocationManager的简单使用,获取当前位置
Android中LocationManager的提供了一系列方法来地理位置相关的问题,包括查询上一个已知位置:注册/注销来自某个 LocationProvider的周期性的位置更新:以及注册/注销接近 ...
- Android中常见的图片加载框架
图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行 ...
- Android 调用图库选择图片实现和参数详解
//选择图片,调用图库 bt4.setOnClickListener(new OnClickListener() { @Override public void o ...
随机推荐
- 将数据导入Excel
/** * 查询未打印订单 * @param req * @param sort * @param order * @param rows * @param page * @return */ pub ...
- 学号20145332 《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验
实验目的 掌握在 ARM 开发板实现一个简单 WEB 服务器的过程. 学习在 ARM 开发板上的 SOCKET 网络编程. 学习 Linux 下的 signal()函数的使用. 实验内容 学习使用 s ...
- JS脚本语言是什么意思?
javascript,Javascript是一种浏览器端的脚本语言,用来在网页客户端处理与用户的交互,以及实现页面特效.比如提交表单前先验证数据合法性,减少服务器错误和压力.根据客户操作,给出一些提升 ...
- mysql介绍及安装
一.MySQL介绍 1.标志 MySQL的海豚标志的名字叫"sakila",它是由MySQL AB的创始人从用户在"海豚命名"的竞赛中建议的大量的名字表中选出的 ...
- 与你相遇好幸运,gen8安装
gen8到手后,立马去买了 SSD https://item.jd.com/2010277.html 支架 https://item.jd.com/2671609.html NAS盘 https:// ...
- Xamarin教程索引页
持续更新中-- 近期学习处理Xamarin.Android动画内容 Xamarin指南 -- 官网教程翻译 Xamarin跨平台开发 Xamarin Workbooks Xamarin Workboo ...
- Javascript实现的数组降维——维度不同,怎么谈恋爱
数组的元素可能是数组,这样一层层嵌套,可能得到一个嵌套很深的数组,数组降维要做的事就是把嵌套很深的数组展开,一般最后得到一个一维数组,其中的元素都是非数组元素,比如数组[1, [2, 3, [4, 5 ...
- js 实现表格的可编辑状态
实现表格的可编辑,点击修改以后可以编辑,代码如下: <!DOCTYPE HTML> <html> <head> <meta charset="utf ...
- Swift学习之熟悉控件
最近是比较清闲一些的,对于一个开发者来说,这也是一个很好的充电机会.以前做项目都是使用Objective-C去开发,但我们都知道,Swift语言从2014年的出现到现在,一步一步变的完善,渐渐变的受欢 ...
- jackrabbit学习笔记(1)
http://dove19900520.iteye.com/blog/1654346 看的这个文章照着来的,遇到了一些问题,记录一下 运行报这个错:NamespaceException: wiki: ...