Qual é a maneira mais fácil de converter de um file:
android.net.Uri
para um File
no Android?
Tentei o seguinte, mas não funciona:
final File file = new File(Environment.getExternalStorageDirectory(), "read.me");
Uri uri = Uri.fromFile(file);
File auxFile = new File(uri.toString());
assertEquals(file.getAbsolutePath(), auxFile.getAbsolutePath());
Respostas:
O que você quer é ...
... e não...
NOTA:
uri.toString()
Retorna uma string no formato:"file:///mnt/sdcard/myPicture.jpg"
, enquanto queuri.getPath()
retorna uma string no formato:"/mnt/sdcard/myPicture.jpg"
.fonte
toString
faz?url.toString()
retorne uma String no seguinte formato: "file: ///mnt/sdcard/myPicture.jpg", enquantourl.getPath()
retorna uma String no seguinte formato: "/mnt/sdcard/myPicture.jpg", ou seja, sem o tipo de esquema fixo.open failed: ENOENT (No such file or directory)
Quando tento abrir o arquivo fornecido com isso. Além disso, se o Uri é o Uri de conteúdo de uma imagem, por exemplo, ele definitivamente não funciona.Depois de pesquisar por um longo tempo, foi isso que funcionou para mim:
fonte
managedQuery
agora está obsoleto. use emgetContentResolver().query(...)
vez disso, que funciona na API 11+. Adicionar uma condicional para dispositivos com mais de API 11.usar
diretamente e copie o arquivo. Veja também:
https://developer.android.com/guide/topics/providers/document-provider.html
fonte
EDIT: Desculpe, eu deveria ter testado melhor antes. Isso deve funcionar:
URI é java.net.URI.
fonte
androidURI
é um android.net.Uri. O java.net.URI (que existe no Android) é usado apenas como parte do processo de conversão.java.lang.IllegalArgumentException: Expected file scheme in URI: content://com.shajeel.daily_monitoring.localstorage.documents.localstorage.documents/document/%2Fstorage%2Femulated%2F0%2FBook1.xlsx
exceção depois de usar este método.Melhor solução
Crie uma classe FileUtil simples e use-a para criar, copiar e renomear o arquivo
Eu uso
uri.toString()
euri.getPath()
não trabalho para mim. Finalmente encontrei esta solução.Use a classe FileUtil no seu código
fonte
Nada disso funciona para mim. Eu achei que essa era a solução que funcionava. Mas meu caso é específico para imagens .
fonte
Android + Kotlin
Adicione dependência para extensões do Kotlin Android:
implementation 'androidx.core:core-ktx:{latestVersion}'
Obter arquivo da uri:
uri.toFile()
Android + Java
Basta ir para o topo;)
fonte
file
Com o Kotlin é ainda mais fácil:
Ou se você estiver usando extensões Kotlin para Android :
fonte
A @CommonsWare explicou todas as coisas muito bem. E nós realmente devemos usar a solução que ele propôs.
A propósito, apenas as informações nas quais poderíamos confiar durante a consulta
ContentResolver
são o nome e o tamanho de um arquivo, conforme mencionado aqui: Recuperando informações do arquivo | Desenvolvedores AndroidComo você pode ver, há uma interface
OpenableColumns
que contém apenas dois campos: DISPLAY_NAME e SIZE.No meu caso, eu precisava recuperar informações EXIF sobre uma imagem JPEG e girá-las, se necessário, antes de enviar para um servidor. Para fazer isso, copiei o conteúdo de um arquivo em um arquivo temporário usando
ContentResolver
eopenInputStream()
fonte
Fiz isso da seguinte maneira:
Então, basicamente, primeiro eu tento usar um arquivo, ou seja, uma foto tirada pela câmera e salva no cartão SD. Isso não funciona para a imagem retornada por: Intent photoPickerIntent = new Intent (Intent.ACTION_PICK); Nesse caso, é necessário converter Uri em caminho real por
getRealPathFromURI()
função. Portanto, a conclusão é que depende do tipo de Uri que você deseja converter em arquivo.fonte
Se você tem um
Uri
que esteja em conformidade com oDocumentContract
, provavelmente não deseja usarFile
. Se você estiver no kotlin, useDocumentFile
para fazer coisas que você usaria no Velho MundoFile
eContentResolver
para obter fluxos.Tudo o resto é praticamente garantido para quebrar.
fonte
Nesse caso, especialmente no Android, o caminho para os bytes geralmente é mais rápido.
Com isso, resolvi configurando uma classe
FileHelper
que tem a responsabilidade de lidar com a leitura / gravação de bytes de / para arquivo no fluxo e uma classeUriHelper
que tem a responsabilidade de descobrir o caminho de Uri e a permissão.Tanto quanto se sabe,
string.getBytes((charset == null) ? DEFAULT_CHARSET:charset)
pode nos ajudar a transferir a string que você deseja para os bytes necessários.Como permitir que o UriHelper e o FileHelper copiem uma imagem anotada pelo Uri em um arquivo, você pode executar:
sobre o meu UriHelper:
}
sobre o meu FileHelper:
}
fonte
Para as pessoas que estão aqui procurando uma solução para imagens, em particular aqui está.
fonte
Arquivo imageToUpload = new File (novo URI (androidURI.toString ())); funciona se este é um arquivo que você criou no armazenamento externo.
Por exemplo, arquivo: /// storage / emulated / 0 / (algum diretório e nome do arquivo)
fonte
public String getRealPathFromURI (Uri uri) {
Em seguida, use para obter o arquivo do URI:
--O POVO PODE AJUDÁ-LO ----
fonte
Pelo código a seguir, posso obter o arquivo pdf compartilhado do aplicativo Adobe como um fluxo e salvá-lo no caminho do aplicativo Android
fonte
Base de extensão na resposta de @Jacek Kwiecień para converter uri de imagem em arquivo
Se usarmos
File(uri.getPath())
, não funcionaráSe usarmos a extensão do android-ktx , ainda não funcionará porque https://github.com/android/android-ktx/blob/master/src/main/java/androidx/core/net/Uri.kt
fonte
DATA
coluna (e essa foi uma abordagem não confiável em primeiro lugar).Adicionar
onActivityResult
, obter docx ou arquivo pdffonte