Tenho um tipo / extensão de arquivo personalizado ao qual desejo associar meu aplicativo.
Pelo que eu sei, o elemento de dados é feito para essa finalidade, mas não consigo fazê-lo funcionar. http://developer.android.com/guide/topics/manifest/data-element.html De acordo com os documentos e várias postagens do fórum, deve funcionar assim:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:mimeType="application/pdf" />
</intent-filter>
Bem, isso não funciona. O que eu fiz errado? Eu simplesmente quero declarar meu próprio tipo de arquivo.
Respostas:
Você precisa de vários filtros de intent para lidar com as diferentes situações que deseja controlar.
Exemplo 1, lidar com solicitações http sem tipos MIME:
Lidar com tipos MIME, onde o sufixo é irrelevante:
Manipule a intenção de um aplicativo de navegador de arquivos:
fonte
As outras soluções não funcionaram de maneira confiável para mim até que eu adicionei:
Antes funcionava em algumas aplicações, em outras não ...
solução completa para mim:
fonte
mimeType
e outra sem se você quiser ser completa. Consulte developer.android.com/guide/components/…As respostas dadas por Phyrum Tea e yuku já são muito informativas.
Quero acrescentar que, a partir do Android 7.0 Nougat, há uma mudança na maneira como o compartilhamento de arquivos entre aplicativos é tratado:
Das alterações oficiais do Android 7.0 :
Se você tiver seu próprio arquivo personalizado terminando sem um específico
mime-type
(ou eu acho que até mesmo com um), pode ser necessário adicionar um segundoscheme
valor ao seuintent-filter
para fazê-lo funcionarFileProviders
também.Exemplo:
O importante aqui é a adição de
para o filtro.
Tive dificuldade em descobrir sobre essa pequena mudança que impedia minha atividade de abrir em dispositivos Android 7.0, enquanto tudo estava bem nas versões mais antigas. Eu espero que isso ajude alguém.
fonte
File(uri.path)
, ele travará devido aNo such file or directory
- terá que lidar com esse cenário de maneira diferente ao atualizar para suportar o Nougat +!Minhas descobertas:
Você precisa de vários filtros para lidar com as diferentes maneiras de recuperar um arquivo. ou seja, por anexo do gmail, por explorador de arquivos, por HTTP, por FTP ... Todos eles enviam intenções muito diferentes.
E você precisa filtrar a intenção que aciona sua atividade em seu código de atividade.
Para o exemplo abaixo, criei um tipo de arquivo falso new.mrz. E eu recuperei do anexo do gmail e do explorador de arquivos.
Código de atividade adicionado no onCreate ():
Filtro de anexo do Gmail:
Filtro do explorador de arquivos:
Filtro HTTP:
Funções privadas usadas acima:
fonte
o
pathPattern
não funciona se o caminho do arquivo contiver um ou mais pontos antes de ".pdf".
Isso vai funcionar:
Adicione mais se quiser suportar mais pontos.
fonte
Venho tentando fazer isso funcionar há muito tempo, tentei basicamente todas as soluções sugeridas e ainda não consigo fazer o Android reconhecer extensões de arquivo específicas. Eu tenho um filtro de intenção com um
"*/*"
tipo MIME que é a única coisa que parece funcionar e os navegadores de arquivos agora listam meu aplicativo como uma opção para abrir arquivos, no entanto, meu aplicativo agora é mostrado como uma opção para abrir QUALQUER TIPO de arquivo, embora Especifiquei extensões de arquivo específicas usando a tag pathPattern. Isso vai tão longe que, mesmo quando tento visualizar / editar um contato na minha lista de contatos, o Android me pergunta se eu quero usar meu aplicativo para visualizar o contato, e essa é apenas uma das muitas situações em que isso ocorre, MUITO MUITO irritante.Acabei encontrando esta postagem do Google Groups com uma pergunta semelhante à qual um engenheiro de estrutura Android real respondeu. Ela explica que o Android simplesmente não sabe nada sobre extensões de arquivo, apenas tipos MIME ( https://groups.google.com/forum/#!topic/android-developers/a7qsSl3vQq0 ).
Portanto, pelo que vi, experimentei e li, o Android simplesmente não consegue distinguir entre extensões de arquivo e a tag pathPattern é basicamente uma perda gigantesca de tempo e energia. Se você tiver a sorte de precisar apenas de arquivos de um certo tipo MIME (por exemplo, texto, vídeo ou áudio), você pode usar um filtro de intenção com um tipo MIME. Se você precisa de uma extensão de arquivo específica ou um tipo MIME não conhecido pelo Android, então você está sem sorte.
Se eu estiver errado sobre qualquer coisa, por favor me diga, até agora eu li todos os posts e tentei todas as soluções propostas que pude encontrar, mas nenhuma funcionou.
Eu poderia escrever mais uma ou duas páginas sobre como esse tipo de coisa parece comum no Android e como a experiência do desenvolvedor é complicada, mas vou poupar meus discursos furiosos;). Espero ter salvado alguém de alguns problemas.
fonte
Markus Ressel está correto. O Android 7.0 Nougat não permite mais o compartilhamento de arquivos entre aplicativos usando um URI de arquivo. Um URI de conteúdo deve ser usado. No entanto, um URI de conteúdo não permite que um caminho de arquivo seja compartilhado, apenas um tipo MIME. Portanto, você não pode usar um URI de conteúdo para associar seu aplicativo à sua própria extensão de arquivo.
Drobpox tem um comportamento interessante no Android 7.0. Quando encontra uma extensão de arquivo desconhecida, parece formar uma intenção de URI de arquivo, mas em vez de iniciar a intenção, ele chama o sistema operacional para descobrir quais aplicativos podem aceitar a intenção. Se houver apenas um aplicativo que pode aceitar esse URI de arquivo, ele enviará um URI de conteúdo explícito diretamente para esse aplicativo. Portanto, para trabalhar com o Dropbox, você não precisa alterar os filtros de intenção em seu aplicativo. Ele não requer um filtro de intenção de URI de conteúdo. Certifique-se de que o aplicativo pode receber um URI de conteúdo e que seu aplicativo com sua própria extensão de arquivo funcionará com o Dropbox da mesma forma que funcionava antes do Android 7.0.
Aqui está um exemplo do meu código de carregamento de arquivo modificado para aceitar um URI de conteúdo:
fonte
Tente adicionar
fonte
Para anexo do Gmail, você pode usar:
Adicione quantos tipos de MIME forem necessários. Eu só preciso disso para o meu projeto.
fonte
Observe que isso fará com que seu aplicativo abra todos os anexos de arquivo do gmail, não há como contornar isso
fonte
Aqueles que tiveram problemas com outros aplicativos File Manager \ Explorer, como @yuku e @ phyrum-tea responderam
Isso funciona com o aplicativo gerenciador de arquivos padrão LG
mas não podia funcionar com ES File Explorer e outros gerenciadores de arquivos, então adicionei
então ele funciona com o ES Explorer, mas o gerenciador de arquivos LG não conseguiu detectar o tipo de arquivo, então minha solução é
fonte
URI de conteúdo ftw e com o filtro de intenção no manifesto ... se seus arquivos tiverem uma extensão personalizada .xyz, adicione um tipo MIME correspondente:
Alguns aplicativos, como e-mail, parecem converter a extensão em um tipo mime. Agora posso clicar no anexo do e-mail e abri-lo no meu aplicativo.
fonte
Se você tentar isso, vai te ajudar. Em vez de pdf, você também pode usar outras extensões. Primeiro, você precisa adicionar permissão de leitura de armazenamento externo no arquivo androidmanifest.xml .
Em seguida, no arquivo androidmanifest na tag Activity, você adiciona um filtro de intent conforme mostrado abaixo.
Finalmente, em seu código, você obtém o caminho do arquivo PDF conforme mostrado abaixo:
fonte
Leia o arquivo de abertura em kotlin:
fonte
Coloque este filtro de intent dentro da tag de atividade no manifesto que você gostaria de abrir tocando no arquivo:
fonte
// Eu tentei este código. E está funcionando bem. Você pode usar este código para aceitar o arquivo pdf.
fonte