web-dev-qa-db-fra.com

Android Intention pour l'application Twitter

Est-il possible d'afficher une liste d'applications (avec intent.createChooser) Qui ne montrent que mes applications Twitter sur mon téléphone (donc htc peep (htc hero) ou twitdroid). Je l'ai essayé avec intent.settype("application/Twitter") mais il ne trouve aucune application pour Twitter et n'affiche que mes applications de messagerie.

Je vous remercie,

Wouter

61
wouter88

Il est tout à fait possible que vos utilisateurs ne souhaitent que, maintenant et pour toujours, publier uniquement sur Twitter.

Je pense qu'il est plus probable que vos utilisateurs souhaitent envoyer des informations aux gens, et Twitter est une possibilité. Mais, ils peuvent également vouloir envoyer un SMS, un e-mail, etc.

Dans ce cas, utilisez ACTION_SEND, comme décrit ici . Twidroid, notamment, prend en charge ACTION_SEND, il apparaîtra donc dans la liste des mécanismes de livraison disponibles.

23
CommonsWare

Je poste ceci parce que je n'ai pas encore vu de solution qui fasse exactement ce que je veux.

Cela lance principalement l'application Twitter officielle , ou si elle n'est pas installée, une boîte de dialogue "Action complète utilisant ..." s'affiche ( comme ceci ) ou lance directement un navigateur Web.

Pour obtenir la liste des différents paramètres de l'URL Twitter.com, consultez les Tweet Button docs . N'oubliez pas RL encode les valeurs des paramètres. (Ce code est spécifiquement pour tweeter une URL; si vous ne le souhaitez pas, laissez simplement le paramètre 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<ResolveInfo> matches = getPackageManager().queryIntentActivities(intent, 0);
for (ResolveInfo info : matches) {
    if (info.activityInfo.packageName.toLowerCase().startsWith("com.Twitter")) {
        intent.setPackage(info.activityInfo.packageName);
    }
}

startActivity(intent);

(L'encodage d'URL est plus propre si vous avez un petit utilitaire comme celui-ci quelque part, par exemple "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);
    }
}

Par exemple, sur mon appareil Nexus 7, cela directement ouvre la application Twitter officielle :

enter image description here

Si l'application Twitter officielle est pas installée et que l'utilisateur sélectionne Chrome ou qu'elle s'ouvre automatiquement (comme la seule application qui peut gérer l'intention):

enter image description here

82
Jonik

Les solutions publiées précédemment vous permettent de publier directement sur votre première application Twitter. Pour afficher une liste des applications twitters (s'il y en a plusieurs), vous pouvez personnaliser votre Intent.createChooser pour afficher uniquement les Itents que vous souhaitez.

L'astuce consiste à ajouter EXTRA_INITIAL_INTENTS à la liste par défaut, générée à partir de createChoose, et à supprimer les autres intentions de la liste.

Regardez cet exemple où je crée un sélecteur qui affiche uniquement mes applications de messagerie. Dans mon cas apparaît trois mails: Gmail, YahooMail et le Mail par défaut.

private void share(String nameApp, String imagePath) {
    List<Intent> targetedShareIntents = new ArrayList<Intent>();
    Intent share = new Intent(Android.content.Intent.ACTION_SEND);
    share.setType("image/jpeg");
    List<ResolveInfo> 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);
    }
}

Vous pouvez exécuter comme ça: share ("twi", "/sdcard/dcim/Camera/photo.jpg");

Cela était basé sur la publication: Filtrage personnalisé du sélecteur d'intention en fonction du Android Android

39
Derzu

Cette question est un peu plus ancienne, mais comme je viens de rencontrer un problème similaire, elle peut également intéresser d'autres personnes. Tout d'abord, comme mentionné par Peter, créez votre intention:

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

"application/Twitter" est en fait un type de contenu connu, voir ici . Maintenant, lorsque vous essayez de démarrer une activité avec cette intention, cela montrera toutes sortes d'applications qui ne sont pas vraiment des clients Twitter, mais qui veulent un morceau de l'action. Comme déjà mentionné dans quelques-uns des "pourquoi voulez-vous même faire cela?" sorte de réponses, certains utilisateurs peuvent trouver cela utile. D'un autre côté, si j'ai un bouton dans mon application qui dit "Tweet this!", L'utilisateur s'attendrait à ce que cela fasse apparaître un client Twitter.

Ce qui signifie qu'au lieu de simplement lancer une activité, nous devons filtrer celles qui sont appropriées:

PackageManager pm = getPackageManager();
List<ResolveInfo> 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;
    }
}

Vous auriez besoin d'expérimenter un peu avec les différents fournisseurs, mais si le nom se termine par ".SendTweet", vous êtes assez sûr (c'est le nom de l'activité dans Twidroyd). Vous pouvez également vérifier dans votre débogueur les noms de packages que vous souhaitez utiliser et ajuster la comparaison de chaînes en conséquence (c'est-à-dire que Twidroyd utilise "com.twidroid. *").

Dans cet exemple simple, nous choisissons simplement la première activité de correspondance que nous trouvons. Cela fait apparaître le client Twitter directement, sans que l'utilisateur n'ait à faire de choix. S'il n'y a pas de clients Twitter appropriés, nous revenons au sélecteur d'activité standard:

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

Vous pouvez développer le code et prendre en compte le cas où il existe plusieurs clients Twitter, lorsque vous souhaitez créer votre propre boîte de dialogue de sélection à partir de tous les noms d'activité que vous trouvez.

34

Ces réponses sont toutes trop complexes.

Si vous faites simplement une intention d'URL normale qui concerne Twitter.com, vous obtiendrez cet écran:

enter image description here

qui vous donne la possibilité d'accéder au site Web si aucune application Twitter n'est installée.

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);
17
Speed

Non plus

  • Vous démarrez une activité avec une intention avec l'action Intent.ACTION_SEND et le text/plain Type MIME. Vous aurez toutes les applications qui prennent en charge l'envoi de texte. Cela devrait être n'importe quel client Twitter, ainsi que Gmail, dropbox, etc.
  • Ou, vous essayez de rechercher l'action spécifique de chaque client que vous connaissez, comme "com.Twitter.Android.PostActivity" pour le client officiel . Cela pointera vers ce client, et il est peu probable que ce soit une liste complète.
  • Ou, vous commencez avec le deuxième point, et retombez sur le premier ...
9
rds

Nan. Le type d'intention est quelque chose comme image/png ou application/pdf, c'est-à-dire un type de fichier, et avec createChooser, vous demandez essentiellement quelles applications peuvent ouvrir ce type de fichier.

Maintenant, il n'y a rien de tel qu'un application/Twitter fichier qui peut être ouvert, donc ça ne marchera pas. Je ne connais pas d'autre moyen de réaliser ce que vous voulez non plus.

4
Mirko N.

J'ai utilisé la réponse "billynomates" et j'ai pu utiliser des hashtags en utilisant la fonction "URLEncoder.encode (," UTF-8 ")". Les balises de hachage sont apparues très 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
}
3
echappy

De http://twidroid.com/plugins/

Intention 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)); 
3
Peter