136

したがって、基本的に私が達成しようとしているのはGallery、Android で を開き、ユーザーに を選択させること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_CONTENTbutを使用しないでください。これは機能しません。これはファイルのドキュメントによるものであり、そうではありません。ACTION_SEND_MULTIPLE を使用すると、データを送信するアプリケーションを選択する必要があるウィンドウがデバイスで開かれました。それは私が望んでいることではないので、このソリューションでどのように人々がこれを達成したのだろうか.. 何か見逃していますか?ACTION_SEND_MULTIPLE
sendingretrieving

2) を実装しcustom Galleryます。これは私が検討する最後のオプションです。自分でスタイルを設定する必要があるため、私が探しているものではないので、バニラギャラリーで複数の画像を選択できないのはなぜですか?

これにはオプションが必要です..今、私が見つけた興味深いことはこれです:
私はこれをドキュメントの説明で見つけましたACTION_GET_CONTENT.

呼び出し元が複数の返されたアイテムを処理できる場合 (ユーザーが複数選択を実行している場合)、これを示すために EXTRA_ALLOW_MULTIPLE を指定できます。

これはかなり興味深いです。ここでは、ユーザーが複数のアイテムを選択できるユースケースについて言及していますか?

その後、彼らはドキュメントで次のように述べています。

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

これはかなり明白ですよね?これは私が必要なものです。しかし、私の次の質問は次のとおりです。これをどこに置くことができEXTRA_ALLOW_MULTIPLEますか? 残念なことに、 developers.android ガイドのどこにもこれが見つからず、INTENT クラスで定数として定義されていません。

誰でもこれで私を助けることができますEXTRA_ALLOW_MULTIPLEか?

4

15 に答える 15

81

クラスで次の変数を定義します。

int PICK_IMAGE_MULTIPLE = 1; 
String imageEncoded;    
List<String> imagesEncodedList;

ボタンをonClickするとギャラリーが開き、画像を選択できると仮定しましょう

 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(); ユーザーが複数の画像を選択した場合、それらはリストに保存する必要があります

したがって、どちらがnullであるかを確認して、もう一方を使用する必要があります

あなたと他の人に良い試みをしてほしい

于 2015-12-02T16:00:13.030 に答える
20

この答えが遅くないことを願っています。ギャラリー ウィジェットはデフォルトでは複数選択をサポートしていませんが、複数選択の意図を受け入れたグリッドビューをカスタマイズできます。もう 1 つのオプションは、ギャラリー ビューを拡張し、独自のコードを追加して複数選択できるようにすることです。
これは、それを行うことができる単純なライブラリです: https://github.com/luminousman/MultipleImagePick

更新:
@ilsy のコメントから、このライブラリのCustomGalleryActivityは非推奨の use を使用しているため、この回答のようmanageQueryに変更する必要がありgetContentResolver().query()ますcursor.close()

于 2013-12-12T03:12:46.543 に答える
0

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

 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

于 2014-05-09T04:19:55.777 に答える
0
     // for choosing multiple images declare variables
     int PICK_IMAGE_MULTIPLE = 2;
     String realImagePath;

     // After requesting FILE READ PERMISSION may be on button click
     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 Images"), PICK_IMAGE_MULTIPLE);


    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);// FOR CHOOSING MULTIPLE IMAGES
        try {
            // When an Image is picked
            if (requestCode == PICK_IMAGE_MULTIPLE && resultCode == RESULT_OK
                    && null != data) {
                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();
                        realImagePath = getPath(this, imageUri);
                        //do something with the image (save it to some directory or whatever you need to do with it here)
                        Log.e("ImagePath", "onActivityResult: " + realImagePath);
                    }
                } else if (data.getData() != null) {
                    Uri imageUri = data.getData();
                    realImagePath = getPath(this, imageUri);
                    //do something with the image (save it to some directory or whatever you need to do with it here)
                    Log.e("ImagePath", "onActivityResult: " + realImagePath);
                }
            }
        } catch (Exception e) {
            Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG)
                    .show();
        }
    }
     

    public static String getPath(final Context context, final Uri uri) {
        // DocumentProvider
        if (DocumentsContract.isDocumentUri(context, uri)) {
            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
    
                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }
    
                // TODO handle non-primary volumes
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {
    
                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.parseLong(id));
    
                return getDataColumn(context, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
    
                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }
    
                final String selection = "_id=?";
                final String[] selectionArgs = new String[]{
                        split[1]
                };
    
                return getDataColumn(context, contentUri, selection, selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {
            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }
    
        return null;
    }
    
    /**
     * Get the value of the data column for this Uri. This is useful for
     * MediaStore Uris, and other file-based ContentProviders.
     *
     * @param context       The context.
     * @param uri           The Uri to query.
     * @param selection     (Optional) Filter used in the query.
     * @param selectionArgs (Optional) Selection arguments used in the query.
     * @return The value of the _data column, which is typically a file path.
     */
    public static String getDataColumn(Context context, Uri uri, String selection,
                                       String[] selectionArgs) {
    
        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {
                column
        };
    
        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                    null);
            if (cursor != null && cursor.moveToFirst()) {
                final int column_index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(column_index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }
    
    
    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }
    
    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }
    
    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }

これは私にとって完璧に機能しました。クレジット:URIから実際のパスを取得、Android KitKatの新しいストレージアクセスフレームワーク

于 2020-11-30T16:57:28.300 に答える