web-dev-qa-db-fra.com

Android publier une photo sur le mur Facebook

J'essaye de poster une photo sur mon mur sur Facebook. J'ai réussi à me connecter et à poster du texte sur le mur. Cependant, lorsque j'essaie de poster la photo, rien ne se passe.

J'utilise le Android Facebook SDK .

Voici ce que j'ai jusqu'à présent:

    Bundle params = new Bundle();
    params.putString("method", "photos.upload");

    Toast.makeText(FacebookPoster.this, "" + getIntent().getExtras().getByteArray("data").length, Toast.LENGTH_SHORT).show();

    params.putByteArray("picture", getIntent().getExtras().getByteArray("data"));

    AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook);
    mAsyncRunner.request(null, params, "POST", new SampleUploadListener(), null);

Le Toast indique 8733, ce qui signifie que le tableau d'octets n'est pas vide

NB Logcat a émis quelques avertissements (et non des erreurs):

03-02 14:19:29.554: WARN/Bundle(1891): Attempt to cast generated internal exception:
03-02 14:19:29.554: WARN/Bundle(1891): Java.lang.ClassCastException: Java.lang.String
03-02 14:19:29.554: WARN/Bundle(1891):     at Android.os.Bundle.getByteArray(Bundle.Java:1305)
03-02 14:19:29.554: WARN/Bundle(1891):     at com.facebook.Android.Util.openUrl(Util.Java:155)
03-02 14:19:29.554: WARN/Bundle(1891):     at com.facebook.Android.Facebook.request(Facebook.Java:559)
03-02 14:19:29.554: WARN/Bundle(1891):     at com.facebook.Android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.Java:253)
03-02 14:19:29.584: WARN/Bundle(1891): Key method expected byte[] but value was a Java.lang.String.  The default value <null> was returned.

(Affiche plusieurs fois sous l'autre.)

Qu'est-ce que je fais mal?


RESOLU Voici ce que j'ai fait pour que cela fonctionne:

facebook.authorize(this, new String[] { "publish_stream" },
        new DialogListener() {

    @Override
    public void onFacebookError(FacebookError e) {
    // TODO Auto-generated method stub
    }

    @Override
    public void onError(DialogError dialogError) {
    // TODO Auto-generated method stub
    }

    @Override
    public void onComplete(Bundle values) {
        postToWall(values.getString(Facebook.TOKEN));                                              
    }

    @Override
    public void onCancel() {
    // TODO Auto-generated method stub
    }
});

Et la méthode d'assistance:

private void postToWall(String accessToken) {       
    Bundle params = new Bundle();

    params.putString(Facebook.TOKEN, accessToken);

    // The byte array is the data of a picture.
    params.putByteArray("picture", getIntent().getExtras().getByteArray("data"));

    try {
        facebook.request("me/photos", params, "POST");

    } catch (FileNotFoundException fileNotFoundException) {
        makeToast(fileNotFoundException.getMessage());
    } catch (MalformedURLException malformedURLException) {
        makeToast(malformedURLException.getMessage());
    } catch (IOException ioException) {
        makeToast(ioException.getMessage());
    }
}
20
whirlwin

la première chose à faire, c’est que vous n’utilisez pas l’API graphique pour télécharger les images ... en utilisant l’ancienne API Reste ... essayez d’utiliser l’API Graphique, c’est simple ... 

Utilisez le code suivant:

Bundle param = new Bundle();
param.putString("message", "picture caption");
param.putByteArray("picture", ImageBytes);
mAsyncRunner.request("me/photos", param, "POST", new SampleUploadListener());

Selon le message d'erreur, il semblerait que cela produise des erreurs dans l'obtention des octets du paquet de l'intention ...

23
Farhan

Voici l'exemple de code de travail. Passer le chemin de l'image et le message.

public static void postImageonWall(String FilePath,String msg ) {

    try {

        Bitmap bi = BitmapFactory.decodeFile(FilePath);
        AsyncFacebookRunner mAsyncRunner = new   AsyncFacebookRunner(facebook);
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bi.compress(Bitmap.CompressFormat.PNG, 100, stream);  // where bm is bitmap from Sdcard
        byte[] byteArray = stream.toByteArray();
        Bundle param = new Bundle();
        param = new Bundle();
        param.putString("message", msg);
        param.putString("filename", "Dessert Dash");
        param.putByteArray("image", byteArray);
        param.putString("caption", "Dessert Dash in Android Market Now");

        mAsyncRunner.request("me/photos", param, "POST", fbrq, null);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }



}
6
Jawad Amjad
btnLogin.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                facebook.authorize(FbdemoActivity.this, new String[]{ "user_photos,publish_checkins,publish_actions,publish_stream"},new DialogListener() {
                    @Override
                    public void onComplete(Bundle values) {
                    }

                    @Override
                    public void onFacebookError(FacebookError error) {
                    }

                    @Override
                    public void onError(DialogError e) {
                    }

                    @Override
                    public void onCancel() {
                    }
                });

            }
        });

