web-dev-qa-db-fra.com

Partager du texte sur Facebook à partir de Android App via ACTION_SEND

J'ai une application Android et elle prend en charge l'envoi de texte via d'autres applications. Elle utilise donc l'intention ACTION_SEND et le champ EXTRA_TEXT. Le sélecteur m'indique toutes les applications pouvant gérer une telle intention. Twitter, email, ... et Facebook, mais lorsque je sélectionne Facebook, le navigateur s'ouvre et affiche la page suivante:

http://m.facebook.com/sharer.php?u=mytext

Il montre mon texte et le bouton de soumission. Mais lorsque j'appuie sur le bouton d'envoi, rien ne se passe. La page se charge à nouveau. Je pense qu'il est peut-être possible d'envoyer des URL uniquement via l'application Facebook. Cela pourrait-il être?

Quelqu'un a-t-il réussi à envoyer du texte via ACTION_SEND via Facebook Android app?

91
Goddchen

Édité: avec la nouvelle version de l'application Facebook officielle pour Android (14 juillet 2011) Ça marche !!!

OLD: Les exemples ci-dessus ne fonctionnent pas si l'utilisateur choisit l'application Facebook à partager, mais ils fonctionnent si l'utilisateur choisit l'application Seesmic pour publier sur Facebook. Je suppose que Seesmic a une meilleure implémentation de l'API Facebook que Facebook!

11
Giulio Prisco

Pour que le partage fonctionne avec l'application facebook, il vous suffit d'avoir au moins un lien:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "Wonderful search engine http://www.google.fr/");
startActivity(Intent.createChooser(intent, "Share with"));

Cela affichera la fenêtre de partage correcte, mais lorsque vous cliquez sur le partage, rien ne se passe (j'ai également essayé avec l'application officielle Twitter, cela ne fonctionne pas).

La seule façon pour moi de faire fonctionner le partage d'applications Facebook est de ne partager qu'un lien sans texte:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "http://www.google.fr/");
startActivity(Intent.createChooser(intent, "Share with"));

Il affichera la fenêtre suivante et le bouton Partager fonctionnera:

facebook share

Apparemment, il prend automatiquement une image et du texte du lien pour remplir le partage.

Si vous souhaitez partager uniquement du texte, vous devrez utiliser l'API facebook: https://github.com/facebook/facebook-Android-sdk

51
ol_v_er

06/2013:

  • Ceci est un bug de Facebook, pas votre code
  • Facebook ne résoudra PAS ce bogue , ils disent qu'il est "de par leur conception" qu'ils ont cassé le Android: https://developers.facebook.com/bugs/33261962681642 =
  • utilisez le SDK ou partagez uniquement l'URL.
  • Astuces: vous pouvez tricher un peu en utilisant le titre de la page Web comme texte pour le message.
45
Loda

Vous devez d’abord interroger l’intention de requête relative à l’option de partage du gestionnaire. Utilisez ensuite le nom du paquet pour filtrer l’intention. Nous n’aurons alors plus qu’une option de partage de l’intention de ce gestionnaire!

Partager via Facebook

Intent shareIntent = new Intent(Android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Android.content.Intent.EXTRA_TEXT, "Content to share");
PackageManager pm = v.getContext().getPackageManager();
List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
for (final ResolveInfo app : activityList) {
    if ((app.activityInfo.name).contains("facebook")) {
        final ActivityInfo activity = app.activityInfo;
        final ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
        shareIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |             Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        shareIntent.setComponent(name);
        v.getContext().startActivity(shareIntent);
        break;
   }
}

Bonus - Partagez via Twitter

Intent shareIntent = new Intent(Android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Android.content.Intent.EXTRA_TEXT, "Content to share");
PackageManager pm = v.getContext().getPackageManager();
List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
for (final ResolveInfo app : activityList) {
    if ("com.Twitter.Android.PostActivity".equals(app.activityInfo.name)) {
        final ActivityInfo activity = app.activityInfo;
        final ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
        shareIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |             Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        shareIntent.setComponent(name);
        v.getContext().startActivity(shareIntent);
        break;
   }
}

Et si vous voulez savoir comment partager via une autre application de partage, trouvez-la là Tép Blog - Partage avancé via Android

