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 ...
随机推荐
- C语言小结
1.输入输出: char s; printf("Enter a string"); scanf("%s",&s); printf(''Hello,%s& ...
- 纯html页面之间传参
//页面引入//传参方法,可解析url参数 (function($){ $.getUrlParam = function(name) { var reg = new RegExp("(^|& ...
- 关于easyui datagrid 表格数据处理
首先先将easyui 引入到jsp页面中 <link rel="stylesheet" type="text/css" href="easyui ...
- ProtocolBuffers-3 For Objective C (2)-进阶
先介绍几个常用关键字: equired前缀表示该字段为必要字段,既在序列化和反序列化之前该字段必须已经被赋值.与此同时,在Protocol Buffer中还存在另外两个类似的关键字,optional和 ...
- es6要用严格模式
实验let的块级作用域,在sublime的Tools--Babel--Babel Transform检测未出现错误,在html中也未出现错误,唯在控制台中一直报错. //js名为es6.js ---* ...
- linux系统的初化始配置
一.网络的初始化 1.ip地址的修改(临时生效) 使用ifconfig命令 ifconfig 网卡名 ip地址 子网掩码 [root@localhost /]# ifconfig eno1677773 ...
- 使用AFNetWorking上传图片
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; NSString *string ...
- 分割一个表到多个实体<EntityFramework6.0>
声明方式 public class Photograph { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public in ...
- CentOS一键ftp
# Version : 1.0 # Author : 果子 # Date : -- :: # Description : 只需要三步即可完成安装 # chmod a+x install_vsftpd. ...
- cout输出控制——位数和精度控制
刷到一道需要控制输出精度和位数的题目 刚开始以为单纯使用 iomanip 函数库里的 setprecision 就可以,但 OJ 给我判了答案错误,后来一想这样输出并不能限制位数只能限制有效位数. 比 ...