Com android externalstorage documents document primary 3a betadatastorage 2fbetacontextdata xml

Uri с com.android.externalstorage.documents, расположенными на не первичной томе

У меня проблема. У меня есть Uri который читает что-то вроде:

Я могу найти StorageVolume через StorageManager.getStorageVolumes()

Если объем является основным: StorageVolume.isPrimary() — я понимаю, что могу разобрать путь как:

Но как найти путь, если объем не является основным? В конце концов, мне нужно иметь простой объект File ссылается его абсолютный путь.

PS Конечно, у меня есть все необходимое разрешение: либо статические объявлены через манифест или во время выполнения обоих.

Я понимаю, что могу разобрать путь как

Не надежно. Вы принимаете определенную внутреннюю реализацию кода, который может отличаться от производителя устройства и версии ОС.

В конце концов, мне нужно иметь простой объект File, на который ссылается его абсолютный путь.

Шаг # 1: используйте ContentResolver и openInputStream() чтобы получить InputStream на содержимое, идентифицированное Uri

Шаг № 2: Откройте FileOutputStream на некоторый файл, который вы контролируете (например, в getCacheDir() )

Шаг 3: Скопируйте содержимое из InputStream в FileOutputStream

Шаг 4: используйте полученный файл, удалив его, когда он больше не нужен

Конечно, у меня есть все необходимое разрешение

Конечно, нет, поскольку у вас нет разрешений на доступ к файлам на съемном носителе, вне очень специфических мест (например, второй и последующие пути, возвращаемые getExternalFilesDirs() ).

Источник

Русские Блоги

Android открывает селектор файлов и вернуть реальный путь к файлу — ветер дождь, опираясь на классе

В последнее время, босс кричит, чтобы сделать проект с участием файла, файл будет загружен, и это, безусловно, нужно выбрать файл. Выбор файла должен быть не знакомы, мобильный телефон, часто используется компьютер — нажмите на маленькую иконку, которая открывает диалог выбора файла, введите выбора файла, после выбора файла ,, вернуть реальный путь, по которому возвращается файл. Отказ Отказ В то время я думал, что я думал, что это было очень просто. Я проверил информацию в интернете и начал свой код код. После того, как код был завершен (в основном различные права доступа, так что я помню, чтобы добавить), а затем с удовольствием начать тест реальной машины, Yo! Успешный! Полные радости, приходят туда и обратно, чтобы сделать несколько раз, хорошо. Отказ Отказ Пусть вам волна, выходи, . =. = .

После того, как я вернулся и вперед после испытания, я обнаружил, что метод онлайн, типа «файл» непосредственно вызывается в функции обратного вызова.

Возвращает реальный путь к файлу, то один тип «содержание», обратитесь к некоторым интернет-методов:

Тогда я нашел некоторый реальный путь к файлу нормально, некоторые из них не могут, на самом деле, позвольте мне нажать на долгое время . Подавленный, есть проблема, я должен решить, не помогаю, я не . есть какие — либо проблемы , я решил напечатать каждый тест URI , чтобы увидеть , что происходит, следующий интерфейс моей реальной машины Honor7 Откройте выбор файлов:

Я тестировал фотографии, видео, аудио, внутреннее пространство для хранения, браузер — управление файлами, а URI, возвращаемый файл выбора для управления файлами, результаты тестирования являются следующим:

Потом я узнал, что для «Content» типа, метод , который может быть успешно преобразован с указанным выше способом, только URI , возвращаемых 6 точкой, то URI возвращает правильный файл, и для 1, 2, 3, Когда 4-точка URI преобразуется, есть проблема. Почему это? После тщательного сравнения, URI , соответствующий 1, 2, 3 и 4 также тип «содержание», но по сравнению с URI , соответствующий 6 — й точке, то очевидно , что формат бывший отличается. Я я смущен, я получил свою мать (думать о тебе ..), я , наконец , нашел Android начал DocumentsProvider от версии 4.4 (API_19) (видящий осторожны , вы должны также открыть 1, 2, 3, 4 балла) URI , содержит «Документы «слова пара), поэтому описанный выше способ подходит только для использования в 4.4 (не входит в комплект), если 4,4 и выше, это не так просто, так что я должен делать? Ответ, конечно, — поставить код! Дорогой, ты говоришь правильно?

Читайте также:  Не могу сделать скриншот android

Во-первых, это код, чтобы открыть диалог выбора файла:

Во-вторых, это код обратного вызова:

Многие люди спрашивали, GetPath (это, URI) метод. Отказ Отказ Не волнуйтесь, это здесь?

Может быть, многие люди будут спрашивать, почему вы не писать демо? На самом деле, потому что я верю! И основной код отдать его в файл макета в районе? Это невозможно, это невозможно для этой жизни. Отказ

В последнее время, я посылаю Android сторону для отправки файлов, а также на стороне ПК получает эти вещи (насколько велико для использования, я не знаю, если я чувствую себя очень весело). Если у вас есть большой спрос, вы будете писать в следующий блог, это объяснить. Там будет соответствующим DEMO в то время.

