Задать вопрос
@AndroidApi

Как получить реальный путь к файлу?

Подскажите как получить реальный путь файла из uri для API 16 - 26 или посоветуйте библиотеку какую нибудь.
Задача такая, выбрать изображение с помощью галереи для последующей загрузки на сервер. И вообще какой должен быть путь к файлу для того чтобы создать объект файла File. Сейчас у меня получается получить такой путь к файлу: /storage/emulated/0/DCIM/Camera/20171115_140423.jpg это верный путь или нет?

Мой код:
public void images(MenuItem item) {
        if (Build.VERSION.SDK_INT <= 19) {

            Intent i = new Intent();
            i.setType("image/*");
            i.setAction(Intent.ACTION_GET_CONTENT);
            i.addCategory(Intent.CATEGORY_OPENABLE);
            startActivityForResult(i, 10);
        } else if (Build.VERSION.SDK_INT > 19) {

            if(Build.VERSION.SDK_INT > 22) checkPermissions();
            Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(intent, 10);

        }
    }


    private void checkPermissions() {
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED||
                ContextCompat.checkSelfPermission(this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this,
                    new String[]{
                            Manifest.permission.READ_EXTERNAL_STORAGE,
                            Manifest.permission.WRITE_EXTERNAL_STORAGE
                    },
                    1052);

        }
    }

  @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            Uri selectedImageUri = data.getData();
            String selectedImagePath = getRealPathFromURI(selectedImageUri);
            //Получаю путь  = /storage/emulated/0/DCIM/Camera/20171115_140423.jpg
        }
    }


   public String getRealPathFromURI(Uri uri) {
        if (uri == null) return null;
        String[] projection = {MediaStore.Images.Media.DATA};
        Cursor cursor = ctx.getContentResolver().query(uri, projection, null, null, null);
        if (cursor != null) {
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            String result = cursor.getString(column_index);
            cursor.close();
            return result;
        }
        return uri.getPath();
    }
  • Вопрос задан
  • 5701 просмотр
Подписаться 1 Простой Комментировать
Решения вопроса 2
GavriKos
@GavriKos
/storage/emulated/0/DCIM/Camera/20171115_140423.jpg это верный путь или нет?

Вполне верный.
Ответ написан
Комментировать
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Путь-то, конечно, верный, только пермишины эти для вашей задачи не нужны. Приложение, которое возвращает результат, даёт специальный, uri permission на чтение. Советую разобраться в этом, пермишины надо запрашивать как можно реже.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы