В моем приложении пользователь должен выбрать аудиофайл, который затем обрабатывает приложение. Проблема в том, что для того, чтобы приложение могло делать то, что я хочу, с аудиофайлами, мне нужно, чтобы URI был в формате файла. Когда я использую собственный музыкальный проигрыватель Android для поиска аудиофайла в приложении, URI представляет собой URI контента, который выглядит следующим образом:
content://media/external/audio/media/710
Однако, используя популярный файловый менеджер Astro, я получаю следующее:
file:///sdcard/media/audio/ringtones/GetupGetOut.mp3
Последнее гораздо более доступно для меня, но, конечно, я хочу, чтобы приложение имело функциональность с аудиофайлом, который выбирает пользователь, независимо от того, какую программу он использует для просмотра своей коллекции. Итак, мой вопрос: есть ли способ преобразовать content://
URI стиля в file://
URI? Иначе что бы вы мне посоветовали для решения этой проблемы? Вот код, который вызывает средство выбора для справки:
Intent ringIntent = new Intent();
ringIntent.setType("audio/mp3");
ringIntent.setAction(Intent.ACTION_GET_CONTENT);
ringIntent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(Intent.createChooser(ringIntent, "Select Ringtone"), SELECT_RINGTONE);
Я делаю следующее с URI контента:
m_ringerPath = m_ringtoneUri.getPath();
File file = new File(m_ringerPath);
Затем сделайте что-нибудь с FileInputStream с указанным файлом.
Ответы:
Просто используйте,
getContentResolver().openInputStream(uri)
чтобы получитьInputStream
от URI.http://developer.android.com/reference/android/content/ContentResolver.html#openInputStream(android.net.Uri)
источник
Это старый ответ с устаревшим и хакерским способом преодоления некоторых конкретных болевых точек преобразователя контента. Возьмите это с некоторой долей скепсиса и используйте правильный API openInputStream, если это вообще возможно.
Вы можете использовать Content Resolver, чтобы получить
file://
путь изcontent://
URI:источник
android.provider.MediaStore.Images.ImageColumns.DATA
) гарантированно существует, если есть схемаcontent://
?File
при попытке обойти ContentResolver. Используйте методы ContentResolver для работы сcontent://
uris, это официальный подход, рекомендованный инженерами Google.Если у вас есть Uri содержимого,
content://com.externalstorage...
вы можете использовать этот метод, чтобы получить абсолютный путь к папке или файлу на Android 19 или выше .Вы можете проверить каждую часть Uri с помощью println. Возвращаемые значения для моей SD-карты и основной памяти устройства перечислены ниже. Вы можете получить доступ и удалить, если файл находится в памяти, но мне не удалось удалить файл с SD-карты с помощью этого метода, только чтение или открытие изображения с использованием этого абсолютного пути. Если вы нашли решение удалить с помощью этого метода, поделитесь. SD CARD
ОСНОВНАЯ ПАМЯТЬ
Если вы хотите получить Uri
file:///
после получения пути, используйтеисточник
Попытка обработать URI с помощью схемы content: // путем вызова
ContentResolver.query()
- не лучшее решение. В HTC Desire под управлением 4.2.2 в результате запроса может быть получено NULL.Почему бы вместо этого не использовать ContentResolver? https://stackoverflow.com/a/29141800/3205334
источник
content://
uri, соответствующий файлу в его частном внутреннем каталоге, вы не сможете использовать этот uri сFile
API в новых версиях Android. ContentResolver предназначен для преодоления такого рода ограничений безопасности. Если у вас есть uri от ContentResolver, вы можете ожидать, что он просто работает.Вдохновленные ответы - Джейсон ЛаБрун и Дарт Рэйвен . Попытка уже ответивших подходов привела меня к приведенному ниже решению, которое в основном может охватывать нулевые случаи курсора и преобразование из content: // в file: //
Чтобы преобразовать файл, прочтите и запишите файл из полученного uri
Чтобы использовать имя файла, он будет охватывать нулевой регистр курсора
Есть хороший вариант преобразования из типа MIME в расширение файла
Курсор для получения имени файла
источник
Я немного опоздал с ответом, но мой код проверен
проверить схему из uri:
В приведенном выше ответе я преобразовал URI видео в массив байтов, но это не связано с вопросом, я просто скопировал свой полный код, чтобы показать использование,
FileInputStream
иInputStream
поскольку оба работают одинаково в моем коде.Я использовал переменный контекст, который является getActivity () в моем фрагменте, а в Activity это просто ActivityName. Это
context=getActivity();
// во фрагментеcontext=ActivityName.this;
// в действииисточник
byte[] videoBytes;
? Большинство ответов показывают только, как использоватьInputStream
с изображением.