web-dev-qa-db-fra.com

Intention de partage Android et Facebook

Je développe une application Android et je suis intéressé de savoir comment vous pouvez mettre à jour le statut de l'utilisateur de l'application depuis l'application à l'aide des intentions de partage d'Android.

Après avoir parcouru le kit de développement logiciel de Facebook, il semble que cela soit assez facile à faire, mais je tiens à permettre à l'utilisateur de le faire via la fenêtre contextuelle de partage d'intention habituelle? vu ici: 

pop up

J'ai essayé le code d'intention de partage habituel, mais cela ne semble plus fonctionner 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: Après avoir creusé davantage, il semble que ce soit un bug avec l'application de Facebook qui n'a pas encore été résolu! ( facebook bug ) Pour le moment, il semble que je vais devoir supporter le négatif "Le partage ne marche pas !!!" avis. Cordialement Facebook: * (

78
Joseph Woodward

L'application Facebook ne gère pas les champs EXTRA_SUBJECT et EXTRA_TEXT.

Voici un lien de bogue: https://developers.facebook.com/bugs/332619626816423

Merci @ Billynomates:

Le problème, c’est que si vous mettez une URL dans le champ EXTRA_TEXT, elle fait travail. C'est comme s'ils supprimaient intentionnellement n'importe quel texte.

88
Göksel Güren

Apparemment, Facebook ne permet plus (à partir de 2014) de personnaliser l'écran de partage, peu importe si vous ouvrez simplement l'URL sharer.php ou utilisez les intentions d'Android de manière plus spécialisée. Voir par exemple ces réponses:

Quoi qu'il en soit, avec Plain Intents, you peut partagez toujours une URL, mais pas le texte par défaut avec elle, comme billynomates commented . (En outre, si vous n’avez pas d’URL à partager, lancer l’application Facebook avec une boîte de dialogue vide "Ecrire un message" (mise à jour du statut, par exemple) est tout aussi simple: utilisez le code ci-dessous, mais laissez EXTRA_TEXT.

Voici la meilleure solution que j'ai trouvée et qui utilise pas _ implique l'utilisation d'un kit de développement logiciel (SDK) Facebook. 

Ce code ouvre directement l'application officielle Facebook si elle est installée, sinon revient à ouvrir sharer.php dans un navigateur. (La plupart des autres solutions de cette question apportent un énorme "Action complète en utilisant ..." dialogue qui n'est pas optimal du tout!) 

String urlToShare = "https://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);

(En ce qui concerne le nom du paquet com.facebook.katana , voir le commentaire de MatheusJardimB .)

Le résultat ressemble à ceci sur mon Nexus 7 (Android 4.4) avec l'application Facebook installée:

enter image description here

106
Jonik

La manière habituelle

La manière habituelle de créer ce que vous demandez est simplement de procéder comme 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.

La manière alternative (peut-être)

Le problème potentiel avec cette opération est que vous autorisez également l'envoi du message par e-mail, SMS, etc. -mail en utilisant Gmail. J'imagine que vous pourriez essayer de le changer pour que cela fonctionne uniquement avec Facebook.

Je ne sais pas comment cela répond à des erreurs ou à des exceptions (j'imagine que cela se produirait si Facebook n'était pas installé).

    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();
    }
15
Michell Bak

Voici ce que j'ai fait (pour le texte). Dans le code, je copie le texte nécessaire au presse-papier. La première fois qu’une personne essaie d’utiliser le bouton d’intention de partage, je lance une notification qui explique si elle souhaite partager sur Facebook, elle doit cliquer sur "Facebook", puis appuyer longuement pour la coller (ceci afin de lui faire prendre conscience que Facebook a brisé le système d'intention Android). Ensuite, les informations pertinentes sont sur le terrain. Je pourrais également inclure un lien vers ce message afin que les utilisateurs puissent également se plaindre ...

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 une méthode pour traiter avec les versions précédentes

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);
}
4
easycheese

Dans Lollipop (21), vous pouvez utiliser Intent.EXTRA_REPLACEMENT_EXTRAS pour remplacer spécifiquement l'intention de Facebook (et spécifier un lien uniquement)

https://developer.Android.com/reference/Android/content/Intent.html#EXTRA_REPLACEMENT_EXTRAS

