【问题标题】:Pick multiple images from gallery从图库中选择多张图片
【发布时间】:2014-12-09 05:32:48
【问题描述】:

当我从图库中选择多个图像时,如何读取/检索路径或Uri[]

我想这样称呼:

Uri[] originalUri = data.getData();

但实际上我只得到这个,只获取一个Uri

 Uri originalUri = data.getData();

【问题讨论】:

  • 先将uri保存在ArrayList中怎么样?然后做一个 for-each 循环?
  • @JLONG 我的问题是我无法获取该数组。请仔细阅读我的问题。尽管我选择了多张图片,但它只剩下一个 Uri
  • 对不起,你看过这个链接吗? javacodegeeks.com/2012/10/…
  • 我已经完成了,但我不想在我的应用中获取所有图库。
  • @RIT 对于多重图像选择,您已经创建了自己的活动来加载所有图像并在其中实现多重选择。

标签: android uri gallery image-gallery


【解决方案1】:

@RIT 正如你所说,你想在 andorid kitkat 中获取多个图像。

我尝试了以下适用于 Xperia M2 4.4.4 的代码

用于开始图像选择活动

private void startImageSelection(){

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

但是用户需要长按选择图片

现在读取选定的图像 Uri 使用下面的 onActivityResult 代码

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub

        if(requestCode==PICK_IMAGES){

            if(resultCode==RESULT_OK){
                //data.getParcelableArrayExtra(name);
                //If Single image selected then it will fetch from Gallery
                if(data.getData()!=null){

                    Uri mImageUri=data.getData();

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

                        }
                        Log.v("LOG_TAG", "Selected Images"+ mArrayUri.size());
                    }

                }

            }

        }

        super.onActivityResult(requestCode, resultCode, data);
    }

【讨论】:

  • 让我试一试,会尽快回复您。感谢您的努力
  • 终于找到了可行的方法(通过选择器从 g+ 照片应用中进行选择)
  • @VVB:这个关于你老问题的答案可以被接受吗?看起来您打算再次回复 Herry,但没有。这个问题被放弃了吗?
  • 我没有时间动手。
  • clipdata 返回数据的顺序是否与被选中的顺序相同?
【解决方案2】:

要从图库中选择多张图片,您可以使用以下代码

String[] projection = {
        MediaStore.Images.Thumbnails._ID,
        MediaStore.Images.Thumbnails.IMAGE_ID
};

mCursor = getContentResolver().query(
        MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
        projection,
        null,
        null,
        MediaStore.Images.Thumbnails.IMAGE_ID + " DESC"
);

columnIndex = mCursor.getColumnIndexOrThrow(projection[0]);

【讨论】:

  • 我想你还没有理解我的问题。无论如何感谢您的回复
【解决方案3】:
Cursor cursor = this.getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null,
                null, null);

        cursor.moveToFirst();

        for (int i = 0; i < cursor.getCount(); i++) {
            cursor.moveToPosition(i);
            int cols = cursor.getColumnCount();
            String columns = null;
            for (int j = 0; j < cols; j++) {
                columns += cursor.getColumnName(j) + " | ";
            }

            imagePathUriList.add(cursor.getString(1));


        }

【讨论】:

  • 我想你还没有理解我的问题。无论如何感谢您的回复
  • ok 表示用户将手动从图库中选择图像对吗?
  • 没错,详情请看cmets
  • 谢谢。但是我已经通过这些也检查了我上面的 cmets。
【解决方案4】:

这是我对 Kotlin 的看法。这个调用来自一个片段,应该在一个几乎不需要调整的活动中工作。

//const lives in companion or above class definition
private const val PHOTO_PICKER_REQUEST_CODE = 36

private fun launchPhotoPicker() {
    Intent(Intent.ACTION_PICK).apply {
        putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
        type = "image/*"
    }.let {
        startActivityForResult(it, PHOTO_PICKER_REQUEST_CODE)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (requestCode == PHOTO_PICKER_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {

            val selectedPhotoUris = mutableListOf<Uri>()

            data?.data?.let {
                selectedPhotoUris.add(it)
            }

            data?.clipData?.let { clipData ->
                for (i in 0 until clipData.itemCount) {
                    clipData.getItemAt(i).uri.let { uri ->
                        selectedPhotoUris.add(uri)
                    }
                }
            }

            //data.data is usually the first item in clipdata
            //I prefer to not make assumptions and just squash dupes
            //I don't trust like that
            val uris = selectedPhotoUris.distinctBy { it.toString() }

            handlePhotoUris(uris)
        }
    }

    super.onActivityResult(requestCode, resultCode, data)
}

private fun handlePhotoUris(uris: List<Uri>) {
    Log.d("photoPicking", "handle uris size: ${it.size}")
    //do stuff here
}

【讨论】:

    猜你喜欢
    • 2013-11-04
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2016-07-13
    相关资源
    最近更新 更多