Como você pode filtrar aplicativos específicos ao usar a intenção ACTION_SEND? Esta pergunta foi feita de várias maneiras, mas não consegui reunir uma solução com base nas respostas dadas. Espero que alguém possa ajudar. Gostaria de fornecer a capacidade de compartilhar dentro de um aplicativo. Seguindo o conselho do Android Dev Alexander Lucas , eu preferiria fazê-lo usando intenções e não usando as APIs do Facebook / Twitter.
Compartilhar usando a intenção ACTION_SEND é ótimo, mas o problema é (1) não quero todas as opções de compartilhamento lá, prefiro limitá-las ao FB, Twitter e e-mail e (2) não quero compartilhar a mesma coisa para cada aplicativo de compartilhamento . Por exemplo, no meu compartilhamento no twitter, incluirei algumas menções e hashtags limitadas a 140 caracteres ou menos, enquanto o compartilhamento no facebook incluirá um link e uma imagem de recurso.
É possível limitar as opções para a intenção de ACTION_SEND (compartilhamento)? Eu já vi algo sobre o uso de PackageManager e queryIntentActivities, mas não consegui descobrir a conexão entre o PackageManager e a intenção ACTION_SEND.
OU
Em vez de filtrar os aplicativos de compartilhamento, meu problema também poderia ser resolvido se eu pudesse usar a intenção de ACTION_SEND de ir diretamente para o Facebook ou Twitter, em vez de abrir a caixa de diálogo. Se fosse esse o caso, eu poderia criar minha própria caixa de diálogo e, quando clicarem em "Facebook", criar uma intenção específica do Facebook e enviá-las para o Facebook. O mesmo com o Twitter.
Ou isso não é possível? As APIs do Facebook e Twitter são a única maneira?
fonte
Respostas:
Que eu saiba, o StackOverflow tem muitas pessoas fazendo essa pergunta de várias maneiras, mas ninguém a respondeu completamente ainda.
Minhas especificações pediam que o usuário pudesse escolher email, twitter, facebook ou SMS, com texto personalizado para cada um. Aqui está como eu consegui isso:
Encontrei algumas dicas de como fazer isso em vários lugares, mas não vi tudo em um lugar em nenhum outro lugar.
Observe que esse método também oculta todas as opções tolas que eu não quero, como compartilhar por wifi e bluetooth.
Espero que isso ajude alguém.
Edit: Em um comentário, fui convidado a explicar o que esse código está fazendo. Basicamente, ele cria uma
ACTION_SEND
intenção SOMENTE para o cliente de email nativo e, em seguida, coloca outras intenções no seletor. Tornar a intenção original específica de e-mail se livra de todo o lixo extra, como wi-fi e bluetooth, então pego as outras intenções que eu quero de umACTION_SEND
tipo genérico de texto sem formatação e as ajudo antes de mostrar o seletor.Quando pego as intenções adicionais, defino o texto personalizado para cada uma.
Edit2: Já faz um tempo desde que eu postei isso, e as coisas mudaram um pouco. Se você vir o gmail duas vezes na lista de opções, tente remover o tratamento especial para "android.gm", conforme sugerido em um comentário de @h_k abaixo.
Como essa resposta é a fonte de quase todos os meus pontos de reputação no stackoverflow, tenho que pelo menos tentar mantê-la atualizada.
fonte
Se você deseja uma opção personalizada, não deve confiar na caixa de diálogo padrão fornecida pelo android para esta ação.
O que você precisa fazer é lançar o seu próprio. Você precisará consultar o PackageManager no qual os pacotes lidam com a ação necessária e, com base na resposta, aplicar filtragem e texto personalizado.
Especificamente, dê uma olhada no método queryIntentActivities da classe PackageManager . Você cria a intenção que iniciaria a caixa de diálogo padrão (a intenção ACTION_SEND), a passa para esse método e você receberá uma lista de objetos que contêm informações sobre as atividades que podem lidar com essa intenção. Usando isso, você pode escolher os que deseja.
Depois de criar sua lista de pacotes que você deseja apresentar, você precisa criar sua própria caixa de diálogo de lista (de preferência uma atividade com o tema da caixa de diálogo) que exibirá essa lista.
Uma coisa a ser observada, porém, é que é muito difícil fazer com que a caixa de diálogo personalizada pareça a padrão. O problema é que o tema usado nessa caixa de diálogo é um tema interno e não pode ser usado pelo seu aplicativo. Você pode tentar torná-lo o mais parecido com o nativo que desejar ou optar por uma aparência totalmente personalizada (muitos aplicativos fazem isso como o aplicativo de galeria etc.)
fonte
Experimente este para compartilhar apenas três aplicativos - Facebook, Twitter, KakaoStory.
fonte
Encontrei uma solução que funciona para mim olhando aqui (veja o terceiro comentário na primeira resposta). Esse código procura um cliente válido do twitter e o usa para postar o tweet. Nota: Ele não fornece uma intenção com os vários clientes do Twitter e permite que você escolha.
Compartilhe usando o twitter:
Chamando este método:
O Facebook será semelhante ao uso de " com.facebook.katana ", embora você ainda não possa definir o texto da mensagem (obsoleto em julho de 2011).
Fonte do código: intenção de abrir o cliente do twitter no Android
fonte
Graças a @dacoinminster. Eu faço algumas modificações em sua resposta, incluindo nomes de pacotes dos aplicativos populares e classificação desses aplicativos.
fonte
Você pode tentar o código abaixo, ele funciona perfeitamente.
Aqui, compartilhamos com alguns aplicativos específicos, como Facebook, Messenger, Twitter, Google Plus e Gmail.
fonte
Esta solução mostra uma lista de aplicativos em uma caixa de diálogo ListView que se assemelha ao seletor:
Cabe a você:
A classe do adaptador:
e seu uso:
fonte
A maneira mais limpa é copiar as seguintes classes: ShareActionProvider, ActivityChooserView, ActivityChooserModel. Adicione a capacidade de filtrar as intenções no ActivityChooserModel e os métodos de suporte apropriados no ShareActionProvider. Criei as classes necessárias, você pode copiá-las em seu projeto ( https://gist.github.com/saulpower/10557956 ). Isso não apenas adiciona a capacidade de filtrar os aplicativos com os quais você deseja compartilhar (se você souber o nome do pacote), mas também de desativar o histórico.
fonte
Melhorei a resposta @dacoinminster e este é o resultado com um exemplo para compartilhar seu aplicativo:
fonte
Eu tive o mesmo problema e esta solução aceita não me ajudou, se alguém tiver o mesmo problema, você pode usar meu snippet de código:
fonte
fonte
Tão simples e conciso. Graças ao desenvolvedor de código aberto, cketti por compartilhar esta solução:
E este é o link para sua essência.
fonte