基本的に私が達成しようとしているのは、AndroidでGallery
を開き、ユーザーにmultiple images
を選択させることです。今、この質問は尋ねられました頻繁にしかし、私は答えに満足していません。主に、IDEのドキュメントで面白いものを見つけたため(後でまた説明します)、カスタムアダプタではなく、バニラアダプタを使用したいのです。
1つの画像を選択するためのコードは次のとおりです。
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), 1);
SOおよび他のWebサイトの人々は、2つのオプションがあると言います。
1)ACTION_GET_CONTENT
を使用せず、代わりにACTION_SEND_MULTIPLE
を使用します。
これは機能しません。これは、sending
ファイルではなく、retrieving
ファイルのドキュメントによるものであり、まさにそのとおりです。 ACTION_SEND_MULTIPLEを使用しているとき、データを送信するアプリケーションを選択する必要があるデバイスでウィンドウが開かれました。それは私が望んでいるものではないので、このソリューションでどのように人々がこれを達成したのだろうか..私は何かを見逃していますか?
2)custom Gallery
を実装します。今、これは私が検討する最後のオプションです。私はそれを自分でスタイル設定する必要があるため、私が探しているものではないので、なぜバニラギャラリーで複数の画像を選択できないのですか?
これにはオプションが必要です。今、私が見つけた興味深いことはこれです:
これは、ACTION_GET_CONTENT
。のドキュメントの説明で見つけました
呼び出し元が返された複数のアイテム(複数選択を実行しているユーザー)を処理できる場合、EXTRA_ALLOW_MULTIPLEを指定してこれを示すことができます。
これはかなり興味深いです。ここでは、ユーザーが複数のアイテムを選択できるユースケースを参照していますか?
後で彼らはドキュメントで言う:
EXTRA_ALLOW_MULTIPLEを使用して、ユーザーが複数のアイテムを選択できるようにすることができます。
だから、これはかなり明白ですよね?これは私が必要なものです。しかし、私の次の質問は、このEXTRA_ALLOW_MULTIPLE
をどこに置けばいいですか?悲しいことは、developers.Androidガイドのどこにもこれが見つからないことです。また、これは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以降でのみ使用できます。
クラスでこれらの変数を定義します。
int PICK_IMAGE_MULTIPLE = 1;
String imageEncoded;
List<String> imagesEncodedList;
ボタンをクリックしてギャラリーを開いて画像を選択する必要があると仮定しましょう
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"), PICK_IMAGE_MULTIPLE);
次に、onActivityResultメソッドをオーバーライドする必要があります
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
// When an Image is picked
if (requestCode == PICK_IMAGE_MULTIPLE && resultCode == RESULT_OK
&& null != data) {
// Get the Image from data
String[] filePathColumn = { MediaStore.Images.Media.DATA };
imagesEncodedList = new ArrayList<String>();
if(data.getData()!=null){
Uri mImageUri=data.getData();
// Get the cursor
Cursor cursor = getContentResolver().query(mImageUri,
filePathColumn, null, null, null);
// Move to first row
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imageEncoded = cursor.getString(columnIndex);
cursor.close();
} else {
if (data.getClipData() != null) {
ClipData mClipData = data.getClipData();
ArrayList<Uri> mArrayUri = new ArrayList<Uri>();
for (int i = 0; i < mClipData.getItemCount(); i++) {
ClipData.Item item = mClipData.getItemAt(i);
Uri uri = item.getUri();
mArrayUri.add(uri);
// Get the cursor
Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);
// Move to first row
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imageEncoded = cursor.getString(columnIndex);
imagesEncodedList.add(imageEncoded);
cursor.close();
}
Log.v("LOG_TAG", "Selected Images" + mArrayUri.size());
}
}
} else {
Toast.makeText(this, "You haven't picked Image",
Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG)
.show();
}
super.onActivityResult(requestCode, resultCode, data);
}
注:ギャラリーでは、マルチ画像を選択する機能が提供されていないため、ここからマルチ画像を選択できるすべての画像スタジオを開きます。マニフェストにアクセス許可を追加することを忘れないでください
非常に重要: getData();単一の画像を取得し、ユーザーが複数の画像を選択した場合、それらをimageEncoded文字列に保存しました。それらはリストに保存する必要があります
したがって、他の
素敵な試みと他の人にお願いします
これらの回答の多くには類似点がありますが、onActivityResult
にある最も重要な部分がすべて欠落しています。data.getClipData
がnullかどうかを確認してくださいbeforeチェックdata.getData
ファイル選択を呼び出すコード:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*"); //allows any image file type. Change * to specific extension to limit it
//**These following line is the important one!
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURES); //SELECT_PICTURES is simply a global int used to check the calling intent in onActivityResult
選択した画像のallを取得するコード:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == SELECT_PICTURES) {
if(resultCode == Activity.RESULT_OK) {
if(data.getClipData() != null) {
int count = data.getClipData().getItemCount(); //evaluate the count before the for loop --- otherwise, the count is evaluated every loop.
for(int i = 0; i < count; i++)
Uri imageUri = data.getClipData().getItemAt(i).getUri();
//do something with the image (save it to some directory or whatever you need to do with it here)
}
} else if(data.getData() != null) {
String imagePath = data.getData().getPath();
//do something with the image (save it to some directory or whatever you need to do with it here)
}
}
}
}
Androidのセレクターでは、一部のデバイスで写真とギャラリーを使用できることに注意してください。写真では、複数の画像を選択できます。ギャラリーでは、一度に1つだけ許可されます。
インスタンスの初期化:
private String imagePath;
private List<String> imagePathList;
onActivityResultでは、If-else 2ブロックを記述する必要があります。 1つは単一の画像用で、もう1つは複数の画像用です。
if (requestCode == GALLERY_CODE && resultCode == RESULT_OK && data != null){
imagePathList = new ArrayList<>();
if(data.getClipData() != null){
int count = data.getClipData().getItemCount();
for (int i=0; i<count; i++){
Uri imageUri = data.getClipData().getItemAt(i).getUri();
getImageFilePath(imageUri);
}
}
else if(data.getData() != null){
Uri imgUri = data.getData();
getImageFilePath(imgUri);
}
}
最も重要な部分、riから画像パスを取得:
public void getImageFilePath(Uri uri) {
File file = new File(uri.getPath());
String[] filePath = file.getPath().split(":");
String image_id = filePath[filePath.length - 1];
Cursor cursor = getContentResolver().query(Android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Images.Media._ID + " = ? ", new String[]{image_id}, null);
if (cursor!=null) {
cursor.moveToFirst();
imagePath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
imagePathList.add(imagePath);
cursor.close();
}
}
これがあなたのお役に立てば幸いです。
私も同じ問題を抱えていました。また、ユーザーがギャラリーから写真を選択しながら簡単に写真を撮れるようにしたかったのです。これを行うネイティブな方法が見つからなかったため、オープンソースプロジェクトを作成することにしました。 MultipleImagePickによく似ていますが、実装のより良い方法です。
https://github.com/giljulio/Android-multiple-image-picker
private static final RESULT_CODE_PICKER_IMAGES = 9000;
Intent intent = new Intent(this, SmartImagePicker.class);
startActivityForResult(intent, RESULT_CODE_PICKER_IMAGES);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case RESULT_CODE_PICKER_IMAGES:
if(resultCode == Activity.RESULT_OK){
Parcelable[] parcelableUris = data.getParcelableArrayExtra(ImagePickerActivity.TAG_IMAGE_URI);
//Java doesn't allow array casting, this is a little hack
Uri[] uris = new Uri[parcelableUris.length];
System.arraycopy(parcelableUris, 0, uris, 0, parcelableUris.length);
//Do something with the uris array
}
break;
default:
super.onActivityResult(requestCode, resultCode, data);
break;
}
}
Cursor
からnullを取得しました。次に、Uri
をBitmap
に変換して、完全に機能するソリューションを見つけました。
ここに私のために働く解決策があります:
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
{
if (resultCode == Activity.RESULT_OK) {
if (requestCode == YOUR_REQUEST_CODE) {
if (data != null) {
if (data.getData() != null) {
Uri contentURI = data.getData();
ex_one.setImageURI(contentURI);
Log.d(TAG, "onActivityResult: " + contentURI.toString());
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), contentURI);
} catch (IOException e) {
e.printStackTrace();
}
} else {
if (data.getClipData() != null) {
ClipData mClipData = data.getClipData();
ArrayList<Uri> mArrayUri = new ArrayList<Uri>();
for (int i = 0; i < mClipData.getItemCount(); i++) {
ClipData.Item item = mClipData.getItemAt(i);
Uri uri = item.getUri();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
}
}
こんにちは、コードは正常に動作しています。
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
これを試してみてください IntentChooser 。数行のコードを追加するだけで、あとはあなたのためにやりました。
private void startImageChooserActivity() {
Intent intent = ImageChooserMaker.newChooser(MainActivity.this)
.add(new ImageChooser(true))
.create("Select Image");
startActivityForResult(intent, REQUEST_IMAGE_CHOOSER);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_IMAGE_CHOOSER && resultCode == RESULT_OK) {
List<Uri> imageUris = ImageChooserMaker.getPickMultipleImageResultUris(this, data);
}
}
PS:上記の回答で述べたように、EXTRA_ALLOW_MULTIPLEはAPI> = 18でのみ利用可能です。また、一部のギャラリーアプリではこの機能を利用できません(Googleフォトとドキュメント(com.Android.documentsui
)が機能します。