周刚的专栏

相信,世上所有的苦难都只为成就那一个最好的你。

Android相册缩略图的一些探索

    最近在做一个应用。里面需要有可以拍照、选择多张相片,上传到网上的功能。上传的就不说了,容易,不是重点。重点让我头痛的是图片选择多张图的问题:

做过的人知道,默认从系统相册中选取相片很容易:

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。怎么去拿缩略图呢?


 

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nnmmbb/article/details/16331639
个人分类: java android
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