No meu aplicativo, o usuário deve selecionar um arquivo de áudio que o aplicativo manipula. O problema é que, para que o aplicativo faça o que eu quero com os arquivos de áudio, preciso que o URI esteja no formato de arquivo. Quando uso o reprodutor de música nativo do Android para procurar o arquivo de áudio no aplicativo, o URI é um URI de conteúdo, com a seguinte aparência:
content://media/external/audio/media/710
No entanto, usando o popular aplicativo gerenciador de arquivos Astro, recebo o seguinte:
file:///sdcard/media/audio/ringtones/GetupGetOut.mp3
O último é muito mais acessível para eu trabalhar, mas é claro que eu quero que o aplicativo tenha funcionalidade com o arquivo de áudio que o usuário escolhe, independentemente do programa usado para navegar em sua coleção. Então, minha pergunta é: existe uma maneira de converter o content://
estilo URI em um file://
URI? Caso contrário, o que você recomendaria para eu resolver esse problema? Aqui está o código que chama o seletor, para referência:
Intent ringIntent = new Intent();
ringIntent.setType("audio/mp3");
ringIntent.setAction(Intent.ACTION_GET_CONTENT);
ringIntent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(Intent.createChooser(ringIntent, "Select Ringtone"), SELECT_RINGTONE);
Eu faço o seguinte com o URI do conteúdo:
m_ringerPath = m_ringtoneUri.getPath();
File file = new File(m_ringerPath);
Em seguida, faça algumas coisas no FileInputStream com o referido arquivo.
Respostas:
Basta usar
getContentResolver().openInputStream(uri)
para obter umInputStream
de um URI.http://developer.android.com/reference/android/content/ContentResolver.html#openInputStream(android.net.Uri)
fonte
Esta é uma resposta antiga, com uma maneira obsoleta e hacky de superar alguns pontos problemáticos específicos do resolvedor de conteúdo. Leve-o com grandes grãos de sal e use a API openInputStream adequada, se possível.
Você pode usar o resolvedor de conteúdo para obter um
file://
caminho a partir docontent://
URI:fonte
android.provider.MediaStore.Images.ImageColumns.DATA
garantido que a coluna "_data" ( ) sempre existe se o esquema forcontent://
?File
tentar ignorar o ContentResolver. Use os métodos ContentResolver para operar comcontent://
uris, esta é a abordagem oficial, incentivada pelos engenheiros do Google.Se você tiver um conteúdo Uri,
content://com.externalstorage...
poderá usar esse método para obter o caminho absoluto de uma pasta ou arquivo no Android 19 ou superior .Você pode verificar se cada parte do Uri está usando println. Os valores retornados para o cartão SD e a memória principal do dispositivo estão listados abaixo. Você pode acessar e excluir se o arquivo estiver na memória, mas não foi possível excluir o arquivo do cartão SD usando esse método, apenas ler ou abrir uma imagem usando esse caminho absoluto. Se você encontrar uma solução para excluir usando esse método, compartilhe. CARTÃO SD
MEMÓRIA PRINCIPAL
Se você deseja obter Uri
file:///
depois de obter o caminho, usefonte
Tentar manipular o URI com o esquema content: // chamando
ContentResolver.query()
não é uma boa solução. No HTC Desire executando o 4.2.2, você pode obter NULL como resultado da consulta.Por que não usar o ContentResolver? https://stackoverflow.com/a/29141800/3205334
fonte
content://
fornecer uma uri, correspondente ao arquivo em seu diretório interno privado, você não poderá usá-la comFile
APIs em novas versões do Android. O ContentResolver foi projetado para superar esse tipo de limitações de segurança. Se você recebeu a uri do ContentResolver, pode esperar que funcione.Respostas inspiradas são Jason LaBrun e Darth Raven . Tentar abordagens já respondidas me levou à solução abaixo, que pode cobrir principalmente casos nulos do cursor e conversão de conteúdo: // para file: //
Para converter arquivos, leia e escreva o arquivo a partir de uri ganho
Para obter o uso do nome do arquivo, ele cobrirá o caso nulo do cursor
Há uma boa opção para converter do tipo MIME para extensão de arquivo
Cursor para obter o nome do arquivo
fonte
Bem, estou um pouco atrasado para responder, mas meu código é testado
esquema de verificação da uri:
Na resposta acima, converti a URL do vídeo para a matriz de bytes, mas isso não está relacionado à pergunta, apenas copiei meu código completo para mostrar o uso de
FileInputStream
eInputStream
como ambos estão funcionando da mesma forma no meu código.Eu usei o contexto variável que é getActivity () no meu fragmento e em Activity simplesmente é ActivityName.this
context=getActivity();
// no fragmentocontext=ActivityName.this;
// em atividadefonte
byte[] videoBytes;
? A maioria das respostas mostra apenas como usarInputStream
com uma imagem.