public void postImageonWall() {

           byte[] data = null;

             Bitmap bi = BitmapFactory.decodeFile("/sdcard/viewitems.png");
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
             bi.compress(Bitmap.CompressFormat.JPEG, 100, baos);
             data = baos.toByteArray();


             Bundle params = new Bundle();
             params.putString(Facebook.TOKEN, facebook.getAccessToken());
             params.putString("method", "photos.upload");
             params.putByteArray("picture", data);

             AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook);
             mAsyncRunner.request(null, params, "POST", new SampleUploadListener(), null);

    }

public class SampleUploadListener extends BaseRequestListener {

    public void onComplete(final String response, final Object state) {
        try {
            // process the response here: (executed in background thread)
            Log.d("Facebook-Example", "Response: " + response.toString());
            JSONObject json = Util.parseJson(response);
            final String src = json.getString("src");

            // then post the processed result back to the UI thread
            // if we do not do this, an runtime exception will be generated
            // e.g. "CalledFromWrongThreadException: Only the original
            // thread that created a view hierarchy can touch its views."

        } catch (JSONException e) {
            Log.w("Facebook-Example", "JSON Error in response");
        } catch (FacebookError e) {
            Log.w("Facebook-Example", "Facebook Error: " + e.getMessage());
        }
    }

    @Override
    public void onFacebookError(FacebookError e, Object state) {    
    }
}

essayez ce code cela fonctionnera j'avais utilisé le même code et télécharge l'image sur Facebook.

6
Nilesh Gawade
private String postwall(String uid)
    {
        String response = "";
        try
        {

            String DIRECTORY_PATH = "/sdcard/159.jpg";
            Bundle params = new Bundle();
            Bitmap bitmap = BitmapFactory.decodeFile(DIRECTORY_PATH);
            byte[] data = null;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            data = baos.toByteArray();
            params.putString("app_id", uid);
            params.putString("message", "picture caption");
            params.putByteArray("picture", data);

            mFacebook.authorize(this, PERMISSIONS, new LoginDialogListener());
            mAsyncRunner.request("me/photos", params, "POST", new WallPostRequestListener());
            mAsyncRunner.request(response, new WallPostRequestListener());
            Log.e("post result", response);

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return response;
    }

    public class WallPostRequestListener extends BaseRequestListener
    {

        public void onComplete(final String response)
        {
            Log.d("Facebook-Example", "Got response: " + response);
            String message = "<empty>";
            try
            {
                JSONObject json = Util.parseJson(response);
                message = json.getString("message");
            }
            catch (JSONException e)
            {
                Log.w("Facebook-Example", "JSON Error in response");
            }
            catch (FacebookError e)
            {
                Log.w("Facebook-Example", "Facebook Error: " + e.getMessage());
            }
            final String text = "Your Wall Post: " + message;

        }
    }
4
Sock

Je suis sûr que Facebook finira par résoudre ce problème, mais pour le moment, ces exemples (postés par d'autres utilisateurs) sont très trompeurs car ils ne sont en fait PAS affichés sur le mur de l'utilisateur (au sens habituel). Au lieu de cela, ils sont ajoutés à la galerie de photos de l'utilisateur et finissent par se retrouver sur le mur, mais pas de la même manière que les messages normaux. côte à côte avec le premier (plutôt que comme une entrée séparée). Ainsi, lorsque vous utilisez la commande api me/feed, il échoue de manière spectaculaire. En effet, il ajoute un message au mur, mais c'est un message vide de l'application (il ignore même le titre et la légende). 

Espérons que Facebook corrigera ce problème à court terme.

2
Genia S.

Publier l'image et le texte sur le mur Facebook à partir du code, une fois que vous vous êtes connecté à l'aide des informations d'identification Facebook.

remarque: cela s'applique uniquement après vous être connecté à votre application à l'aide des informations d'identification Facebook.

sharePhotoToFacebook();                  //function called from any UI event

private void sharePhotoToFacebook(){
        Bitmap bitmap=null;
        String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Download/";
        try {
            File file = new File(path, "image9.jpg");
            bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
        }
        catch (Exception e){
            Log.e("Error" , " Error in loading file");
        }

        SharePhoto photo = new SharePhoto.Builder()
                .setBitmap(bitmap)
                .setCaption("A post from Android code")
                .build();

        SharePhotoContent content = new SharePhotoContent.Builder()
                .addPhoto(photo)
                .build();

        ShareApi.share(content, null);
        Toast.makeText(LoginSuccessActivity.this, "Image posted successfully", Toast.LENGTH_LONG).show();
    }
0
Sackurise