web-dev-qa-db-fra.com

Partage d'images et de texte avec Facebook sur Android

Facebook, pourquoi ne prenez-vous pas d'images et de texte en partage Intention?

enter image description here

J'essaie d'utiliser le partage standard Android pour partager une image et du texte. Ma part Intention est définie correctement, j'ai l'image et la partie finale du contrat. Mon code, laissez-moi vous le montrer:

public void doShare() {
    File image = getShareFile();
    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.setType("*/*");
    shareIntent.putExtra(Intent.EXTRA_SUBJECT, resultObject.getShareSubject());
    shareIntent.putExtra(Intent.EXTRA_TEXT, resultObject.getShareText());
    shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(image));
    shareActionProvider.setShareIntent(shareIntent);
}

Facebook apparaît dans la liste des applications qui vont gérer mon intention, mais ça se trouve !!! Lorsque vous cliquez sur Facebook pour faire un partage, vous dites:

Veuillez joindre uniquement des photos ou une seule vidéo.

Pourquoi Facebook, pourquoi? Pourquoi apparaissez-vous comme une application capable de gérer mon intention, puis donnez-moi l'air stupide à mes utilisateurs en ne gérant pas l'intention? Vous avez promis Facebook.

J'ai vu beaucoup de discussions à ce sujet sur tout ce site et sur le Web. Quelqu'un at-il obtenu cela pour fonctionner sans avoir à utiliser leur API?

34
Christopher Perry

Ceci est ma solution de travail pour partager une image sur Facebook via intentionnel. Malheureusement, Facebook n'accepte pas EXTRA_TEXT et ne peut donc que partager l'image. Il fonctionne également avec d’autres applications et avec la plupart d’entre elles peut également ajouter une légende de texte.

    /**
     * Show share dialog
     * @param file image to share
     * @param text text to add for sharing
     */
    private void shareImageAndTextResultIntent(File file, String text) {
        // share intent
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_TEXT, text);
        shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
        shareIntent.setType("image/*");
        shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        startActivity(Intent.createChooser(shareIntent, "send"));
    }

Si vous souhaitez partager une image avec une légende, vous devez utiliser le kit de développement logiciel (SDK) de Facebook.

2
Sandak

Pourquoi? Parce qu'ils sont Facebook et peuvent se permettre de tels bogues. Ainsi, ils s'attendent à ce que seules les images saisies soient "image /". Si le type est "text/plain", une adresse URL devrait alors être contenue dans le message. N'utilisez pas .setType ("/ *"); Sinon, utilisez leur SDK. Mais dans ce cas, vous sacrifierez la simplicité et la flexibilité de votre application.

2
Simon

Je ne sais pas s'il y a vraiment une intention de partager avec Facebook, mais ici, vérifiez ce lien pour Twitter. Le message ainsi que les réponses semblent constituer un message bien écrit et détaillé. 

Application Android sur Twitter

1
tash

Solution aux problèmes soulignés suivants.

Please attach only photos or a single video.

Facebook isn't in the Share option Dialog

even if Facebook wall appears, then it won't let you open your image on the front page.

Share an image on Facebook without using Facebook SDK

J'ai eu de la chance après trois jours de recherches constantes. Désolé, la réponse risque d'être longue car je n'ai trouvé aucune solution sur StackOverflow qui pourrait partager une image sur Facebook sans utiliser le SDK de Facebook.

Voici la solution complète et parfaite:

Bitmap bitmap = viewToBitmap(load your image OR layout background for your imageView);
shareImage(bitmap, "com.facebook.katana");

Le premier paramètre est l'imageView/layout pour les images chargées dans le bitmap. Le deuxième paramètre est le nom du paquet de facebook. 

Codez ensuite la méthode suivante comme indiqué.

public void shareImage(Bitmap bitmap, String packageName) {
        try {
            File file = new File(this.getExternalCacheDir(), "temp.png");
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 95, fileOutputStream);
            fileOutputStream.flush();
            fileOutputStream.close();
            file.setReadable(true, false);
            final Intent intent = new Intent(Android.content.Intent.ACTION_SEND);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
            intent.setType("image/*");
            intent.setPackage(packageName);
            startActivity(Intent.createChooser(intent, "Share image on facebook"));
        } catch (Exception e) {
            Log.e(TAG, e.toString());
            Toast.makeText(this, "Error while sharing Image on Facebook", Toast.LENGTH_SHORT).show();
        }
    }

Voici mes captures d'écran de l'application: 

1 . "Quote book App" est en train de charger une image avec une citation. 

2 . Cliquez sur le bouton Partager et cliquez sur Facebook dans la boîte de dialogue. 

3 . La boîte de dialogue des options de partage Facebook apparaît.

4 . Image chargée sur la page d'accueil Facebook. 

5 . Enfin, l'image est partagée sur Facebook et la méthode fonctionne correctement, comme prévu.

PS: Vous pouvez vérifier cette fonctionnalité dans mon application, Voici le lien pour la télécharger à partir de Google Play Store. 

0
yahme3

Il n’existe qu’une solution pour créer le bitmap de texte et d’image à l’aide de canvas et le partager sur Facebook. ( Téléchargez le code source ici )

Voici mon code:

activity_main

 <RelativeLayout Android:layout_width="match_parent"
 Android:layout_height="match_parent"
 Android:background="#ffffff"
xmlns:Android="http://schemas.Android.com/apk/res/Android">

<EditText
    Android:id="@+id/et_text"
    Android:layout_width="match_parent"
    Android:textSize="15dp"
    Android:layout_height="45dp"
    Android:layout_marginTop="10dp"
    Android:background="@drawable/edittext_drawable"
    Android:hint="Enter your text"
    Android:layout_marginLeft="10dp"
    Android:layout_marginRight="10dp"
    Android:paddingRight="10dp"
    Android:inputType="text"
    Android:imeOptions="actionDone"
    Android:paddingLeft="10dp"
    Android:singleLine="true"
    Android:textColorHint="#979797" />


<RelativeLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:id="@+id/rl_main"
    Android:background="#ffffff"
    Android:layout_below="@+id/et_text"
    Android:layout_above="@+id/tv_share">


    <ImageView
        Android:layout_width="match_parent"
        Android:layout_height="250dp"
        Android:src="@drawable/index"
        Android:scaleType="fitXY"
        Android:id="@+id/iv_image"
        Android:layout_marginTop="10dp"
        />

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:textSize="15dp"
        Android:id="@+id/tv_text"
        Android:layout_below="@+id/iv_image"
        Android:layout_margin="10dp"
        Android:textColor="#000000"
        Android:maxLines="5"
        />

</RelativeLayout>



<TextView
    Android:id="@+id/tv_share"
    Android:layout_width="match_parent"
    Android:layout_height="50dp"
    Android:background="#F38D0A"
    Android:gravity="center"
    Android:padding="10dp"
    Android:layout_margin="10dp"
    Android:text="Share"
    Android:textColor="#ffffff"
    Android:textSize="15dp"
    Android:layout_alignParentBottom="true"/>

</RelativeLayout>

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().toString());

        }
    });


}




@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);
            String 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(String 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"));


}
}
0
Deepshikha Puri