10

SDCard にある特定のフォルダから画像をロードするグリッドビューを作成しようとしています。フォルダーへのパスはわかっています ("/sdcard/pictures") ですが、オンラインで見た例では、画像をロードする写真フォルダーへのパスを指定する方法や場所がわかりません。developer.android.com の HelloGridView チュートリアルでさえ、何十ものチュートリアルを読みましたが、それらのチュートリアルは私が求めているものを教えてくれません。

これまでに読んだすべてのチュートリアルには、次のいずれかがあります。

A) 画像を /res フォルダから Drawable として呼び出し、SDCard をまったく使用せずに、ロードする配列に配置します。

B) MediaStore を使用して SDCard 上のすべての画像にアクセスしましたが、画像フォームを表示したいフォルダーへのパスを設定する方法を指定していません

また

C) BitmapFactory を使用することをお勧めしますが、使用方法がまったくわかりません。

これについて間違った方法で行っている場合は、私に知らせて、私がやろうとしていることを行うための適切な方法に向けてください.

4

6 に答える 6

15

OK、試行錯誤を繰り返した後、ようやく機能する例が得られたので、共有したいと思いました。この例では、画像 MediaStore をクエリし、各画像のサムネイルを取得してビューに表示します。画像を Gallery オブジェクトにロードしていますが、これはこのコードが機能するための要件ではありません。

ギャラリーの ImageAdapter がそれらにアクセスできるように、クラス レベルで定義された列インデックスの Cursor と int があることを確認してください。

private Cursor cursor;
private int columnIndex;

まず、フォルダーにあるイメージ ID のカーソルを取得します。

Gallery g = (Gallery) findViewById(R.id.gallery);
// request only the image ID to be returned
String[] projection = {MediaStore.Images.Media._ID};
// Create the cursor pointing to the SDCard
cursor = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
        projection, 
        MediaStore.Images.Media.DATA + " like ? ",
        new String[] {"%myimagesfolder%"},  
        null);
// Get the column index of the image ID
columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
g.setAdapter(new ImageAdapter(this));

次に、Gallery の ImageAdapter で、表示するサムネイルを取得します。

public View getView(int position, View convertView, ViewGroup parent) {
    ImageView i = new ImageView(context);
    // Move cursor to current position
    cursor.moveToPosition(position);
    // Get the current value for the requested column
    int imageID = cursor.getInt(columnIndex);
    // obtain the image URI
    Uri uri = Uri.withAppendedPath( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Integer.toString(imageID) );
    String url = uri.toString();
    // Set the content of the image based on the image URI
    int originalImageId = Integer.parseInt(url.substring(url.lastIndexOf("/") + 1, url.length()));
    Bitmap b = MediaStore.Images.Thumbnails.getThumbnail(getContentResolver(),
                    originalImageId, MediaStore.Images.Thumbnails.MINI_KIND, null);
    i.setImageBitmap(b);
    i.setLayoutParams(new Gallery.LayoutParams(150, 100));
    i.setScaleType(ImageView.ScaleType.FIT_XY);
    i.setBackgroundResource(mGalleryItemBackground);
    return i;
}

このコードの最も重要なセクションは、MediaStore クエリを使用して特定のフォルダー内の画像ファイルのリストをフィルター処理する方法を示す managedQuery だと思います。

于 2011-08-23T14:55:07.123 に答える
4

developer.android.com の GridView チュートリアルよりもいくつかの手順を実行する必要があります。次のチュートリアルを使用 http://developer.android.com/resources/tutorials/views/hello-gridview.html

SD カードからファイルの ImageView を作成するメソッドを追加する必要があります。

クラス変数に Vector を作成/追加します (ImageViews のリストを保持するため):

private Vector<ImageView> mySDCardImages;

ベクトルを初期化します。

mySDCardImages = new Vector<ImageView>();

画像をロードするメソッドを作成します。

List<Integer> drawablesId = new ArrayList<Integer>();
int picIndex=12345;
File sdDir = new File("/sdcard/pictures");
File[] sdDirFiles = sdDir.listFiles();
for(File singleFile : sdDirFiles)
{
   ImageView myImageView = new ImageView(context);
   myImageView.setImageDrawable(Drawable.createFromPath(singleFile.getAbsolutePath());
   myImageView.setId(picIndex);
   picIndex++;
   drawablesId.add(myImageView.getId());
   mySDCardImages.add(myImageView);
}
mThumbIds = (Integer[])drawablesId.toArray(new Integer[0]);

次に、ImageAdapter メソッドで、変更します

imageView.setImageResource(mThumbIds[position]);

imageView.setImageDrawable(mySDCardImages.get(position).getDrawable());

mThumbIds の初期化を ImageAdapter から削除します。(mySDCardImages の定義に対応している必要があります。両方のクラス メソッドにアクセスできます。)

(簡単で汚いバージョン)必ずパスなどをテストし、例外をキャッチしてください。

于 2011-07-22T21:35:06.793 に答える
3

あなたの場合、BitmaFactoryは良い方法かもしれません。例:

File dir = new File( "/sdcard/pictures" );    
String[] fileNames = dir.list(new FilenameFilter() { 
  boolean accept (File dir, String name) {
      if (new File(dir,name).isDirectory())
         return false;
      return name.toLowerCase().endsWith(".png");
  }
});
for(string bitmapFileName : fileNames) {
  Bitmap bmp = BitmapFactory.decodeFile(dir.getPath() + "/" + bitmapFileName);
  // do something with bitmap
}

これをテストする時間ではありませんが、動作するはずです;-)

于 2011-02-18T10:10:20.230 に答える
0

このリンクを読んでください:http
: //androidsamples.blogspot.com/2009/06/how-to-display-thumbnails-of-images.htmlメディアストアとbitmapfactoryの両方を使用する方法を示しています。

選択する方法は、正確に何が必要かによって異なります。静的な画像のセットがある場合は、それらをドローアブルに配置することをお勧めします。これにより、より高速になり、削除、破損、またはファイルの名前変更/削除が可能なSDカードに依存しないようになります。

画像が動的な場合は、メディアストアまたはビットマップファクトリを使用します。ただし、画像を配列などに配置するとメモリをかなり消費するため、メモリ不足の例外が発生する可能性があることに注意してください。

于 2011-02-18T10:10:18.623 に答える
0

カスタムギャラリーをご希望のようで、お時間がかかりますが、

作業用にカスタム カメラ ギャラリーを取得することをお勧めします。

必要に応じて、グリッド ビューで写真/ビデオを取得します。

于 2015-12-03T09:13:52.127 に答える