Вопрос:

Выберите несколько изображений из галереи Android и получить его путь

java android select path gallery

1072 просмотра

1 ответ

22 Репутация автора

Я знаю, что в Интернете есть много примеров, но никто из них не делает то, что я действительно хочу. Я хочу выбрать несколько изображений с намерением и получить его "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();
        }
    }

Выполняя поиск в Интернете, я нашел этот пример от Лейт Михияр в этом посте: выберите несколько изображений из галереи Android, и я хочу сделать то же самое здесь, но путь к файлу здесь другой и не работает для того, что я пытаюсь сделать.

Код:

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

Спасибо

Автор: PaulD Источник Размещён: 22.08.2016 08:24

Ответы (1)


0 плюса

818709 Репутация автора

Там нет "путь к файлу". ACTION_GET_CONTENTне должен возвращать a file Uri, и большую часть времени на более новых устройствах он будет возвращать a content Uri.

Используйте ContentResolverи, openInputStream()чтобы получить доступ InputStreamк контенту, указанному в Uri. Используйте DocumentFileи fromSingleUri()для доступа к метаданным о контенте, указанном в Uri.

Я даже не могу загрузить его в ImageView

Picasso и другие библиотеки загрузки изображений (даже Ion) работают со content Uriзначениями без проблем.

Я пытаюсь загрузить эти файлы с помощью Ion lib, которому нужен путь

Лучшим решением было бы использовать лучшую клиентскую библиотеку HTTP, которая предлагает большую гибкость. OkHttp (с Okio) должен иметь возможность обрабатывать загрузку из Uri.

Или используйте ContentResolverи, openInputStream()чтобы получить InputStreamна содержание. Используйте FileOutputStreamдля получения потока в каком-нибудь локальном файле (например, в getCacheDir()). Используйте Java I / O, чтобы скопировать байты из InputStreamв FileOutputStream. Затем используйте локальный файл с Ion.

Автор: CommonsWare Размещён: 22.08.2016 08:52
Вопросы из категории :
32x32