Намерение Android: возможно ли надлежащим образом получить ссылку на фактический файл в хранилище на телефоне? - PullRequest
0 голосов
/ 08 января 2019

Я работаю над простым приложением, которое воспроизводит аудиофайлы, и я хотел бы иметь возможность открыть приложение из аудиофайла, например, в файловом браузере. Фильтр намерений и все, что установлено, но я борюсь с тем, как использовать то, что я получаю.

содержимое: // uri, который я получаю, похоже, не предназначено для использования в реальном файле - я посмотрел ответы на вопрос здесь: Android: получение URI файла из URI контента? , но подход, описанный там, чтобы получить файл, а не просто использовать inputStream (что, в сущности, мне и нужно), кажется неправильным, судя по обескураживающим комментариям, а также этому сайту: Как использовать контент с Uri . Или я ошибаюсь?

Прямо сейчас я вызываю этот метод в своей функции MainActivity для обработки моего намерения, которое в основном просто создает временную копию файла и передает ее туда, где он используется:

 private fun handleIntent() {

    val uri = intent.data
    val inputStream = contentResolver.openInputStream(uri)
    val outputFile = File(this.cacheDir, "output.wav")
    val outputStream = FileOutputStream(outputFile)
    inputStream.use { input ->
        outputStream.use { output ->
            input.copyTo(output)
        }
    }
    DataRepository.handleFileFromIntent(outputFile)
    showPlayerFragmentWithFreshSelection()
}

Это почти работает (как я получаю то, что передается приложению в виде файла), но неправильно. Так как я хочу добавить файл к выбору аудиофайлов, которые может пройти мой проигрыватель, и хотел бы иметь возможность сохранить этот выбор, сохранение временного файла или даже копии вообще, это неправильный подход (я просто назвал файл "output.wav" здесь, потому что я знал, что для своего теста я буду использовать файл .wav)

Существует ли какой-либо правильный и безопасный способ получить фактический путь к файлу из моего содержимого URI или это просто что-то, что нельзя (или не следует) делать вообще?

Я пишу это на Kotlin, но ответы с использованием Java также очень полезны!

1 Ответ

0 голосов
/ 08 января 2019

Мы используем то же самое в приложении уровня производства, и оно работает нормально.

        filePath = FileUtils.getPathFromURI(mUri);

 public static String getPathFromURI(Uri contentUri) {

        Cursor cursor = null;
        try {
            final String[] proj = {MediaStore.Images.Media.DATA};
            cursor = getAppContext().getContentResolver().query(contentUri, proj, null, null, null);
            if (cursor == null || cursor.getCount() == 0)
                return "";
            final int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } catch (IllegalArgumentException|SecurityException e) {
                return "";
        } finally {
            if (cursor != null && !cursor.isClosed()) cursor.close();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...