¿Cómo puedes filtrar aplicaciones específicas cuando usas la intención ACTION_SEND? Esta pregunta se ha formulado de varias maneras, pero no he podido reunir una solución basada en las respuestas dadas. Ojalá alguien pueda ayudar. Me gustaría ofrecer la posibilidad de compartir dentro de una aplicación. Siguiendo el consejo de Android Dev Alexander Lucas , prefiero hacerlo usando intenciones y no usando las API de Facebook / Twitter.
Compartir usando la intención ACTION_SEND es excelente, pero el problema es (1) No quiero que todas las opciones de intercambio estén allí, prefiero limitarlo a FB, Twitter y Correo electrónico, y (2) No quiero compartir lo mismo para cada aplicación para compartir . Por ejemplo, en mi parte de Twitter voy a incluir algunas menciones y los hashtags lo limitarán a 140 caracteres o menos, mientras que la parte de Facebook incluirá un enlace y una imagen característica.
¿Es posible limitar las opciones para la intención ACTION_SEND (compartir)? He visto algo sobre el uso de PackageManager y queryIntentActivities, pero no he podido descubrir la conexión entre PackageManager y la intención ACTION_SEND.
O
En lugar de filtrar las aplicaciones para compartir, mi problema también podría resolverse si pudiera usar la intención ACTION_SEND para ir directamente a Facebook o Twitter en lugar de abrir el cuadro de diálogo. Si ese fuera el caso, entonces podría crear mi propio cuadro de diálogo y cuando hagan clic en "Facebook" crear una intención específica de Facebook y simplemente enviarlos a Facebook. Lo mismo con Twitter.
¿O acaso no es posible? ¿Son las API de Facebook y Twitter la única forma?
fuente
Respuestas:
Que yo sepa, StackOverflow tiene muchas personas haciendo esta pregunta de varias maneras, pero nadie la ha respondido por completo todavía.
Mi especificación requería que el usuario pudiera elegir correo electrónico, twitter, facebook o SMS, con texto personalizado para cada uno. Así es como lo logré:
Encontré fragmentos de cómo hacer esto en varios lugares, pero no lo he visto en un solo lugar en ningún otro lugar.
Tenga en cuenta que este método también oculta todas las opciones tontas que no quiero, como compartir a través de wifi y bluetooth.
Espero que esto ayude a alguien.
Editar: en un comentario, me pidieron que explicara qué está haciendo este código. Básicamente, está creando una
ACTION_SEND
intención SOLAMENTE para el cliente de correo electrónico nativo, luego agrega otras intenciones en el selector. Al hacer la intención original específica del correo electrónico, se eliminan todos los archivos basura adicionales como wifi y bluetooth, luego tomo las otras intenciones que quiero de unACTION_SEND
texto plano genérico y las agrego antes de mostrar el selector.Cuando tomo las intenciones adicionales, establezco texto personalizado para cada una.
Edit2: Ha pasado un tiempo desde que publiqué esto, y las cosas han cambiado un poco. Si ve gmail dos veces en la lista de opciones, intente eliminar el manejo especial de "android.gm" como se sugiere en un comentario de @h_k a continuación.
Dado que esta respuesta es la fuente de casi todos mis puntos de reputación de stackoverflow, al menos tengo que tratar de mantenerla actualizada.
fuente
Si desea una opción personalizada, no debe confiar en el diálogo predeterminado proporcionado por Android para esta acción.
En su lugar, lo que debe hacer es implementar el suyo. Deberá consultar el PackageManager sobre qué paquetes manejan la acción que necesita y luego, según la respuesta, aplicará el filtrado y el texto personalizado.
Específicamente, eche un vistazo al método queryIntentActivities de la clase PackageManager . Construye la intención que iniciaría el diálogo predeterminado (la intención ACTION_SEND), pasa eso a este método y recibirá una lista de objetos que contienen información sobre las actividades que pueden manejar esa intención. Usando eso, puedes elegir los que quieras.
Una vez que crea su lista de paquetes que desea presentar, debe crear su propio cuadro de diálogo de lista (preferiblemente una actividad con el tema del cuadro de diálogo) que mostrará esa lista.
Sin embargo, una cosa a tener en cuenta es que es muy difícil hacer que ese diálogo personalizado se vea como el predeterminado. El problema es que el tema utilizado en ese diálogo es un tema interno y su aplicación no puede utilizarlo. Puede intentar que sea tan similar al nativo como desee o optar por un aspecto completamente personalizado (muchas aplicaciones hacen eso como la aplicación de galería, etc.)
fuente
Pruebe esta para compartir solo tres aplicaciones: Facebook, Twitter, KakaoStory.
fuente
Encontré una solución que funciona para mí mirando aquí (ver el tercer comentario sobre la primera respuesta). Este código busca un cliente de Twitter válido y lo usa para publicar el tweet. Nota: no le da una intención con los distintos clientes de Twitter y le permite elegir.
Compartir usando twitter:
Llamando a este método:
Facebook será similar usando " com.facebook.katana ", aunque todavía no puede configurar el texto del mensaje (en desuso en julio de 2011).
Fuente del código: intención de abrir el cliente de Twitter en Android
fuente
Gracias a @dacoinminster. Hago algunas modificaciones a su respuesta, incluidos los nombres de paquetes de las aplicaciones populares y la clasificación de esas aplicaciones.
fuente
Puedes probar el siguiente código, funciona perfectamente.
Aquí compartimos algunas aplicaciones específicas, que son Facebook, Messenger, Twitter, Google Plus y Gmail.
fuente
Esta solución muestra una lista de aplicaciones en un cuadro de diálogo ListView que se asemeja al selector:
Depende de usted:
La clase de adaptador:
y su uso:
fuente
La forma más limpia es copiar las siguientes clases: ShareActionProvider, ActivityChooserView, ActivityChooserModel. Agregue la capacidad de filtrar las intenciones en ActivityChooserModel y los métodos de soporte apropiados en ShareActionProvider. Creé las clases necesarias, puedes copiarlas en tu proyecto ( https://gist.github.com/saulpower/10557956 ). Esto no solo agrega la capacidad de filtrar las aplicaciones con las que le gustaría compartir (si conoce el nombre del paquete), sino también desactivar el historial.
fuente
He mejorado la respuesta de @dacoinminster y este es el resultado con un ejemplo para compartir su aplicación:
fuente
Tuve el mismo problema y esta solución aceptada no me ayudó, si alguien tiene el mismo problema, puede usar mi fragmento de código:
fuente
fuente
Tan simple y conciso. Gracias al desarrollador de código abierto, cketti por compartir esta solución:
Y este es el enlace a su esencia.
fuente