Android con intención de aplicación de Twitter

¿Es posible mostrar una lista de aplicaciones (con intent.createChooser ) que solo me muestran mis aplicaciones de Twitter en mi teléfono (por lo que htc peep (htc hero) o twitdroid). Lo he intentado con intent.settype("application/twitter") pero no encuentra ninguna aplicación para Twitter y solo muestra mis aplicaciones de correo.

Gracias,

Wouter

Es completamente posible que sus usuarios solo, ahora y para siempre, solo quieran publicar en Twitter.

Creo que es más probable que tus usuarios quieran enviar información a otras personas, y Twitter es una posibilidad. Sin embargo, es posible que también deseen enviar un mensaje de texto, un correo electrónico, etc.

En ese caso, use ACTION_SEND , como se describe aquí . Twidroid, en particular, es compatible con ACTION_SEND , por lo que aparecerá en la lista de mecanismos de entrega disponibles.

Estoy publicando esto porque aún no he visto una solución que haga exactamente lo que quiero.

Esto inicia principalmente la aplicación oficial de Twitter o, si no está instalada, abre un cuadro de diálogo “Acción completa usando …” ( como este ) o inicia un navegador web directamente.

Para obtener una lista de los diferentes parámetros en la URL de twitter.com, consulte los documentos del botón Tweet . Recuerde que la URL codifica los valores de los parámetros. (Este código es específicamente para twittear una URL, si no lo desea, simplemente url parámetro de url ).

 // Create intent using ACTION_VIEW and a normal Twitter url: String tweetUrl = String.format("https://twitter.com/intent/tweet?text=%s&url=%s", urlEncode("Tweet text"), urlEncode("https://www.google.fi/")); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(tweetUrl)); // Narrow down to official Twitter app, if available: List matches = getPackageManager().queryIntentActivities(intent, 0); for (ResolveInfo info : matches) { if (info.activityInfo.packageName.toLowerCase().startsWith("com.twitter")) { intent.setPackage(info.activityInfo.packageName); } } startActivity(intent); 

(La encoding URL es más limpia si tiene una pequeña utilidad como esta en alguna parte, por ejemplo, “StringUtils”).

 public static String urlEncode(String s) { try { return URLEncoder.encode(s, "UTF-8"); } catch (UnsupportedEncodingException e) { Log.wtf(TAG, "UTF-8 should always be supported", e); throw new RuntimeException("URLEncoder.encode() failed for " + s); } } 

Por ejemplo, en mi dispositivo Nexus 7, esto abre directamente la aplicación oficial de Twitter :

enter image description here

Si la aplicación oficial de Twitter no está instalada y el usuario selecciona Chrome o se abre automáticamente (como la única aplicación que puede manejar la intención):

enter image description here

Las soluciones publicadas anteriormente le permiten publicar directamente en su primera aplicación de Twitter. Para mostrar una lista de la aplicación twitters (si hay más de una), puede personalizar su Intent.createChooser para mostrar solo los Itents que desee.

El truco es agregar EXTRA_INITIAL_INTENTS a la lista predeterminada, generada a partir de createChoose, y eliminar los demás Intents de la lista.

