Skip to content

【Android】Galleryを使ってSDカード内の画像をリスト表示する

2010 6月 7
by shigezo

SDカード内の画像をGridViewを使ってリスト表示したが、表示につかうサムネイル作成をシーケンシャルで行っていることにより、画像が増える度に、恐ろしく時間がかかる。
そんな中、もっとシンプルかつ簡単な方法が見つかったのでメモする。

// インテント設定
Intent intent = new Intent(Intent.ACTION_PICK);
// とりあえずストレージ内の全イメージ画像を対象
intent.setType("image/*");
// ギャラリー表示
startActivityForResult(intent, REQUEST_PICK_CONTACT);

まず、↑これだけでGalleryが起動し、SDカード内の画像が一覧表示される
あとは画像をタップされた時のイベントを実装するのみ↓

/**
 * 標準ギャラリーから戻り時に呼ばれるイベント
 */
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
   if (requestCode == REQUEST_PICK_CONTACT) {
      // プログレスダイアログ表示
      progressDialog = new ProgressDialog(this);
      progressDialog.setTitle(R.string.sd_access);
      progressDialog.setMessage(getResources().getText(R.string.mesg_data_accessing).toString());
      progressDialog.setIndeterminate(false);
      progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
      progressDialog.show();
      // スレッドへ引渡し
      intent = data;
      new Thread(new Runnable() {
         @Override
         public void run() {
            // 画像URIを取得
            Uri photoUri = intent.getData();
            // 画像を取得
            ContentResolver conReslv = getContentResolver();
            if (photoUri != null) {
               try {
                  // ビットマップ画像を取得
                  Bitmap bitmap = MediaStore.Images.Media.getBitmap(conReslv, photoUri);
                  // バイトデータに変換
                  byte[] imgData = chngBmpToData(bitmap, Bitmap.CompressFormat.JPEG, 100);
                  // フォルダへコピー
                  File f = Environment.getExternalStorageDirectory();
                  String saveDir = f.getPath();
                  saveDataToStorage(imgData, saveDir + "/" + "select.jpg");
                  // 選択された画像PATHを共有領域にセットする
                  SharedPreferences preference = getSharedPreferences("PREF_PICT", MODE_PRIVATE);
                  SharedPreferences.Editor editor = preference.edit();
                  editor.putString("select_pict", saveDir + "/" + "select.jpg");
                  editor.commit();
                  // 正常終了
                  setResult(RESULT_OK);
               } catch (Exception e) {
                  Log.e(TAG, e.getMessage().toString());
                  e.printStackTrace();
               }
            }
            // ハンドラへ完了の合図を送出
            imgIandler.sendEmptyMessage(0);
         }
      }).start();
   }
}
/**
 * ビットマップ画像をバイトデータに変換する
 * @param src      Bitmap
 * @param format   Bitmap.CompressFormat
 * @param quality   int
 * @return         byte[]
 */
private static byte[] chngBmpToData(Bitmap src, Bitmap.CompressFormat format, int quality) {
   ByteArrayOutputStream output = new ByteArrayOutputStream();
   src.compress(format, quality, output);
   return output.toByteArray();
 
}
/**
 * 画像を保存する
 * @param data   byte[]   画像データ
 * @param dataName   String   保存パス
 * @return   boolean
 * @throws Exception
 */
private void saveDataToStorage(byte[] data, String dataName) throws Exception {
   FileOutputStream fileOutputStream = null;
   try {
      // 指定保存先に保存する
      fileOutputStream = new FileOutputStream(dataName);
      fileOutputStream.write(data);
   } catch (Exception e) {
   } finally {
      if (fileOutputStream != null) {
         fileOutputStream.close();
         fileOutputStream = null;
      }
   }
}
/**
 * 画像検索完了時のイベントハンドラ
 */
private Handler imgIandler = new Handler() {
   @Override
   public void handleMessage(Message msg) {
      // プログレスダイアログを終了
      progressDialog.dismiss();
      // アクティビティ削除
      finish();
   }
};

3 Responses leave one →
  1. 伊藤陽祐 permalink
    11月 4, 2010

    いつも為になる記事をありがとうございます。
    参考にさせてもらってます。

    この記事を参考に、指定したディレクトリの画像だけを、ギャラリーで表示させたく
    試行錯誤しているのですが、思うように行きません・・・。

    記事の内容に加え、
    uri = uri.parse(“指定したいディレクトリの絶対path/*”)
    のようにuriを指定すれば出来ると思いやってみたんですが、
    エラーで落ちてしまいます。

    もし何かご存知でしたらご教授して頂けないでしょうか?

    • shigezo permalink
      11月 5, 2010

      “エラーで落ちます”だけでは何とも(笑

      リファレンスは確認されましたか?
      ※そんなことを言ってる僕自身も確認せずこの返信をしています

      http://developer.android.com/reference/android/content/Intent.html

      ”Public Methods”欄を見ていくと、それなりに色々できそーですが。。。

      取り急ぎ。

Trackbacks and Pingbacks

  1. みやっちのblog » Blog Archive » Xperiaのジオタグを修正するプログラム(結果不要)

Leave a Reply

Note: You can use basic XHTML in your comments. Your email address will never be published.

Subscribe to this comment feed via RSS