最近在做一个应用。里面需要有可以拍照、选择多张相片,上传到网上的功能。上传的就不说了,容易,不是重点。重点让我头痛的是图片选择多张图的问题:
做过的人知道,默认从系统相册中选取相片很容易:
package com.easymorse.gallery;
import java.io.File;
import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class GalleryActivity extends Activity {
private static int SELECT_PICTURE;
private File tempFile;
Button button;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.tempFile=new File("/sdcard/a.jpg");
button = new Button(this);
button.setText("获取图片");
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent.putExtra("crop", "true");
// intent.putExtra("aspectX", 1);
// intent.putExtra("aspectY", 2);
intent.putExtra("output", Uri.fromFile(tempFile));
intent.putExtra("outputFormat", "JPEG");
startActivityForResult(Intent.createChooser(intent, "选择图片"),
SELECT_PICTURE);
}
});
setContentView(button);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == SELECT_PICTURE) {
button.setBackgroundDrawable(Drawable.createFromPath(tempFile
.getAbsolutePath()));
}
}
}
}
难点是,这个应用需要能一次选取多张照片。于是就不能使用系统相册了。于是我决定自己用GridView写一个自己的类似相册一样展示相片的功能。既然要大面积展示
照片,就要涉及到缩略图的问题了。android系统中有两个表:
存储原图相关信息的表:
android.provider.MediaStore.Images.Media
存储缩略图相关信息的表:
android.provider.MediaStore.Images.Thumbnails
有关它们的关系,看这篇文章:http://blog.csdn.net/java2009cgh/article/details/8364735
按理说,拍摄的每一张相片启动扫描以后,就会在原图里面生成一条记录,并且生成缩略图,放在DCIM/.thumbnails里面,并且将缩略图的地址的地址存放在缩略图表里面。
缩略图表里面的图和原图可以关联上。这就是为什么点击缩略图可以查看到原图了。
现在情况是这样的,我程序里面调用系统Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 进行拍照,开始的时候,拍的照片在系统相册里面都没有。于是参照上面这篇博客,拍照成功后通过这句代码通知系统启动文件扫描:
Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
scanIntent.setData(Uri.fromFile(new File(filePath)));
scanIntent.sendBroadcast(scanIntent);
关于指定文件扫描具体看http://www.cnblogs.com/wanqieddy/archive/2012/12/05/2802680.html
这一步确实有效,可以在系统相册里面看到我应用里面拍的照片了。
但是,我的应用里面通过Thumbnails表里面查询地址,并通过cursor拿缩略图却没有。事实上,我把开数据库,也确实没有生成记录,在SD卡DCIM/.thumbnails中也没有生成
对应的缩略图。由此可见:1、启动扫描不只能保证照片的原图会记录到表中,但却不保证能生成缩略图。2、系统相册我们看到的缩略图不是从SD卡DCIM/.thumbnails中读取的。
后来,进一步发现,不用我的应用里面拍照,而是直接从相机应用里拍照,默认会生成记录到原图表中,但不会生成缩略图。于是乎,我们的程序从缩略图表中读数据,又读不到了。但系统相册还是有缩略图。系统相册的缩略图是怎么得到的呢?
我也尝试自己生成缩略图,那就是拿到原图的_ID然后通过这句代码,手动生成缩略图:MediaStore.Images.Thumbnails.getThumbnail(contentResolver, id, Images.Thumbnails.MICRO_KIND, options) 从相机中拍的照片,会生成_ID,然后用这个ID去生成缩略图,问题解决了一半儿。从相机应用中拍的照片缩略图终于可以读出来了。但还有一个问题,那就是,在我的应用中刚拍的照片,得不到它的_ID。怎么去拿缩略图呢?