Последняя поверхность размещена на ранее приобретенную URI для преобразования файлов, которые преобразуются в код для каждого партнера для справки:

Источник

Русские Блоги

Android открывает селектор файлов и вернуть реальный путь к файлу — ветер дождь, опираясь на классе

В последнее время, босс кричит, чтобы сделать проект с участием файла, файл будет загружен, и это, безусловно, нужно выбрать файл. Выбор файла должен быть не знакомы, мобильный телефон, часто используется компьютер — нажмите на маленькую иконку, которая открывает диалог выбора файла, введите выбора файла, после выбора файла ,, вернуть реальный путь, по которому возвращается файл. Отказ Отказ В то время я думал, что я думал, что это было очень просто. Я проверил информацию в интернете и начал свой код код. После того, как код был завершен (в основном различные права доступа, так что я помню, чтобы добавить), а затем с удовольствием начать тест реальной машины, Yo! Успешный! Полные радости, приходят туда и обратно, чтобы сделать несколько раз, хорошо. Отказ Отказ Пусть вам волна, выходи, . =. = .

После того, как я вернулся и вперед после испытания, я обнаружил, что метод онлайн, типа «файл» непосредственно вызывается в функции обратного вызова.

Возвращает реальный путь к файлу, то один тип «содержание», обратитесь к некоторым интернет-методов:

Тогда я нашел некоторый реальный путь к файлу нормально, некоторые из них не могут, на самом деле, позвольте мне нажать на долгое время . Подавленный, есть проблема, я должен решить, не помогаю, я не . есть какие — либо проблемы , я решил напечатать каждый тест URI , чтобы увидеть , что происходит, следующий интерфейс моей реальной машины Honor7 Откройте выбор файлов:

Я тестировал фотографии, видео, аудио, внутреннее пространство для хранения, браузер — управление файлами, а URI, возвращаемый файл выбора для управления файлами, результаты тестирования являются следующим:

Потом я узнал, что для «Content» типа, метод , который может быть успешно преобразован с указанным выше способом, только URI , возвращаемых 6 точкой, то URI возвращает правильный файл, и для 1, 2, 3, Когда 4-точка URI преобразуется, есть проблема. Почему это? После тщательного сравнения, URI , соответствующий 1, 2, 3 и 4 также тип «содержание», но по сравнению с URI , соответствующий 6 — й точке, то очевидно , что формат бывший отличается. Я я смущен, я получил свою мать (думать о тебе ..), я , наконец , нашел Android начал DocumentsProvider от версии 4.4 (API_19) (видящий осторожны , вы должны также открыть 1, 2, 3, 4 балла) URI , содержит «Документы «слова пара), поэтому описанный выше способ подходит только для использования в 4.4 (не входит в комплект), если 4,4 и выше, это не так просто, так что я должен делать? Ответ, конечно, — поставить код! Дорогой, ты говоришь правильно?

Читайте также:  Как снять гугл защиту с андроида

Во-первых, это код, чтобы открыть диалог выбора файла:

Во-вторых, это код обратного вызова:

Многие люди спрашивали, GetPath (это, URI) метод. Отказ Отказ Не волнуйтесь, это здесь?

Может быть, многие люди будут спрашивать, почему вы не писать демо? На самом деле, потому что я верю! И основной код отдать его в файл макета в районе? Это невозможно, это невозможно для этой жизни. Отказ

В последнее время, я посылаю Android сторону для отправки файлов, а также на стороне ПК получает эти вещи (насколько велико для использования, я не знаю, если я чувствую себя очень весело). Если у вас есть большой спрос, вы будете писать в следующий блог, это объяснить. Там будет соответствующим DEMO в то время.

Последняя поверхность размещена на ранее приобретенную URI для преобразования файлов, которые преобразуются в код для каждого партнера для справки:

Источник

URI изображения не отображает изображения в ImageView на некоторых устройствах Android

У меня есть ImageView. Когда вы щелкаете ImageView, открывается галерея, вы выбираете изображение и показываете его в ImageView. У меня есть условие, что когда я закрываю приложение, а затем открываю его, изображение сохраняется там. Поэтому для этого я сохраняю изображение Uri на sharedprefrence. И при открытии приложения я получаю тот же Uri и пытаюсь отобразить изображение в imageView.

Однако в некоторых телефонах изображение выглядит идеально, как Mi (Lollipop), Samsung (KitKat), но не отображается в телефонах, таких как Motorola (Marshmallow), One Plus One (Marshmallow). Есть идеи, почему это происходит? Вот мой код

Для получения изображения я использую

А в OnActivityResult () код

И при получении из общих предпочтений я конвертирую String в uri с помощью Uri.parse(profile_image)

Однако, если я заметил, uri возвращается для другого телефона Android следующим образом

