89 votes

Android et Facebook partager intention

Je suis le développement d'une application Android et je suis intéressé de savoir comment vous pouvez mettre à jour l'application statut de l'utilisateur à partir de l'application Android de la part de ses intentions.

Après avoir regardé à travers Facebook du SDK, il semble que ce est assez facile à faire, mais je suis désireux de permettre à l'utilisateur de le faire via le Partage régulier de l'Intention de fenêtre pop-up? vu ici:

pop up

J'ai essayé l'habitude de partager l'intention de code, mais cela n'apparaît plus à travailler pour Facebook.

public void invokeShare(Activity activity, String quote, String credit) {
    Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
    shareIntent.setType("text/plain");
    shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, activity.getString(R.string.share_subject));
    shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Example text");    

    activity.startActivity(Intent.createChooser(shareIntent, activity.getString(R.string.share_title)));
}

Mise à JOUR: Ayant fait plus de creuser, mais il semble que c'est un bug avec Facebook app qui n'est pas encore résolu! (facebook bug) Pour le moment on dirait que je vais juste avoir à mettre en place avec le négatif "Partage ne fonctionne pas!!!" les examens. Cheers Facebook :*(

117voto

Jonik Points 18905

Apparemment, Facebook n'est plus (à partir de 2014) vous permet de personnaliser le partage d'écran, peu importe si vous êtes juste d'ouverture sharer.php URL ou en utilisant Android intentions sont plus spécialisées façons. Voir par exemple la réponse à ces questions:

De toute façon, à l'aide de la plaine Intentions, vous pouvez toujours partager une URL, mais pas n'importe quel texte par défaut avec elle, comme billynomates commenté. (Aussi, si vous n'avez pas d'URL à partager, vient de lancer Facebook app avec vide "Ecrire un article" (c'est à dire mise à jour de statut) dialogue est tout aussi facile; utiliser le code ci-dessous mais laissez EXTRA_TEXT.)

Voici la meilleure solution que j'ai trouvé qui ne pas impliquer l'utilisation de tout Facebook Sdk.

Ce code ouvre la officielle Facebook app directement si il est installé, et sinon retombe à l'ouverture sharer.php dans un navigateur. (La plupart des autres solutions à cette question amener un énorme "Complète l'action à l'aide de... la boîte de dialogue" qui n'est pas optimal du tout!)

String urlToShare = "http://stackoverflow.com/questions/7545254";
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
// intent.putExtra(Intent.EXTRA_SUBJECT, "Foo bar"); // NB: has no effect!
intent.putExtra(Intent.EXTRA_TEXT, urlToShare);

// See if official Facebook app is found
boolean facebookAppFound = false;
List<ResolveInfo> matches = getPackageManager().queryIntentActivities(intent, 0);
for (ResolveInfo info : matches) {
    if (info.activityInfo.packageName.toLowerCase().startsWith("com.facebook.katana")) {
        intent.setPackage(info.activityInfo.packageName);
        facebookAppFound = true;
        break;
    }
}

// As fallback, launch sharer.php in a browser
if (!facebookAppFound) {
    String sharerUrl = "https://www.facebook.com/sharer/sharer.php?u=" + urlToShare;
    intent = new Intent(Intent.ACTION_VIEW, Uri.parse(sharerUrl));
}

startActivity(intent);

(Concernant l' com.facebook.katana nom de package, voir MatheusJardimB commentaire.)

Le résultat ressemble à ceci sur ma Nexus 7 (Android 4.4) avec Facebook app installé:

enter image description here

97voto

Göksel Güren Points 850

Le Facebook de l'application ne gère pas le EXTRA_SUBJECT ou EXTRA_TEXT champs.

Voici bug lien: https://developers.facebook.com/bugs/332619626816423

Merci @billynomates:

La chose est, si vous mettez une URL dans l' EXTRA_TEXT domaine, il n' travail. C'est comme ils sont intentionnellement décapage de tout texte.

17voto

Michell Bak Points 6312

La manière habituelle

La façon habituelle de créer ce que vous demandez, c'est simplement de faire ce qui suit:

    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_TEXT, "The status update text");
    startActivity(Intent.createChooser(intent, "Dialog title text"));

Cela fonctionne sans aucun problème pour moi.

L'autre façon (peut-être)

Le potentiel de problème avec cela, c'est que vous êtes également en permettant, le message sera envoyé par e-mail, SMS, etc. Le code suivant est quelque chose que je suis en utilisant une application, qui permet à l'utilisateur de m'envoyer un e-mail à l'aide de Gmail. Je devine que vous pourriez essayer de le modifier pour le faire fonctionner avec Facebook.

Je ne suis pas sûr de la façon dont elle répond à des erreurs ou à des exceptions (je devine qui pourrait se produire si Facebook n'est pas installé), alors vous pourriez avoir à le tester un peu.

    try {
        Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
        String[] recipients = new String[]{"e-mail address"};
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, recipients);
        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "E-mail subject");
        emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "E-mail text");
        emailIntent.setType("plain/text"); // This is incorrect MIME, but Gmail is one of the only apps that responds to it - this might need to be replaced with text/plain for Facebook
        final PackageManager pm = getPackageManager();
        final List<ResolveInfo> matches = pm.queryIntentActivities(emailIntent, 0);
        ResolveInfo best = null;
        for (final ResolveInfo info : matches)
            if (info.activityInfo.packageName.endsWith(".gm") ||
                    info.activityInfo.name.toLowerCase().contains("gmail")) best = info;
                if (best != null)
                    emailIntent.setClassName(best.activityInfo.packageName, best.activityInfo.name);
                startActivity(emailIntent);
    } catch (Exception e) {
        Toast.makeText(this, "Application not found", Toast.LENGTH_SHORT).show();
    }

4voto

easycheese Points 1523

Voici ce que j'ai fait (pour le texte). Dans le code, je copie tout ce texte est nécessaire dans le presse-papiers. La première fois qu'une personne essaie d'utiliser la part de l'intention de bouton, j'ai une fenêtre de notification qui explique si elles souhaitent partager de facebook, ils ont besoin de cliquer sur 'Facebook', puis appuyez longtemps pour coller (c'est de leur faire prendre conscience que Facebook a BRISÉ le android intention du système). Ensuite, les informations pertinentes dans le domaine. Je pourrais aussi inclure un lien vers ce post afin que les utilisateurs peuvent se plaindre de trop...

private void setClipboardText(String text) { // TODO
    int sdk = android.os.Build.VERSION.SDK_INT;
    if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
        android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        clipboard.setText(text);
    } else {
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
        android.content.ClipData clip = android.content.ClipData.newPlainText("text label",text);
        clipboard.setPrimaryClip(clip);
    }
}

Ci-dessous est une méthode pour traiter w/versions antérieures

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_item_share:
        Intent shareIntent = new Intent(Intent.ACTION_SEND);
        shareIntent.setType("text/plain");
        shareIntent.putExtra(Intent.EXTRA_TEXT, "text here");

        ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); //TODO
         ClipData clip = ClipData.newPlainText("label", "text here");
         clipboard.setPrimaryClip(clip);

        setShareIntent(shareIntent); 

        break;
    }
        return super.onOptionsItemSelected(item);
}

0voto

NayAnesh Gupte Points 451

Voici quelque chose que j'ai fait qui s'ouvrent Facebook App avec Lien

shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setComponent(new ComponentName("com.facebook.katana",
                    "com.facebook.katana.activity.composer.ImplicitShareIntentHandler"));

shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT,  videoUrl);

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