Url get path android

android получить реальный путь по Uri.getPath()

Я пытаюсь получить изображение из галереи.

после того, как я вернулся из этой деятельности у меня есть данные, которые содержат Uri. Это выглядит так:

как я могу преобразовать этот путь в реальный (так же, как’ /sdcard/image.png ‘)?

9 ответов:

это действительно необходимо для вас, чтобы получить физический путь?
Например, ImageView.setImageURI() и ContentResolver.openInputStream() позволит вам получить доступ к содержимому файла, не зная его реальный путь.

Примечание: managedQuery() метод устарел, поэтому я его не использую.

последнее редактирование: улучшение. Мы должны закрыть курсор!!

@Rene Juuse-выше в комментариях. Спасибо за эту ссылку !

. код для получения реального пути немного отличается от одного SDK к другому, поэтому ниже мы имеем три метода, которые имеют дело с различными SDK.

getRealPathFromURI_API19 (): возвращает реальный путь для API 19 (или выше, но не протестирован) getRealPathFromURI_API11to18 (): возвращает реальный путь для API 11 в API 18 getRealPathFromURI_below11 (): возвращает реальный путь для API ниже 11

обновление 2016 марта

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

https://github.com/nohana/Laevatein (эта библиотека, чтобы сделать снимок с камеры или выбрать из галереи , если вы выбираете из галереи у него есть ящик с альбомами и просто показать локальные файлы)

Примечание это улучшение в @user3516549 ответ и я должен проверить его на Moto G3 с Android 6.0.1
У меня есть эта проблема, поэтому я попытался ответить на @user3516549, но в некоторых случаях он не работал должным образом. Я обнаружил, что в Android 6.0(или выше) при запуске gallery image pick intent откроется экран, который показывает последние изображения, когда пользователь выбирает изображение из этого списка, мы получим uri как

в то время как если пользователь выбирает галерея из выдвижного ящика вместо недавнего, то мы получим uri как

так что я должен справиться с этим в getRealPathFromURI_API19()

EDIT: если вы пытаетесь получить путь к изображению файла во внешней sdcard в более высокой версии, то проверьте у меня вопрос

нет никакого реального пути.

A Uri с content схема является непрозрачным дескриптором для некоторого содержимого. Если что Uri представляет собой открытый контент, вы можете использовать ContentResolver и openInputStream() для получения InputStream на этот контент. Кроме того, Uri с http или https схема не представляет локальный файл, и вам нужно будет использовать API HTTP-клиента для доступа к нему.

Читайте также:  Flash player standalone android

только a Uri с file схема идентифицирует файл (за исключением случаях, когда файл был перемещен или удален после ).

что делают глупые люди, это пытаются получить путь к файловой системе, пытаясь декодировать содержимое Uri , возможно, в сочетании с заклинаниями для вызова $EVIL_DEITY . В лучшем случае, это будет ненадежно, по трем причинам:

правила декодирования Uri значения могут меняться с течением времени, например, с выпусками версий Android, как структура Uri представляет деталь реализации, а не интерфейс

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

не все Uri значения могут быть декодированы с помощью фиксированных алгоритмов, так как многие приложения имеют своих поставщиков, а те могут указать на все активы BLOB столбцы для данных, которые должны быть переданы из интернета

если у вас есть некоторые ограниченные API, что требуется файл, используйте InputStream С openInputStream() создать копию этого контента. Является ли это временной копией (например, используется для операции загрузки файла, а затем удаляется) или прочной копией (например, для функции «импорт» вашего приложения) зависит от вас.

во-первых, спасибо за ваше решение @luizfelipetx

Я немного изменил ваше решение. Это работает для меня:

Примечание: таким образом, мы получили документы и изображения, в зависимости от того, если изображение приходит из «recents», «галерея» или что-либо еще. Поэтому я сначала извлекаю идентификатор изображения, прежде чем искать его.

Hii вот мой полный код для получения изображения с камеры или galeery

/ / мое объявление переменной

это помогло мне получить uri из галереи и конвертировать в файл для многоступенчатой загрузки

Попробуй Такое

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

объяснение: — этот метод получает URI, а затем проверить уровень API вашего Android устройства после этого в соответствии с уровнем API он будет генерировать реальный путь. код для генерации реального пути отличается в зависимости от уровней API.

Источник

May 27, 2019 · 5 min read

DeepLinks are essential key elements to a company marketing strategy to engage new customers and bring them straight to your App as much as to retain those users, who are already customers, providing a better experience and combining web and native App content together under the same ecosystem.

