【问题标题】:Select multiple images from android gallery and get it path从android图库中选择多个图像并获取它的路径
【发布时间】:2016-12-29 12:17:36
【问题描述】:

我知道互联网上有很多例子,但没有一个做我真正想要的。我想选择多个具有意图的图像并像这段代码一样将其获取为“url”。 (我知道这段代码不能选择多个,但我用这个作为我正在尝试做的例子)

代码:

public static final int RESULT_LOAD_IMG = 0;
public void LoadImg() {
        Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(galleryIntent, RESULT_LOAD_IMG);
    }

ArrayList<Part> files = new ArrayList<>();

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK && null != data) {
            Uri selectedImage = data.getData();
            String[] filePathColumn = {MediaStore.Images.Media.DATA};

            Cursor cursor = getContentResolver().query(selectedImage,
                    filePathColumn, null, null, null);
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            files.add(new FilePart("uploadedfile[" + String.valueOf(files.size()) + "]", new File(picturePath)));
            cursor.close();
        }
    }

在互联网上搜索我从 Laith Mihyar 的这篇文章中找到了这个例子:Select multiple images from android gallery 我想在这里做同样的事情,但是这里的文件路径不同,并且不适用于我想要做的事情。

代码:

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

谢谢

【问题讨论】:

  • 为什么不起作用?你想做什么?都很模糊。当文件路径不同时会出现什么问题?不清楚。
  • 我需要获取文件的路径,但是当我尝试使用第二个文件时,我得到了一个应用程序名称(如 com.appname.x)和一个带有 id 而不是路径的文件是我想要得到的。我尝试得到类似的东西:“/content/files/image.png”,我得到“com.company.appname/&file6647”或类似的东西
  • 为什么你需要一个文件路径?使用 uri!你可以用它做任何事情。你想做什么?
  • Uri 使用 getPath() 返回罕见的 url,我正在尝试使用需要路径的 Ion 库上传这些文件
  • 你最好找一个通过uri上传文件的小函数。 (30 行?)。或者使用管理 uris 的库。

标签: java android select path gallery


【解决方案1】:

没有“文件路径”。 ACTION_GET_CONTENT 不必返回 file Uri,而且大多数时候在较新的设备上它会返回 content Uri

使用ContentResolveropenInputStream()Uri 标识的内容上获取InputStream。使用DocumentFilefromSingleUri() 获取有关Uri 标识的内容的元数据。

我什至无法在 ImageView 中加载它

Picasso 和其他图像加载库(甚至 Ion)使用 content Uri 值没有问题。

我正在尝试使用需要路径的 Ion 库上传这些文件

最好的解决方案是使用更好的 HTTP 客户端库,它可以提供更大的灵活性。 OkHttp(使用 Okio)应该能够处理来自 Uri 的上传。

或者,使用ContentResolveropenInputStream() 在内容上获得InputStream。使用FileOutputStream 获取某个本地文件的流(例如,在getCacheDir() 中)。使用 Java I/O 将字节从 InputStream 复制到 FileOutputStream。然后,将本地文件与 Ion 一起使用。

【讨论】:

  • 你能帮我举个例子来用 Ion pls 加载文件吗?我对此不是很熟悉,我真的需要使用 Ion。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多