28
khaintt

J'ai donc un moyen de contourner le problème, mais cela suppose que vous contrôliez la page que vous partagez ...

Si vous formatez votre EXTRA_TEXT comme suit ...

String myText = "Hey!\nThis is a neat pic!";
String extraText = "http://www.example.com/myPicPage.html?extraText=\n\n" + myText;

... alors sur les applications autres que Facebook, votre texte devrait ressembler à ceci:

http://www.example.com/myPicPage.html?extraText=

Hey!
Ceci est une photo soignée!

Maintenant, si vous mettez à jour votre site Web de telle sorte que les requêtes avec le paramètre de requête extraText renvoient le contenu de extraText dans les métadonnées de la page.

<!-- Make sure to sanitize your inputs! e.g. http://xkcd.com/327/ -->
<meta name="title" content="Hey! this is a neat pic!">

Ensuite, lorsque Facebook échappe à cette URL pour générer la boîte de dialogue, il lit les métadonnées du titre et les intègre dans la boîte de dialogue de partage.

Je réalise que c'est une jolie solution, alors prenez avec un grain de sel ...

11
Joseph Lee

Il semble que l'application Facebook gère cette intention de manière incorrecte. Le moyen le plus fiable semble être d'utiliser l'API Facebook pour Android.

Le SDK est à ce lien: http://github.com/facebook/facebook-Android-sdk

Sous "utilisation", il y a ceci:

Afficher une boîte de dialogue Facebook.

Le SDK prend en charge plusieurs boîtes de dialogue WebView html pour les interactions utilisateur, telles que la création d'une publication murale. Ceci est destiné à fournir une fonctionnalité Facebook rapide sans avoir à implémenter une interface utilisateur native Android et à transmettre les données à facebook directement via les API.

Cela semble être le meilleur moyen de le faire - affichez une boîte de dialogue qui sera postée au mur. Le seul problème est qu'ils doivent peut-être se connecter d'abord

2
HXCaine
Check this out : By this we can check activity results also....
// Open all sharing option for user
                    Intent sharingIntent = new Intent(Android.content.Intent.ACTION_SEND); 
                    sharingIntent.setType("text/plain");                    
                    sharingIntent.putExtra(Android.content.Intent.EXTRA_SUBJECT, ShortDesc+" from "+BusinessName);
                    sharingIntent.putExtra(Android.content.Intent.EXTRA_TEXT, ShortDesc+" "+ShareURL);
                    sharingIntent.putExtra(Intent.EXTRA_TITLE, ShortDesc+" "+ShareURL);
                    startActivityForResult(Intent.createChooser(sharingIntent, "Share via"),1000);
/**
     * Get the result when we share any data to another activity 
     * */
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch(requestCode) {
        case 1000:
            if(resultCode == RESULT_OK)
                Toast.makeText(getApplicationContext(), "Activity 1 returned OK", Toast.LENGTH_LONG).show();
            else
                Toast.makeText(getApplicationContext(), "Activity 1 returned NOT OK", Toast.LENGTH_LONG).show();
            break;
        case 1002:
            if(resultCode == RESULT_OK)
                Toast.makeText(getApplicationContext(), "Activity 2 returned OK", Toast.LENGTH_LONG).show();
            break;
        }// end switch



    }// end onActivityResult
1
Vinod Joshi
ShareDialog shareDialog = new ShareDialog(this);
if(ShareDialog.canShow(ShareLinkContent.class)) {

    ShareLinkContent linkContent = new ShareLinkContent.Builder().setContentTitle(strTitle).setContentDescription(strDescription)
                            .setContentUrl(Uri.parse(strNewsHtmlUrl))
                            .build();
    shareDialog.show(linkContent);

}
1
Ram Bhawan

si vous voulez afficher le texte, mettez # au début du message que vous souhaitez, il sera partagé en tant que hashtag

0
MFQ

Il semble que ce soit un bogue de l'application Facebook qui a été signalé en avril 2011 et qui n'a toujours pas été corrigé par les développeurs Android Facebook.

La seule solution pour le moment consiste à utiliser leur SDK.

0
Joseph Woodward