Android: Comment partager une image avec un texte sur Facebook via une intention?

Je voudrais partager une photo avec la légende pré-remplie de mon application via une intention de partage, sur facebook.

Exemple de code

Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_TEXT, "eample"); intent.putExtra(Intent.EXTRA_TITLE, "example"); intent.putExtra(Intent.EXTRA_SUBJECT, "example"); intent.putExtra(Intent.EXTRA_STREAM, imageUri); Intent openInChooser = new Intent(intent); openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents); startActivity(openInChooser); 

Voici la capture d’écran que je reçois

Le texte n'est pas affiché

Si un type défini à image / * alors une photo est téléchargée sans le texte pré-rempli. Si un jeu de texte / photo ordinaire n’est pas affiché …..

Les dernières versions de Facebook ne vous permettent pas de partager du texte en utilisant des intentions. Vous devez utiliser le SDK Facebook pour le faire – pour simplifier, utilisez Facebook Facebook + Android Simple Facebook ( https://github.com/sromku/android-simple-facebook ). En utilisant la bibliothèque, votre code serait le suivant (extrait du site Simple Facebook):

Publier un stream

Définissez OnPublishListener et appelez pour:

  • publish(Feed, OnPublishListener) sans boîte de dialog.
  • publish(Feed, true, OnPublishListener) avec la boîte de dialog.

Propriétés de base

  • message – Le message de l’utilisateur
  • name – Le nom de l’attachement de lien
  • caption – La légende du lien (apparaît sous le nom du lien)
  • description – La description du lien (apparaît sous la légende du lien)
  • picture – L’URL d’une image jointe à ce post. La photo doit être d’au moins 200px par 200px
  • link – Le lien attaché à ce post

Initialiser le programme d’écoute de rappel:

 OnPublishListener onPublishListener = new OnPublishListener() { @Override public void onComplete(Ssortingng postId) { Log.i(TAG, "Published successfully. The new post id = " + postId); } /* * You can override other methods here: * onThinking(), onFail(Ssortingng reason), onException(Throwable throwable) */ }; 

Construire un stream:

 Feed feed = new Feed.Builder() .setMessage("Clone it out...") .setName("Simple Facebook for Android") .setCaption("Code less, do the same.") .setDescription("The Simple Facebook library project makes the life much easier by coding less code for being able to login, publish feeds and open graph stories, invite friends and more.") .setPicture("http://soffr.miximages.com/android/android_facebook_sdk_logo.png") .setLink("https://github.com/sromku/android-simple-facebook") .build(); 

Publier un stream sans boîte de dialog:

 mSimpleFacebook.publish(feed, onPublishListener); 

Publier le stream avec la boîte de dialog:

 mSimpleFacebook.publish(feed, true, onPublishListener); 

Mise à jour du 14 décembre 2015

selon New Facebook SDK.

Facebook-Android-SDK: 4.6.0

C’est très simple.
1. créer un fournisseur dans Android.manifest.xml

  

2. Créez votre intention de partage avec des données.

 ShareLinkContent shareLinkContent = new ShareLinkContent.Builder() .setContentTitle("Your Title") .setContentDescription("Your Description") .setContentUrl(Uri.parse("URL[will open website or app]")) .setImageUrl(Uri.parse("image or logo [if playstore or app store url then no need of this image url]")) .build(); 

3. Afficher la boîte de dialog Partager

 ShareDialog.show(ShowNavigationActivity.this,shareLinkContent); 

C’est tout.

Essayez avec ceci

 void privé initShareIntent (type de chaîne, chaîne _text) {
      Fichier filePath = getFileStreamPath ("shareimage.jpg");  // facultatif // stockage interne
      Intention shareIntent = new Intent ();
      shareIntent.setAction (Intent.ACTION_SEND);
      shareIntent.putExtra (Intent.EXTRA_TEXT, _text);
      shareIntent.putExtra (Intent.EXTRA_STREAM, Uri.fromFile (nouveau fichier (filePath)));  // optionnel // utilise ceci quand tu veux envoyer une image
      shareIntent.setType ("image / jpeg");
      shareIntent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION);
      startActivity (Intent.createChooser (shareIntent, "send"));
 }

À partir de 2017, Facebook ne permet pas le partage d’une image + texte, directement depuis votre application.

solution de contournement

Facebook récupérera cependant une URL pour les données de titre et d’image et les utilisera dans un post de partage.

Pour contourner ce problème, vous pouvez créer une application à une seule page * qui charge dynamicment le texte / l’image que vous souhaitez partager (spécifié dans l’URL) et vous pouvez partager cette URL par Facebook.