Mire esta muestra donde creo un selector que muestra solo mis aplicaciones de correo electrónico. En mi caso aparecen tres correos: Gmail, YahooMail y el correo predeterminado.

 private void share(String nameApp, String imagePath) { List targetedShareIntents = new ArrayList(); Intent share = new Intent(android.content.Intent.ACTION_SEND); share.setType("image/jpeg"); List resInfo = getPackageManager().queryIntentActivities(share, 0); if (!resInfo.isEmpty()){ for (ResolveInfo info : resInfo) { Intent targetedShare = new Intent(android.content.Intent.ACTION_SEND); targetedShare.setType("image/jpeg"); // put here your mime type if (info.activityInfo.packageName.toLowerCase().contains(nameApp) || info.activityInfo.name.toLowerCase().contains(nameApp)) { targetedShare.putExtra(Intent.EXTRA_TEXT, "My body of post/email"); targetedShare.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(imagePath)) ); targetedShare.setPackage(info.activityInfo.packageName); targetedShareIntents.add(targetedShare); } } Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), "Select app to share"); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[]{})); startActivity(chooserIntent); } } 

Puede ejecutar de esa manera: compartir (“twi”, “/sdcard/dcim/Camera/photo.jpg”);

Esto se basó en la publicación: Filtrado personalizado del selector de intenciones basado en el nombre del paquete de Android instalado

Esta pregunta es un poco más antigua, pero dado que acabo de encontrarme con un problema similar, también puede ser de interés para otros. Primero, como lo menciona Peter, crea tu intención:

 Intent tweetIntent = new Intent(Intent.ACTION_SEND); tweetIntent.putExtra(Intent.EXTRA_TEXT, "Test; please ignore"); tweetIntent.setType("application/twitter"); 

“application / twitter” es de hecho un tipo de contenido conocido, mira aquí . Ahora, cuando intenta iniciar una actividad con este propósito, mostrará todo tipo de aplicaciones que no son realmente clientes de Twitter, pero quieren una parte de la acción. Como ya se mencionó en un par de “¿por qué quieres hacer eso?” tipo de respuestas, algunos usuarios pueden encontrar útil. Por otro lado, si tengo un botón en mi aplicación que dice “¡twittear esto!”, El usuario esperaría mucho que aparezca un cliente de Twitter.

Lo que significa que en lugar de simplemente iniciar una actividad, debemos filtrar los que sean apropiados:

 PackageManager pm = getPackageManager(); List lract = pm.queryIntentActivities(tweetIntent, PackageManager.MATCH_DEFAULT_ONLY); boolean resolved = false; for(ResolveInfo ri: lract) { if(ri.activityInfo.name.endsWith(".SendTweet")) { tweetIntent.setClassName(ri.activityInfo.packageName, ri.activityInfo.name); resolved = true; break; } } 

Tendría que experimentar un poco con los diferentes proveedores, pero si el nombre termina en “.SendTweet”, es bastante seguro (este es el nombre de la actividad en Twidroyd). También puede verificar los nombres de los paquetes que desea usar para su depuración y ajustar la comparación de cadenas en consecuencia (es decir, Twidroyd usa “com.twidroid. *”).

En este sencillo ejemplo, simplemente seleccionamos la primera actividad coincidente que encontramos. Esto hace que aparezca el cliente de Twitter directamente, sin que el usuario tenga que tomar ninguna decisión. Si no hay clientes de Twitter adecuados, volvemos al selector de actividad estándar:

 startActivity(resolved ? tweetIntent : Intent.createChooser(tweetIntent, "Choose one")); 

Podría expandir el código y tener en cuenta el caso de que haya más de un cliente de Twitter, cuando desee crear su propio cuadro de diálogo de selección entre todos los nombres de actividad que encuentre.

Estas respuestas son muy complejas.

Si solo hace una url normal con intención de Twitter.com, obtendrá esta pantalla:

enter image description here

lo que le da la opción de ir al sitio web si no tiene aplicaciones de Twitter instaladas.

 String url = "https://twitter.com/intent/tweet?source=webclient&text=TWEET+THIS!"; Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(url)); startActivity(i); 

Ya sea

  • Intent.ACTION_SEND una actividad con un Intento con acción Intent.ACTION_SEND y el text/plain tipo MIME text/plain . Tendrás todas las aplicaciones compatibles con el envío de texto. Debería ser cualquier cliente de Twitter, Gmail, Dropbox, etc.
  • O bien, intenta buscar la acción específica de cada cliente que conoce, como “com.twitter.android.PostActivity” para el cliente oficial . Eso apuntará a este cliente, y es poco probable que sea una lista completa.
  • O bien, comienzas con el segundo punto y recurres al primero …

Nop. El tipo de intención es algo así como image/png o application/pdf , es decir, un tipo de archivo, y con createChooser básicamente preguntas qué aplicaciones pueden abrir este tipo de archivo.

Ahora, no hay tal cosa como un archivo de application/twitter que se pueda abrir, así que eso no funcionará. No estoy al tanto de ninguna otra forma en que pueda lograr lo que quiere tampoco.

Desde http://twidroid.com/plugins/

Intento de ACTION_SEND de Twidroid

 Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is a sample message via Public Intent"); sendIntent.setType("application/twitter"); startActivity(Intent.createChooser(sendIntent, null)); 

Utilicé la respuesta “billynomates” y pude usar hashtags utilizando la función “URLEncoder.encode (,” UTF-8 “)”. Las tags hash aparecieron muy bien.

 String originalMessage = "some message #MESSAGE"; String originalMessageEscaped = null; try { originalMessageEscaped = String.format( "https://twitter.com/intent/tweet?source=webclient&text=%s", URLEncoder.encode(originalMessage, "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } if(originalMessageEscaped != null) { Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(originalMessageEscaped)); startActivity(i); } else { // Some Error }