アンドロイドのギャラリーから複数の画像を選択

つまり、基本的に私が実現しようとしているのは、Androidで「ギャラリー」を開き、ユーザーに「複数の画像」を選択させることです。この質問はよく聞かれますが、私はその答えに満足していません。主な理由は、IDEのde docsで面白いことを見つけたからです(この件については後ほど説明します)。そのため、カスタムアダプターを使わず、バニラアダプターだけを使いたいのです。

現在、画像を1枚選択するためのコードは以下の通りです。

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), 1);

さて、SOや他のウェブサイトでは、2つの選択肢があると言われています。

  1. ACTION_GET_CONTENT を使わずに ACTION_SEND_MULTIPLE を使う。 この方法ではうまくいきません。これはドキュメントによると、ファイルを「送信」するもので、「取得」するものではありませんが、まさにその通りです。ACTION_SEND_MULTIPLEを使用すると、私のデバイスでウィンドウが開き、データを送信するアプリケーションを選択しなければなりません。これは私が望んでいることではないので、この解決策でどうやって実現したのか疑問です。私は何か見逃しているのでしょうか?

  2. 「カスタムギャラリー」を実装する。なぜなら、自分でスタイルを決めなければならないし、バニラギャラリーではなぜ複数の画像を選択できないのでしょうか?

そのためのオプションがあるはずです。さて、私が見つけた興味深いことは以下の通りです。 br>*docsのACTION_GET_CONTENTの説明で見つけました。

呼び出し側が複数のアイテムを扱える場合(ユーザーが複数選択を行う場合) 呼び出し側が複数のアイテムを扱える場合(ユーザーが複数選択を行う場合)、 EXTRA_ALLOW_MULTIPLEを指定して、それを示すことができます。 示すことができます。

これはなかなか面白いですね。ここでは、ユーザーが複数のアイテムを選択できるユースケースに言及しているのですね。

その後、彼らはドキュメントでこう言っています。

ユーザーが複数の項目を選択できるようにするには、EXTRA_ALLOW_MULTIPLE を使用できます。 アイテムを選択できるようにするためにEXTRA_ALLOW_MULTIPLEを使用することができます。

これはかなり明白ですよね?これは私が必要とするものです。しかし、次の質問は、このEXTRA_ALLOW_MULTIPLEはどこに置けばいいのでしょうか?悲しいことに、これは developers.android guide のどこにも載っていませんし、INTENTクラスの定数としても定義されていません。

どなたか、このEXTRA_ALLOW_MULTIPLEについて教えてください。

ソリューション

EXTRA_ALLOW_MULTIPLEオプションは、Intent.putExtra()メソッドによってインテントに設定されます。

intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);

上記のコードは次のようになります。

Intent intent = new Intent();
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), 1);

注意:EXTRA_ALLOW_MULTIPLEオプションは、Android API 18以降でのみ利用可能です。

解説 (17)

この回答が遅くならないといいのですが......。ギャラリーウィジェットは、デフォルトでは複数選択をサポートしていませんが、マルチセレクトの意図を受け入れるグリッドビューをカスタマイズすることができます。もう一つの方法は、ギャラリービューを拡張して、複数選択を可能にする独自のコードを追加することです。 以下は、それを可能にするシンプルなライブラリです。https://github.com/luminousman/MultipleImagePick

更新:
@ilsy'さんのコメントによると、このライブラリのCustomGalleryActivityでは、manageQueryを使用していますが、これはdeprecatedなので、この回答のように、getContentResolver().query()cursor.close()に変更する必要があります。

解説 (5)

以下のコードは正常に動作しています。

 Cursor imagecursor1 = managedQuery(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null,
    null, orderBy + " DESC");

   this.imageUrls = new ArrayList();
  imageUrls.size();

   for (int i = 0; i < imagecursor1.getCount(); i++) {
   imagecursor1.moveToPosition(i);
   int dataColumnIndex = imagecursor1
     .getColumnIndex(MediaStore.Images.Media.DATA);
   imageUrls.add(imagecursor1.getString(dataColumnIndex));
  }

   options = new DisplayImageOptions.Builder()
  .showStubImage(R.drawable.stub_image)
  .showImageForEmptyUri(R.drawable.image_for_empty_url)
  .cacheInMemory().cacheOnDisc().build();

   imageAdapter = new ImageAdapter(this, imageUrls);

   gridView = (GridView) findViewById(R.id.PhoneImageGrid);
  gridView.setAdapter(imageAdapter);

もっと詳しく知りたい方は http://mylearnandroid.blogspot.in/2014/02/multiple-choose-custom-gallery.html

解説 (2)