つまり、基本的に私が実現しようとしているのは、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つの選択肢があると言われています。
ACTION_GET_CONTENT
を使わずに ACTION_SEND_MULTIPLE
を使う。
この方法ではうまくいきません。これはドキュメントによると、ファイルを「送信」するもので、「取得」するものではありませんが、まさにその通りです。ACTION_SEND_MULTIPLEを使用すると、私のデバイスでウィンドウが開き、データを送信するアプリケーションを選択しなければなりません。これは私が望んでいることではないので、この解決策でどうやって実現したのか疑問です。私は何か見逃しているのでしょうか?
「カスタムギャラリー」を実装する。なぜなら、自分でスタイルを決めなければならないし、バニラギャラリーではなぜ複数の画像を選択できないのでしょうか?
そのためのオプションがあるはずです。さて、私が見つけた興味深いことは以下の通りです。
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以降でのみ利用可能です。
この回答が遅くならないといいのですが......。ギャラリーウィジェットは、デフォルトでは複数選択をサポートしていませんが、マルチセレクトの意図を受け入れるグリッドビューをカスタマイズすることができます。もう一つの方法は、ギャラリービューを拡張して、複数選択を可能にする独自のコードを追加することです。 以下は、それを可能にするシンプルなライブラリです。https://github.com/luminousman/MultipleImagePick
更新:
@ilsy'さんのコメントによると、このライブラリのCustomGalleryActivityでは、manageQuery
を使用していますが、これはdeprecatedなので、この回答のように、getContentResolver().query()
とcursor.close()
に変更する必要があります。
以下のコードは正常に動作しています。
Cursor imagecursor1 = managedQuery(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null,
null, orderBy + " DESC");
this.imageUrls = new ArrayList<String>();
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