Tenho um onActivityResult
retorno de uma seleção de imagem do mediastore e posso obter um URI para uma imagem usando o seguinte:
Uri selectedImage = data.getData();
Converter isso em uma string fornece:
content://media/external/images/media/47
Ou para um caminho dá:
/external/images/media/47
No entanto, não consigo encontrar uma maneira de converter isso em um caminho absoluto, pois quero carregar a imagem em um bitmap sem precisar copiá-la em algum lugar. Eu sei que isso pode ser feito usando o URI e o resolvedor de conteúdo, mas isso parece interromper na reinicialização do telefone, acho MediaStore
que não mantém a numeração da mesma entre as reinicializações.
android
uri
absolute-path
mediastore
stealthcopter
fonte
fonte
Respostas:
Abaixo da API 19, use esse código para obter o caminho do arquivo do URI:
fonte
Apenas uma atualização simples na primeira resposta:
mActivity.managedQuery()
agora está obsoleta. Atualizei o código com o novo método.fonte dev android
fonte
content://...
entendendo. Eu tentei todas as sugestões aqui sem sorte. Alguma idéia do porquê?For Oreo
Para todas as versões abaixo do Oreo, criei este método que obtém o caminho real da uri
fonte
Não tente encontrar uma interface de usuário no sistema de arquivos, pois é lento para procurar coisas no banco de dados.
Você pode obter um bitmap de uma interface de usuário, fornecendo um fluxo de entrada para a fábrica como você fornece um arquivo para a fábrica:
fonte
Aqui está o meu exemplo de como obter o nome do arquivo, do URI, como file: // ... e content: // .... Funciona para mim não apenas no Android MediaStore, mas também em aplicativos de terceiros, como o EzExplorer.
fonte
Boas respostas existentes, algumas das quais eu costumava criar as minhas:
Eu tenho que pegar o caminho dos URIs e obter o URI dos caminhos, e o Google tem dificuldade em dizer a diferença para quem tem o mesmo problema (por exemplo, para obter a miniatura do
MediaStore
vídeo de um vídeo cuja localização física você já possui ) O antigo:O último (que eu faço para vídeos, mas também pode ser usado para Áudio ou Arquivos ou outros tipos de conteúdo armazenado, substituindo MediaStore.Audio (etc) por MediaStore.Video):
Basicamente, a
DATA
colunaMediaStore
(ou qualquer subseção dela que você está consultando) armazena o caminho do arquivo, para que você use o que sabe para procurar nesseDATA
campo ou use o campo para procurar o que quiser.Em seguida, uso ainda o
Scheme
item acima para descobrir o que fazer com meus dados:fonte
Nenhuma dessas respostas funcionou para mim em todos os casos. Eu tive que ir diretamente para a documentação do Google https://developer.android.com/guide/topics/providers/document-provider.html sobre este tópico e encontrei este método útil:
Você pode usar esse bitmap para exibi-lo em uma Visualização de imagem.
fonte
API 19 e superior , o caminho do arquivo de imagem da Uri funciona perfeitamente. Também verifico esta última API PIE 28 .
fonte
CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
nesta linha:path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
tente este caminho de arquivo de imagem get de Uri
fonte
Solução para quem tem problemas após mudar para o KitKat:
"Isso obterá o caminho do arquivo do MediaProvider, DownloadsProvider e ExternalStorageProvider, enquanto voltará ao método não oficial do ContentProvider" https://stackoverflow.com/a/20559175/690777
fonte
Depois de obter uma imagem da galeria, basta passar o URI no método abaixo apenas para o Android 4.4 (KitKat):
fonte
Tente isto
Ainda assim, se você está tendo o problema para seguir o caminho real, pode tentar minhas respostas. As respostas acima não me ajudaram.
Explicação : - Este método obtém o URI e, em seguida, verifique o nível da API do seu dispositivo Android. Depois, de acordo com o nível da API, ele gerará o caminho Real. O código para gerar o método do caminho real é diferente de acordo com os níveis da API.
método para obter o caminho Real do URI
Use este método como este
Resultado:-
fonte
String wholeID = DocumentsContract.getDocumentId(uri);
eu recebo:java.lang.RuntimeException: Failure delivering result
Eu fiz assim:
fonte
Como o managedQuery foi descontinuado, você pode tentar:
fonte
Aqui vou mostrar a você como criar um botão BROWSE, que quando você clicar, abrirá o cartão SD, você selecionará um arquivo e, como resultado, obterá o nome e o caminho do arquivo selecionado 1:
Um botão que você apertará
A função que obterá o nome do arquivo resultante e o caminho do arquivo
fonte
content://com.fsck.k9.attachmentprovider/34fc2cc9-aa46-45e9-9e3f-2f27f0457249/1/VIEW
. Depois de aplicar os métodos aqui, ainda recebo a mesma string, e não o caminho correto/mnt/sdcard/Android/data/com.fsck.k9/files/34fc2cc9-aa46-45e9-9e3f-2f27f0457249.db_att/1
. Alguma pista?Existe alguma maneira para o Android Q anterior , quando o MediaStore.Images.Media.DATA não estará mais disponível? Este campo está obsoleto no Android Q:
https://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#DATA
--- Editado
Tanto quanto eu sei para o Android Q passado, a única maneira é retransmitir RELATIVE_PATH
https://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#RELATIVE_PATH
fonte
Versão ligeiramente modificada do @PercyPercy - não lança e retorna nulo se algo der errado :
fonte
Aqui você obtém o nome do arquivo
fonte
Simples e fácil. Você pode fazer isso no URI, como abaixo!
fonte
Esta solução funciona para todos os casos:
Em alguns casos, é muito difícil obter o caminho a partir da URL. Então, por que você precisa do caminho? Para copiar o arquivo em outro lugar? Você não precisa do caminho.
fonte
Perfeitamente trabalhando para mim código fixo deste post :
fonte
Como complemento, se você precisar ver se existe um arquivo antes de tentar abrir um fluxo de entrada, poderá usar o DocumentsContract.
(Código Kotlin)
fonte
Como as respostas acima não funcionaram para mim, aqui está a solução que funcionou para mim:
Para os níveis> 19 e <= 19 da API.
Este método abrange todos os casos para obter o filePath a partir da uri
fonte
Para obter qualquer tipo de caminho do arquivo, use este:
fonte
Confira abaixo o método também está funcionando muito bem Oreo 8.1 ..
Caminho do URI Classe:
fonte
Eu faço isso com um forro:
val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri)
Que no onActivityResult se parece com:
fonte
As coisas estão complicadas agora, especialmente após o nível 29 da API Android Q. É assim que você deve obter o nome do arquivo do conteúdo Uri
e é assim que você obtém o caminho completo do Content Uri para todas as versões do Android
fonte
Isso funciona perfeitamente para mim se a versão do sistema estiver acima de 19, espero que isso possa ajudá-lo.
fonte
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
fonte