Android post picture to Facebook wall

38,242

Solution 1

first thing is that you are not using graph api to upload the pictures... u r using the old rest api... try to use graph api, its simple...

Use following code:

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

According to error message, it looks like its giving errors in getting bytes from intent's bundle...

Solution 2

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) {    
    }
}

try this code it will work i had used the same code and uploads the image on Facebook.

Solution 3

Here is the working code sample. Pass image path and 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();
    }



}

Solution 4

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;

        }
    }

Solution 5

I'm sure Facebook will fix this eventually, but for the time being these examples (posted by other users) are very misleading because they do NOT in fact post to the user's wall (in the regular sense). Instead they are added to the user's photo gallery, and then happen to end up on the wall, but not in the same way in which normal posts work... there is no title and no caption and if you add another photo it ends up side by side with the first (rather than as a separate entry). So, when you use the api command me/feed it just fails in a spectacular way where it actually adds a post to the wall but it's an empty post from the application (it even disregards the title and caption).

Hopefully Facebook will fix this sometime in the near term.

Share:
38,242
whirlwin
Author by

whirlwin

Vimming, vimming in the vimming pool. When days are hot when days are cool in the vimming pool. Yanking, jumping, recording macros too! Don't you wish you never had anything else to foo!

Updated on July 09, 2022

Comments

  • whirlwin
    whirlwin almost 2 years

    I am trying to post a picture to my wall on Facebook. I have managed logging in and posting text to the wall. However, when I try posting the picture, nothing happens.

    I am using the Android Facebook SDK.

    Here is what I have so far:

        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);
    

    The Toast shows 8733, which means the byte array isn't empty

    NB. Logcat output some warnings (not errors):

    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.
    

    (Shows several times underneath each other.)

    What am I doing wrong?


    SOLVED. This is what I did to make it work:

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

    And the helper method:

    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());
        }
    }
    
  • whirlwin
    whirlwin about 13 years
    Where can I download the Graph API?
  • Farhan
    Farhan about 13 years
    you are already using graph api actually what i think its just the use of api.. for old rest api you need to provide the method in bundle like "photos.upload" but in graph api you provide "me/photos" in mAsyncRunner.request function....
  • whirlwin
    whirlwin about 13 years
    I figured it out now, and it is much easier with the Graph API. Thanks a bunch! :)
  • RajaReddy PolamReddy
    RajaReddy PolamReddy over 12 years
    @Farhan how can i add image here.... params.putByteArray("picture", getIntent().getExtras().getByteArray("data"));
  • RajaReddy PolamReddy
    RajaReddy PolamReddy over 12 years
    i am getting error if i use above code The method request(String, Bundle, String, AsyncFacebookRunner.RequestListener, Object) in the type AsyncFacebookRunner is not applicable for the arguments (String, Bundle, String, Example.SampleUploadListener)
  • Farhan
    Farhan over 12 years
    I think its because, the facebook sdk has changed a little... so get the new sdk and use the function accordingly now. for ImageBytes they are just a byte array....
  • Sock
    Sock about 12 years
    It is working code, i am able to post my Photo and Message from my SD card to face book wall.......
  • Balkyto
    Balkyto over 11 years
    Where are your images going if you do it like this? I have an issue that my images go directly to album, and are not published to wall / timeline and do not finish in other users feed...
  • Maveňツ
    Maveňツ about 10 years
    buddy what is 'fbrq'?
  • Maveňツ
    Maveňツ about 10 years
    wht is BaseRequestListener here?