从安卓中选择多张图片,如何获取Uris?

7

描述:

http://www.rqgg.net/topic/vrvkz-select-multiple-images-from-android-gallery.html

如果调用者能够处理多个返回项(用户执行多项选择),则可以指定EXTRA_ALLOW_MULTIPLE以表示此内容。

这很有趣。他们将其引用到用户可以选择多个项目的用例中?

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    public void selectPhotos(){
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
        startActivityForResult(Intent.createChooser(intent,
                "select multiple images"), SELECT_PHOTOS_RESULT);
    }


protected void onActivityResult(int requestCode, int resultCode, Intent intent) {

        super.onActivityResult(requestCode, resultCode, intent);

        if (resultCode == RESULT_OK) {

            switch (requestCode) {
                case SELECT_PHOTOS_RESULT:
                    //how to get the Uris?
                    ...
                    break;

        }

    }

图库中的所有图片都在MediaStore中,可以从ContentProvider中获取。https://dev59.com/uHA65IYBdhLWcg3wsg2B - DeeV
谢谢,但是我想从onActivityResult()中获取用户选择的图片,而不是获取所有图片。 - qinmiao
1
哦,我明白你在做什么。这是相对较新的 EXTRA,所以我不知道答案。虽然从文档中看来,当您调用 Intent 上的 getClipData() 时,数据似乎在生成的 ClipData 中。我的猜测是您可以调用 ClipData#getItemAt(position) 来获取 ClipData.Item,然后调用 ClipData.Item#getUri() 来获取图像的 Uri。如果您已经尝试过此方法,很抱歉我没有提供更大的帮助。通常数据都在 Intent Extra Bundle 或 ClipData 中。 - DeeV
ClipData clipData = intent.getClipData();//clipData将为空 - qinmiao
顺便说一下:我使用模拟器,不支持多选和intent.getClipData()为空。太遗憾了。 - qinmiao
1个回答

21

可能我回答晚了一点,但如果有人正在寻找答案,这可能会有所帮助。

    if (intent != null) {
                ClipData clipData = intent.getClipData();
                if (clipData != null) {
                    for (int i = 0; i < clipData.getItemCount(); i++) {
                        ClipData.Item item = clipData.getItemAt(i);
                        Uri uri = item.getUri();

                        //In case you need image's absolute path
                        String path= getRealPathFromURI(getActivity(), uri)
                    }
                }
            }

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

注意:调用getClipData()需要最小API级别为16。


6
当只选择了一张图片时,getClipData() 返回 null。 - Yoann Hercouet
@YoannHercouet 你知道如何修复只选择图片时出现的 NPE 吗? - kdas
2
@kdas 我不修复它,如果getClipData为null,我只是使用getData而不是getClipData。 - Yoann Hercouet
URI没问题,但获取实际字符串路径时返回null。出了什么问题? - neobie

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