As a result of web contents growing, URLs are expanding and becoming really complex supporting different domains/subdomains, HTTP/HTTPS, dynamic and localized paths etc…

Читайте также:  Бэттери букмекерская контора android

If you are familiar with the Android Manifest and Intent Filters you should recognize this:

this is how a d eep-link as app_scheme://app_host/path_example is defined on Android in order to be handled by the App. It might be a native deep-link, like the one in the snippet or a Web URL which might have many variations, as mentioned before, and can make it hard to manage.

What is the problem?

Let’s say we have to handle some web URLs which point to 10 different pages of your web site, which means you now have to support 10 different paths, one of each URL. You end up with an intent-filter made of 10 entries. Not bad so far… but what if for each of them you have to support both http and https then you end up with 10*2 = 20 entries…

yes, your manifest is getting bigger now! But we can make it worse… what if you have to support 2 domains www.example.com and m.example.com . Now you have 20*2 =40 entries… all of them in your AndroidManifest.xml!

It is pretty clear what I want to point out. This number can be much higher and your manifest can contain lots of lines of code only to define deep-links, which can be really difficult to maintain at some point.
Take into consideration that this is only an example of a simple use case, with simple static paths and two domains.
Paths can easily increase the number of entries depending on the structure of the path itself which can variate from case to case.

but… Android provides wildcards and regex for path/pathPattern/pathPrefix?!

Yes and no! Unfortunately Android doesn’t really support regex as anyone could expect, but a really limited and obsolete set of rules to help developers define some patterns. In some cases it might help, in other cases, it might not. It doesn’t provide the flexibility developers should benefit from, but instead, it forces developers to stick with a static set of rules to define patterns to match any possible URL variation.

You can find more details here

just to give you an example (from a real use case I had to deal with)…
let’s say we are deep linking from just 5 main hosts, supporting at least 5 different domains/subdomains, both http and https, with many dynamic path variations based on the type of the link. For example, you URL might contain a country code, language code, etc… anything! In my use case, this list eventually ended up with

Читайте также:  Контроль за телефоном жены андроид

500 entries in the Manifest.
I need to have a solution to manage this!

What is the solution?

Basically, the idea is to dynamically build the intent-filter and inject this in the AndroidManifest.xml .

I was looking for a way to generate these intent filters at build time and I ran into this https://github.com/castorflex/manifestreplace-plugin.

To inject anything in the AndroidManifest.xml we can use the manifestPlaceholder functionality provided by the Gradle android-plugin, which exactly allows us to inject anything we want into the manifest. We will modify our build.gradle file accordingly.

But first, our manifest will look like something like that:

In your build.grade file, placeholders are set up as an array of key-value pairs. For our case, we only have one pair where the key is the placeholder defined in the manifest and the value is the result of a function generateData() which builds our intent-filter .

We place it in the defaultConfig block because we want this to be applied to any build type or flavor. You can also change this behavior based on your needs.

Now we need to implement our function which will generate our injectable collection of as a string, like you would do it if it was a manifest file, but this time it is done at build time using a Gradle script.

Let’s keep it simple just for the purpose of this article. You can have something like that, which will generate both http and https providing a host and a path for each entry you want to add.

It would be much better to extract this to a separate Gradle file to keep everything well organized.

We have not finished yet…. when will this bit be generated and injected in the manifest? Good question!

We need to add one more step to the processManifest gradle task to do the job for us. Let’s have a look.

Источник

lopspower / README.md

All Android Directory Path

1) System directories

⚠️ We can’t write to these folers

Method Result
Environment.getDataDirectory() /data
Environment.getDownloadCacheDirectory() /cache
Environment.getRootDirectory() /system

2) External storage directories

⚠️ Need WRITE_EXTERNAL_STORAGE Permission

Method Result
Environment.getExternalStorageDirectory() /storage/sdcard0
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS) /storage/sdcard0/Alarms
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) /storage/sdcard0/DCIM
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) /storage/sdcard0/Download
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) /storage/sdcard0/Movies
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) /storage/sdcard0/Music
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS) /storage/sdcard0/Notifications
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) /storage/sdcard0/Pictures
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PODCASTS) /storage/sdcard0/Podcasts
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES) /storage/sdcard0/Ringtones

3) Application directories

Method Result
getCacheDir() /data/data/package/cache
getFilesDir() /data/data/package/files
getFilesDir().getParent() /data/data/package

4) Application External storage directories

Источник

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