在Android移动开发过程中,如果直接按照原生方式进行拍照经常会出现像素太低(可能只有几十KB),照片非常模糊的问题。
Activity中启动相机的代码:
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(openCameraIntent, RESUEST_PHOTO);
在返回结果的onActivityResult中直接通过Bitmap bm = (Bitmap) data.getExtras().get(“data”)获取相片:
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==RESUEST_PHOTO ) {
switch (requestCode) {
case RESUEST_PHOTO:
if (resultCode == RESULT_OK) {
String fileName = String.valueOf(System.currentTimeMillis());
Bitmap bm = (Bitmap) data.getExtras().get("data");
break;
default:
break;
}
}
}
对于这个问题,有一种解决方式是按照xcymorningsun的方法,先将拍得的照片临时保存在本地,在onActivityResult方法中再将图片取出,并经过缩小处理再显示在界面上或将原图上传给服务器。
这种方法对于单张相片有比较好的效果,但对于多张相片则会报出OutOfMemory异常问题。关于OutOfMemory异常问题,cctcc的博客有过比较详细的介绍,有三个需要注意的地方:第一,加载缩略图的时候不要直接使用原始图片;第二,图片使用后要通过recycle()进行资源回收。
回到最初的问题,如果我们想要像微信朋友圈一样连续拍摄多张图片并进行展示的话,应该怎么做呢?
一种解决思路是拍照的时候就将照片保存在本地,并且留出相片的保存地址。之后要展示缩略图或者上传原图就直接调用该地址,此时用到的方法就和在相册中选取相片的方法一样了。具体代码如下。
现定义照片存放的路径:
private String path = "";
启动相机:
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(Environment.getExternalStorageDirectory()
+ "/myimage/", String.valueOf(System.currentTimeMillis())
+ ".jpg");
path = file.getPath();
Uri imageUri = Uri.fromFile(file);
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(openCameraIntent, TAKE_PICTURE);
最后在onActivityResult中将照片路径添加到照片路径集中即可。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case TAKE_PICTURE:
if (Bimp.drr.size() < 9 && resultCode == -1) {
Bimp.drr.add(path);
}
break;
}
}
其中Bimp.drr是ArrayList类型变量。有了照片路径,之后想要对照片进行什么操作就很容易了。照片使用完后如果不再需要的话记得将其删除。