Remarques:

  • Assurez-vous que votre application à une seule page génère une page statique dont le titre, les balises méta graphiques ouvertes et les images définies avant le raclage des pages de Facebook sont ouvertes. Si ces balises de pages Web sont modifiées dynamicment via Javascript, Facebook ne pourra pas utiliser ces valeurs et les utiliser dans son post de partage.
  • Utilisez les balises de propriété méta open graph og: image: height et og: image: width pour permettre à Facebook de créer un aperçu de l’image dans son post de partage

Pas

0) append la dernière bibliothèque facebook-sdk à votre fichier build.gradle

 comstack group: 'com.facebook.android', name: 'facebook-android-sdk', version: '4.25.0' 

1) Dans votre fichier AndroidManifest.xml, ajoutez une balise meta-data dans votre section :

  ...  ...  

Ajoutez une chaîne facebook_app_id (avec votre identifiant APP) à votre fichier ssortingngs.xml:

 12341234 

YOURFBAPPID est votre numéro d’identification d’application Facebook disponible à l’ adresse https://developers.facebook.com/apps/

2) append également une dehors de votre dans AndroidManifest.xml

  

3) Créez un object ShareLinkContent en utilisant leur générateur:

 ShareLinkContent fbShare = new ShareLinkContent.Builder() .setContentUrl(Uri.parse("http://yourdomain.com/your-title-here/someimagefilename")) .build(); 

4) Partagez-le à partir de votre fragment (ou activité, etc.):

 ShareDialog.show(getActivity(), fbShare); 

Facebook Docs

https://developers.facebook.com/docs/android/getting-started

FB ne vous permet plus de pré-remplir le message de partage.

Pour contourner cela, vous devrez utiliser un SDK pour publier via une requête Graph. Pour cela, vous aurez besoin de l’autorisation publish_actions . Depuis le mois dernier, vous devez soumettre votre application à un processus de révision pour accéder à publish_actions . Ce qui échouerait si votre application pré-remplit les textes de partage. Croyez-moi – j’ai eu le Chutzppah à essayer.

Il semble donc que nous devions nous conformer.

Btw dans iOS, vous pouvez toujours pré-remplir les textes en utilisant le FB sdk. Qui sait pour combien de temps.

Sans utiliser Facebook, nous ne pouvons pas partager l’image et le texte simultanément sur Facebook. Pour résoudre ce problème, j’ai créé un bitmap d’image et de texte, je partage ce bitmap sur facebook et cela fonctionne parfaitement.

Vous pouvez télécharger le code source à partir d’ici ( Partager l’image et le texte sur facebook en utilisant intent dans Android )

Voici le code:

MainActivity.java

 package com.shareimage; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class MainActivity extends AppCompatActivity implements View.OnClickListener { EditText et_text; ImageView iv_image; TextView tv_share,tv_text; RelativeLayout rl_main; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init(){ et_text = (EditText)findViewById(R.id.et_text); iv_image = (ImageView)findViewById(R.id.iv_image); tv_share = (TextView)findViewById(R.id.tv_share); rl_main = (RelativeLayout)findViewById(R.id.rl_main); tv_text= (TextView) findViewById(R.id.tv_text); File dir = new File("/sdcard/Testing/"); try { if (dir.mkdir()) { System.out.println("Directory created"); } else { System.out.println("Directory is not created"); } } catch (Exception e) { e.printStackTrace(); } tv_share.setOnClickListener(this); et_text.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { tv_text.setText(et_text.getText().toSsortingng()); } }); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.tv_share: Bitmap bitmap1 = loadBitmapFromView(rl_main, rl_main.getWidth(), rl_main.getHeight()); saveBitmap(bitmap1); Ssortingng str_screenshot = "/sdcard/Testing/"+"testing" + ".jpg"; fn_share(str_screenshot); break; } } public void saveBitmap(Bitmap bitmap) { File imagePath = new File("/sdcard/Testing/"+"testing" + ".jpg"); FileOutputStream fos; try { fos = new FileOutputStream(imagePath); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); Log.e("ImageSave", "Saveimage"); } catch (FileNotFoundException e) { Log.e("GREC", e.getMessage(), e); } catch (IOException e) { Log.e("GREC", e.getMessage(), e); } } public static Bitmap loadBitmapFromView(View v, int width, int height) { Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); v.draw(c); return b; } public void fn_share(Ssortingng path) { File file = new File("/mnt/" + path); Bitmap bmp = BitmapFactory.decodeFile(file.getAbsolutePath()); Uri uri = Uri.fromFile(file); Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_STREAM, uri); startActivity(Intent.createChooser(intent, "Share Image")); } } 

Ajoutez ces lignes à votre code suivant

 shareCaptionIntent.putExtra(Intent.EXTRA_TITLE, "my awesome caption in the EXTRA_TITLE field"); 
 Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND); shareIntent.setType("image/*"); shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, (Ssortingng) v.getTag(R.ssortingng.app_name)); shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri); // put your image URI PackageManager pm = v.getContext().getPackageManager(); List 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; } }