Следовательно, когда содержимое uri -content: // media / external / images / media / является отображаемым изображением в ImageView Perfect, а в других случаях это не так.

12 ответов

Я разработал, tested и работаю над

  1. Lenovo K3 Note (Зефир)
  2. Motorola (леденец)
  3. Samsung (KitKat)

В вашем MainActivity.java добавьте

Теперь обработайте onActivityResult .

В вашем файле Manifest добавьте permission

Примечание.

Assuming вы добавили код для take permission для Marshmallow

Результат Uri

lenovo K3 Примечание: content://com.android.externalstorage.documents/document/primary%3ADCIM%2FCamera%2FIMG_20160606_212815.jpg

samsung: content://com.android.providers.media.documents/document/image%3A2086

моторола: content://com.android.providers.media.documents/document/image%3A15828

Простое исправление — просто добавить «file: //» в начало пути к файлу. Например: изменение <> на <> работает для любой платформы.

Просто не уверен на 100%, получу ли я вопрос. Если определенные изображения не могут отображаться в imageView (даже до закрытия и перезапуска приложения), проблема в том, что Picasso может обрабатывать содержимое от определенных поставщиков. Я не понимаю, что это так, но если это так, то вы можете подумать о регистрации ошибки / RFE для этой библиотеки. С другой стороны, если Пикассо правильно показывает изображение для данного Uri, но не после преобразования Uri_org -> String -> Uri_regen, это означает, что Uri_org не то же самое, что Uri_regen. Вы можете (временно) добавить пару строк в свой код, чтобы преобразовать String обратно в Uri, а сразу после этого поставить точку останова и сравнить два Uri. Это должно дать вам представление о том, как дела идут не так.

Читайте также:  Android no system space

Если вы не достигли точки останова, переместите точку останова обратно в оператор «if» и визуально проверьте два URI (которые почти наверняка будут одинаковыми, иначе вы бы достигли точки останова, но это поможет проверить отладку сам код). Если Uri одинаковы, то почему-то предпочтение String по какой-то причине не сохраняется правильно. В этом случае запишите исходный Uri и добавьте точку останова в строке, которая преобразует String обратно в Uri:

Если предыдущий эксперимент сработал, он должен снова работать здесь, если только profile_image не отличается. В любом случае вы должны указать, в чем проблема.

Я также сталкивался с чем-то подобным ранее и нашел полезный вспомогательный класс, который дает вам точное местоположение файла. Вот ссылка.

Вы можете использовать такие методы, как FileUtils.getPath (context, uri) или FileUtils.getFile (context, uri), чтобы получить файл. Тогда просто используйте это так:

Надеюсь это поможет.

Может быть проблема с версией Пикассо. Они исправили кое-что с загрузкой больших изображений в версии 2.5.0 (2.4.0 . ), Что пока недоступно в репозиториях.

Вам нужно будет вручную включить ночной снимок Пикассо, и это, скорее всего, решит вашу проблему. Это сработало для меня.

Вы можете легко преобразовать URI в Bitmap:

Затем установите Imageview: imgview.setImageBitmap (image);

Надеюсь, что это поможет вам.

Мне удавалось это делать раньше. Вместо того, чтобы хранить его в SharePreferences, я сохраняю его в Bundle, когда onSaveInstanceState (Bundle) вызывается по: bundle.putParcelable (SOME_KEY, uri). Вы можете сделать это, потому что Uri реализует Parcelable. После этого проверьте этот uri в Bundle, переданном в onCreate (). Код:

P / S: Думаю, проблема с сохранением запроса в Shared Preference заключается в кодировании / декодировании Uri.

Возможно, вы справитесь с этим, сначала преобразовав URI в реальный путь.

И ваш onActivityResult должен выглядеть так

Вам необходимо запросить разрешение на чтение внешнего хранилища пользователю во время выполнения для Android 6+.

Надеюсь это поможет.

Передайте свой URI в этом методе, он вернет String, а затем преобразует его в Bitmap.

«В предыдущих версиях Android, если вы хотите, чтобы ваше приложение получало файл определенного типа из другого приложения, оно должно вызывать намерение с действием ACTION_GET_CONTENT . Это действие по-прежнему является подходящим способом запросить файл, который вы хотите импортировать в свое приложение. Однако в Android 4.4 представлено действие ACTION_OPEN_DOCUMENT , которое позволяет пользователю выбрать файл определенного типа и предоставить вашему приложению долгосрочный доступ для чтения к этому файлу . (возможно, с доступом на запись) без импорта файла в ваше приложение »(выделено мной)

Чтобы ваше приложение могло получать ранее выбранные изображения, просто измените действие с ACTION_GET_CONTENT на ACTION_OPEN_DOCUMENT (решение подтверждено, работающее на Nexus 7 2013).

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

Используйте getPath, чтобы найти точный путь к файлу. Это самый простой способ решить проблему, как вы определили. Пожалуйста, дайте мне знать, если вам понадобится дополнительная помощь 🙂

Источник

Оцените статью