【Android】Galleryを使ってSDカード内の画像をリスト表示する
2010 6月 7
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 →

いつも為になる記事をありがとうございます。
参考にさせてもらってます。
この記事を参考に、指定したディレクトリの画像だけを、ギャラリーで表示させたく
試行錯誤しているのですが、思うように行きません・・・。
記事の内容に加え、
uri = uri.parse(“指定したいディレクトリの絶対path/*”)
のようにuriを指定すれば出来ると思いやってみたんですが、
エラーで落ちてしまいます。
もし何かご存知でしたらご教授して頂けないでしょうか?
“エラーで落ちます”だけでは何とも(笑
リファレンスは確認されましたか?
※そんなことを言ってる僕自身も確認せずこの返信をしています
http://developer.android.com/reference/android/content/Intent.html
”Public Methods”欄を見ていくと、それなりに色々できそーですが。。。
取り急ぎ。