Estou usando o gerenciador de arquivos de terceiros para escolher um arquivo (PDF, no meu caso) do sistema de arquivos.
É assim que eu inicio a atividade:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(getString(R.string.app_pdf_mime_type));
intent.addCategory(Intent.CATEGORY_OPENABLE);
String chooserName = getString(R.string.Browse);
Intent chooser = Intent.createChooser(intent, chooserName);
startActivityForResult(chooser, ActivityRequests.BROWSE);
Isso é o que eu tenho em onActivityResult
:
Uri uri = data.getData();
if (uri != null) {
if (uri.toString().startsWith("file:")) {
fileName = uri.getPath();
} else { // uri.startsWith("content:")
Cursor c = getContentResolver().query(uri, null, null, null, null);
if (c != null && c.moveToFirst()) {
int id = c.getColumnIndex(Images.Media.DATA);
if (id != -1) {
fileName = c.getString(id);
}
}
}
}
O snippet de código é emprestado das instruções do Open Intents File Manager disponíveis aqui:
http://www.openintents.org/en/node/829
O objetivo if-else
é compatibilidade com versões anteriores. Eu me pergunto se essa é a melhor maneira de obter o nome do arquivo, pois descobri que outros gerenciadores de arquivos retornam todos os tipos de coisas.
Por exemplo, Documents ToGo retorna algo como o seguinte:
content://com.dataviz.dxtg.documentprovider/document/file%3A%2F%2F%2Fsdcard%2Fdropbox%2FTransfer%2Fconsent.pdf
em que getContentResolver().query()
retorna null
.
Para tornar as coisas mais interessantes, o gerenciador de arquivos sem nome (obtive este URI do log do cliente) retornou algo como:
/./sdcard/downloads/.bin
Existe uma maneira preferida de extrair o nome do arquivo do URI ou deve-se recorrer à análise de string?
Respostas:
developer.android.com tem um bom exemplo de código para isso: https://developer.android.com/guide/topics/providers/document-provider.html
Uma versão condensada para apenas extrair o nome do arquivo (assumindo que "isto" é uma atividade):
fonte
file://
decontent://
noonScanCompleted(String path, Uri uri)
método stackoverflow.com/a/5815005/2163045new String[]{OpenableColumns.DISPLAY_NAME}
como um segundo parâmetro à consulta filtrará as colunas para uma solicitação mais eficiente.OpenableColumns.DISPLAY_NAME
não funcionou para mim, eu usei em seuMediaStore.Files.FileColumns.TITLE
lugar.java.lang.IllegalArgumentException: Invalid column latitude
infelizmente. Funciona perfeitamente para fotos!Estou usando algo assim:
fonte
cursor
não éclose()
d?Retirado das informações do arquivo de recuperação | Desenvolvedores Android
Recuperando o nome de um arquivo.
fonte
Se você quiser que seja curto, isso deve funcionar.
fonte
Maneiras mais fáceis de obter o nome do arquivo:
Se eles não derem o nome correto, você deve usar:
fonte
Eu uso o código abaixo para obter o nome e o tamanho do arquivo do Uri no meu projeto.
fonte
A versão mais condensada:
fonte
fonte
Para Kotlin, você pode usar algo assim:
fonte
fonte
Minha versão da resposta é muito semelhante à de @Stefan Haustein. Eu encontrei a resposta na página do desenvolvedor Android, Recuperando informações de arquivos ; as informações aqui são ainda mais condensadas neste tópico específico do que no site do guia Estrutura de acesso ao armazenamento . No resultado da consulta, o índice da coluna que contém o nome do arquivo é
OpenableColumns.DISPLAY_NAME
. Nenhuma das outras respostas / soluções para índices de coluna funcionou para mim. Abaixo está o exemplo de função:fonte
Primeiro, você precisa converter seu
URI
objeto emURL
objeto e, em seguida, usarFile
objeto para recuperar um nome de arquivo:É isso, muito fácil.
fonte
Função de Stefan Haustein para xamarin / c #:
fonte
Se você quiser ter o nome do arquivo com extensão, uso esta função para obtê-lo. Também funciona com opções de arquivos do Google Drive
fonte
Isso realmente funcionou para mim:
fonte
Por favor, tente isto:
fonte
Combinação de todas as respostas
Aqui está o que eu cheguei depois de uma leitura de todas as respostas apresentadas aqui, bem como o que alguns Airgram fizeram em seus SDKs - um utilitário que abri no Github:
https://github.com/mankum93/UriUtilsAndroid/tree/master/app/src/main/java/com/androiduriutils
Uso
Tão simples quanto ligar
UriUtils.getDisplayNameSize()
,. Ele fornece o nome e o tamanho do conteúdo.Nota: Funciona apenas com um conteúdo: // Uri
Aqui está um vislumbre do código:
fonte