Неправильный путь при выборе изображения из галереи

Когда я снимаю изображение с помощью камеры, оно работает нормально, и я получаю путь к изображению для сохранения в базе данных SQLite и могу получить путь для отображения требуемого изображения. Но когда я выбираю изображение из галереи, я не получаю правильный путь, который мне нужно сохранить в базе данных для дальнейшего извлечения. Я не получаю изображение, потому что путь неверен, когда я сохраняю путь в базе данных. Итак, мой вопрос: как я могу получить правильный абсолютный путь к изображению галереи?

  @RequiresApi(api = Build.VERSION_CODES.N)
private void onCaptureImageResult(Intent data) {

    Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bytes);

    File destination = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");

    FileOutputStream fo;
    try {
        destination.createNewFile();
        fo = new FileOutputStream(destination);
        fo.write(bytes.toByteArray());
        fo.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }


    Bitmap bm = BitmapFactory.decodeFile(destination.getAbsolutePath());
    ivImage.setImageBitmap(bm);
    showImagepathET.setText(destination.getAbsolutePath());// This path will save in database
}

@SuppressWarnings("deprecation")
private void onSelectFromGalleryResult(Intent data) {

    Bitmap bm=null;
    if (data != null) {
        try {
            bm = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    File destination = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");
    showImagepathET.setText(destination.getAbsolutePath());// This path will save in database
    ivImage.setImageBitmap(bm);
}

Здесь я получаю правильное изображение для показа в ImageView ivImage как при съемке изображения камерой, так и галереей. Но я неправильно понимаю путь, когда выбираю изображение из галереи (отлично работает, когда я беру изображение с камеры), которое я сохраняю в базе данных для дальнейшего извлечения пути.


person user3210572    schedule 18.05.2017    source источник
comment
Я знаю, что у меня есть проблема в строке File destination = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + .jpg); Но как мне получить выбранный путь изображения галереи?   -  person user3210572    schedule 19.05.2017
comment
Путь к изображению не выбран.   -  person CommonsWare    schedule 19.05.2017
comment
bm = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData()); мое изображение и отлично работает, когда я устанавливаю ivImage.setImageBitmap(bm); Теперь, как я могу получить этот выбранный путь к изображению   -  person user3210572    schedule 19.05.2017
comment
Нет точного файла, который вы написали в выборе из галереи.   -  person Emre Aktürk    schedule 19.05.2017
comment
Я сказал, что получил изображение правильно, что означает, что у меня есть другие методы для получения изображения. Я спросил, как я могу установить или получить этот путь к изображению. в @EmreAktürk   -  person user3210572    schedule 19.05.2017


Ответы (2)


как я могу получить этот выбранный путь к изображению

Кажется, в 3735-й раз нет «выбранного пути к изображению». Вы получаете возврат Uri (data.getData()); Uri не обязательно должен указывать на файл. Например, http://stackoverflow.com/questions/44057912/not-getting-correct-path-when-select-image-from-gallery — это Uri; он не представляет файл в файловой системе.

Если вам нужен файл, используйте библиотеку выбора файлов.

person CommonsWare    schedule 18.05.2017
comment
Ой, извини, чувак, может быть, я абсолютно не смог объяснить свою проблему или ты не правильно прочитал мой пост. Но еще раз: я получаю файл правильно, без проблем, но мне нужен абсолютный путь к файлу для сохранения в базе данных... Просто путь, а не файл изображения. Это декодирует мое изображение (bm = MediaStore.Images.Media. getBitmap(getApplicationContext().getContentResolver(), data.getData());) Это показывает мое требуемое изображение (ivImage.setImageBitmap(bm);) без проблем - person user3210572; 19.05.2017
comment
@ user3210572: Мне нужен абсолютный путь к файлу — абсолютного пути к файлу нет, потому что у вас нет файла. У вас есть Uri. Он указывает на содержание. Этот контент вообще не должен существовать в виде файла, не говоря уже о месте, к которому вы можете получить доступ. Как я уже писал, если вам нужен файл, используйте библиотеку для выбора файлов. Или используйте ContentResolver и openInputStream(), чтобы получить InputStream для содержимого, а затем скопируйте байты из этого потока в какой-либо файл, которым вы управляете. - person CommonsWare; 19.05.2017
comment
: нет абсолютного пути к файлу, потому что у вас нет файла ... Если у меня нет файла, то как я могу получить свое изображение из галереи? А также, как я устанавливаю свое изображение (это изображение галереи) в ImageView ivImage? - person user3210572; 19.05.2017
comment
@ user3210572: Под прикрытием getBitmap() использует ContentResolver и openInputStream(). Никакие файлы не задействованы. - person CommonsWare; 19.05.2017
comment
Так что нет простого способа получить путь .. я предполагаю - person user3210572; 19.05.2017
comment
@ user3210572: Поскольку пути нет, вы правы. - person CommonsWare; 19.05.2017
comment
Мне очень жаль беспокоить вас, на самом деле я новичок в Android - person user3210572; 19.05.2017

Наконец, я решил проделать ту же процедуру, что и в методе "onCaptureImageResult(Intent data)". Изображение, которое я получаю из Галереи, снова сохраняется в каталоге. Я знаю, что это абсолютно нехорошая процедура, но она временно решила мою проблему, пока я не получу хороший ответ.

@SuppressWarnings("deprecation")
private void onSelectFromGalleryResult(Intent data) {

    Bitmap bm=null;
    if (data != null) {
        try {
            bm = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    bm.compress(Bitmap.CompressFormat.JPEG, 90, bytes);

    File destination = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");

    FileOutputStream fo;
    try {
        destination.createNewFile();
        fo = new FileOutputStream(destination);
        fo.write(bytes.toByteArray());
        fo.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    Bitmap bm1 = BitmapFactory.decodeFile(destination.getAbsolutePath());
    ivImage.setImageBitmap(bm1);
    String selectedImageUri = data.getData().getPath();
    showImagepathET.setText(destination.getAbsolutePath());

}
person user3210572    schedule 18.05.2017