private void doShareLink(String text, String link) {
  Intent shareIntent = new Intent(Intent.ACTION_SEND);
  shareIntent.setType("text/plain");
  Intent chooserIntent = Intent.createChooser(shareIntent, getString(R.string.share_via));

  // for 21+, we can use EXTRA_REPLACEMENT_EXTRAS to support the specific case of Facebook
  // (only supports a link)
  // >=21: facebook=link, other=text+link
  // <=20: all=link
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
    shareIntent.putExtra(Intent.EXTRA_TEXT, text + " " + link);
    Bundle facebookBundle = new Bundle();
    facebookBundle.putString(Intent.EXTRA_TEXT, link);
    Bundle replacement = new Bundle();
    replacement.putBundle("com.facebook.katana", facebookBundle);
    chooserIntent.putExtra(Intent.EXTRA_REPLACEMENT_EXTRAS, replacement);
  } else {
    shareIntent.putExtra(Intent.EXTRA_TEXT, link);
  }

  chooserIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(chooserIntent);
}
4
Simon Reggiani

Cette solution fonctionne également. Si aucun Facebook n'est installé, il exécute simplement la boîte de dialogue de partage normale. Si tel est le cas et que vous n'êtes pas connecté, l'écran de connexion s'affiche. Si vous êtes connecté, la boîte de dialogue de partage s'ouvre et vous placez l'URL de partage de l'Intent Extra.

Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, "Share url");
intent.setType("text/plain");

List<ResolveInfo> matches = getMainFragmentActivity().getPackageManager().queryIntentActivities(intent, 0);
for (ResolveInfo info : matches) {
    if (info.activityInfo.packageName.toLowerCase().contains("facebook")) {
        intent.setPackage(info.activityInfo.packageName);
    }
}

startActivity(intent);
1
Tommy

On dirait que dans la version 4.0.0 de Facebook, beaucoup de choses ont changé. Ceci est mon code qui fonctionne bien. J'espère que ça vous aide.

    /**
     * Facebook does not support sharing content without using their SDK however
     * it is possible to share URL
     *
     * @param content
     * @param url
     */
    private void shareOnFacebook(String content, String url)
    {
        try
        {
            // TODO: This part does not work properly based on my test
            Intent fbIntent = new Intent(Intent.ACTION_SEND);
            fbIntent.setType("text/plain");
            fbIntent.putExtra(Intent.EXTRA_TEXT, content);
            fbIntent.putExtra(Intent.EXTRA_STREAM, url);
            fbIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            fbIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                    | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
            fbIntent.setComponent(new ComponentName("com.facebook.katana",
                    "com.facebook.composer.shareintent.ImplicitShareIntentHandler"));

            startActivity(fbIntent);
            return;
        }
        catch (Exception e)
        {
            // User doesn't have Facebook app installed. Try sharing through browser.
        }

        // If we failed (not native FB app installed), try share through SEND
        String sharerUrl = "https://www.facebook.com/sharer/sharer.php?u=" + url;
        SupportUtils.doShowUri(this.getActivity(), sharerUrl);
    }
1
Hesam

Voici quelque chose que j'ai fait qui ouvre Facebook App avec Link 

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);
0
Nayanesh Gupte

Facebook ne permet pas de partager des données en texte brut avec Intent.EXTRA_TEXT mais vous pouvez partager du texte + un lien avec facebook messanger en utilisant ceci, cela fonctionne bien pour moi.

            Intent sendIntent = new Intent();
            sendIntent.setAction(Intent.ACTION_SEND);
            sendIntent.putExtra(Intent.EXTRA_TEXT, text+url link);
            sendIntent.setType("text/plain");
            sendIntent.setPackage("com.facebook.orca");
            startActivity(sendIntent);
0
kiran boghra
    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");    
    shareIntent.putExtra("com.facebook.platform.extra.APPLICATION_ID", activity.getString(R.string.app_id));                        
    activity.startActivity(Intent.createChooser(shareIntent, activity.getString(R.string.share_title)));
}

Le moyen le plus simple que j'ai pu trouver pour transmettre un message de mon application à Facebook était de le copier par programme dans le presse-papiers et d'alerter l'utilisateur qu'il avait l'option de coller. Cela évite à l'utilisateur de le faire manuellement; mon application ne colle pas mais l'utilisateur peut le faire.

...
if (app.equals("facebook")) {
    // overcome fb 'putExtra' constraint;
    // copy message to clipboard for user to paste into fb.
    ClipboardManager cb = (ClipboardManager) 
            getSystemService(Context.CLIPBOARD_SERVICE);
    ClipData clip = ClipData.newPlainText("post", msg);
    cb.setPrimaryClip(clip);

    // tell the to PASTE POST with option to stop showing this dialogue
    showDialog(this, getString(R.string.facebook_post));
}
startActivity(appIntent);
...
0
Ned