Androidアルバムのサムネイルのいくつかの探求

4132 ワード

最近アプリを作っています.写真を撮ったり、複数の写真を選んだりして、インターネットにアップロードできる機能が必要です.アップロードしたのは言わないで、簡単で、重点ではありません.重点的に頭が痛いのは、画像の複数の図を選択する問題です.
やった人は知っていますが、デフォルトでシステムアルバムから写真を選ぶのは簡単です.
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システムには2つのテーブルがあります.
原図に関する情報を格納する表:
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.どうやってサムネイルを取りに行きますか?