62 votes

Application Android pour 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 ne montre que mes applications de messagerie.

Je vous remercie,

Wouter

83voto

Jonik Points 18905

Je poste ceci car je n'ai pas vu une solution mais qui fait exactement ce que je veux.

Cela est surtout le lance le Twitter officiel de l'app, ou, si cela n'est pas installé, soit une action Complète à l'aide..." dialogue (comme ceci) ou directement lance un navigateur web.

Pour la liste des différents paramètres dans le twitter.com URL, voir le Tweet Bouton docs. N'oubliez pas de les encoder les valeurs de paramètre. (Ce code est spécifiquement pour tweeter une URL; si vous ne voulez pas cela, il suffit de laisser l' url param.)

// 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 de l'URL est plus propre si vous avez un petit utilitaire comme ça 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 Nexus 7 de l'appareil, ce directement ouvre le Twitter officiel de l'app:

enter image description here

Si Twitter officiel de l'app est pas installé et que l'utilisateur choisit de Chrome ou il s'ouvre automatiquement (comme la seule application qui permet de traiter l'intention):

enter image description here

40voto

Derzu Points 2463

Les solutions posté avant, vous permettent de publier directement sur votre première application twitter. Pour afficher une liste de twitters application (s'il y a plus d'un), vous pouvez personnaliser votre Intention.createChooser pour afficher uniquement les Itents vous le souhaitez.

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

Regardez cet exemple où j'ai créer un sélecteur qui ne montre que mes e-mails apps. Dans mon cas, apparaît trois mails Gmail, YahooMail et de Messagerie 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 ce genre: action("twi", "/sdcard/dcim/Camera/photo.jpg");

Ceci a été basé sur le post: filtrage Personnalisé d'intention sélecteur de fonction sur la installé nom du package Android

34voto

Cette question est un peu plus âgés, mais depuis que j'ai juste rencontré un problème similaire, il peut également être d'intérêt pour les autres. Tout d'abord, comme mentionné par Pierre, 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 connu un type de contenu, voir ici. Maintenant, lorsque vous essayez de démarrer une activité avec cette intention, il indiquera toutes sortes d'applications qui ne sont pas vraiment les clients Twitter, mais que vous voulez un morceau de l'action. Comme déjà mentionné dans un couple de la "pourquoi tu veux faire ça?", sorte de réponses, certains utilisateurs peuvent trouver utile. D'autre part, si j'ai un bouton dans mon application qui dit "Tweet!" l'utilisateur pourrait très bien s'attendre à ce amener un client Twitter.

Ce qui signifie qu'au lieu de simplement le lancement d'une activité, nous avons besoin de filtrer ceux 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 aurez besoin d'expérimenter un peu avec les différents fournisseurs, mais si le nom se termine en ".SendTweet" vous êtes assez sûr (c'est le nom de l'activité dans Twidroyd). Vous pouvez également vérifier votre débogueur pour les noms de package que vous souhaitez utiliser et ajuster la comparaison de chaînes de caractères en conséquence (c'est à dire Twidroyd utilise com.twidroid.*").

Dans cet exemple simple nous faisons le choix de la première activité d'appariement que nous trouvons. Cela amène le client Twitter directement, sans avoir à faire aucun choix. Si il n'ya pas de bonne les clients Twitter, nous retournons à la norme sélecteur d'activité:

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

Vous pourriez développer du code et de prendre en compte le cas où il y a plus d'un client Twitter, lorsque vous souhaiterez peut-être créer votre propre dialogue sélecteur de toutes les activité de les noms vous trouvez.

23voto

CommonsWare Points 402670

Il est tout à fait possible de vos utilisateurs ne pourront jamais, maintenant et pour toujours, ne veulent poster sur Twitter.

Je pense qu'il est plus probable que vos utilisateurs veulent envoyer des informations à des gens, et Twitter est une possibilité. Mais, ils pourraient également possible d'envoyer un message texte ou un e-mail, etc.

Dans ce cas, utilisez ACTION_SEND, comme décrit ici. Twidroid, notamment, soutient ACTION_SEND, de sorte qu'il apparaîtra dans la liste des mécanismes de livraison.

17voto

billynomates Points 678

Ces réponses sont trop complexes.

Si vous ne faites que l’intention d’une URL normale vers Twitter.com, vous obtiendrez cet écran:

entrez la description de l'image ici

ce qui vous donne la possibilité d'aller sur le site si vous n'avez pas d'applications Twitter installées.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X