如何打开相册以选择多张图片?

6

我想要使用以下代码打开带有多图选择功能的相册。

        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);

它可以打开相册应用,但我无法选择多张图片。


1
可能是如何在Android中从图库选择多个图像?的重复问题。 - Jitesh Prajapati
“EXTRA_ALLOW_MULTIPLE”选项仅适用于Android API 18及以上版本。 - skydroid
我正在KitKat中运行以下代码。 - Prashant Sharma
可能是从Android图库中选择多个图像的重复问题。 - Mira_Cole
4个回答

5

这对我来说在api22到api29上运行正常。

Intent intent = new Intent();
                intent.setType("image/*");
                intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                intent.setAction(Intent.ACTION_GET_CONTENT);
                intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(intent, 105);

然后在活动结果的overmethod中添加以下代码。

if (resultCode == RESULT_OK && requestCode == 105) {
            ClipData clipData = data.getClipData();
            if (clipData != null) {
                for (int i = 0; i < clipData.getItemCount(); i++) {
                    Uri imageUri = clipData.getItemAt(i).getUri();
                    // your code for multiple image selection
                }
            } else {
              Uri uri = data.getData();
                // your codefor single image selection
            }

注意:当您进入画廊屏幕后,请稍微按住图像。然后在右上方点击“打开”,这将允许您选择多个图像。

1
HoiviaAppPermision 是什么? - Mohamad Mousheimish
@MohamadMousheimish,我更新了我的答案以便让你更清楚。 - Deepak Maurya

2

我使用以下方法选择多张图片:

  1. 声明一个变量

    ActivityResultLauncher activityResultLauncher;

2.在OnCreate方法中调用Register方法。

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.upload_ad_images);
    RegisterOpenImageDialog();
 }

3. 这是注册方法

private void RegisterOpenImageDialog() {
        activityResultLauncher = registerForActivityResult(new ActivityResultContracts.GetMultipleContents(), new ActivityResultCallback<List<Uri>>() {
            @Override
            public void onActivityResult(List<Uri> result) {
                if (result != null) {

                    int x = result.size();
                    
                    //Do What you Want Here ................
                    
                }
            }
        });
 }

4. 当用户点击选择图片按钮时

private void btnSelectImage() {
     activityResultLauncher.launch("image/*");
}

0

点击并按住以选择多个图像。不要只是单击图像。您也可以使用此功能接收这些图像。

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

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    try {
        // When an Image is picked
        if (requestCode == 1 && 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);
}

我正在尝试在我的三星Note 2上以同样的方式点击并长按图像,但它对我不起作用。 - Prashant Sharma
我尝试了我的Xperia z,它完美地工作着。可能是关于画廊应用程序的问题。 - Zahidul Islam

0

试试这个:

public class MainActivity extends AppCompatActivity implements    View.OnClickListener {

  private static final int SELECT_PICTURE = 100;
  private static final String TAG = "MainActivity";

  CoordinatorLayout coordinatorLayout;
  FloatingActionButton btnSelectImage;
  AppCompatImageView imgView;


  @Override
   protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

   Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
   setSupportActionBar(toolbar);

   // Find the views...
   coordinatorLayout = (CoordinatorLayout)      findViewById(R.id.coordinatorLayout);
   btnSelectImage = (FloatingActionButton)  findViewById(R.id.btnSelectImage);
   imgView = (AppCompatImageView) findViewById(R.id.imgView);

   btnSelectImage.setOnClickListener(this);

   }

   /* Choose an image from Gallery */
   void openImageChooser() {
   Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Picture"),  SELECT_PICTURE);
  }

 public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
       if (requestCode == SELECT_PICTURE) {
        // Get the url from data
        Uri selectedImageUri = data.getData();
        if (null != selectedImageUri) {
            // Get the path from the Uri
            String path = getPathFromURI(selectedImageUri);
            Log.i(TAG, "Image Path : " + path);
            // Set the image in ImageView
            imgView.setImageURI(selectedImageUri);
             }
           }
         }
       }


     public String getPathFromURI(Uri contentUri) {
     String res = null;
     String[] proj = {MediaStore.Images.Media.DATA};
     Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
     if (cursor.moveToFirst()) {
       int column_index =   cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
      res = cursor.getString(column_index);
    }
    cursor.close();
    return res;
 }

   @Override
   public void onClick(View v) {
     openImageChooser();
    }
}

在清单文件中添加权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

你可以将此链接用于另一个答案。该链接是关于从相册上传图片导致应用程序崩溃的问题。 - user6615010
你的代码只会提供单个图像数据。感谢你的关注。 - Prashant Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接