Karl John Hernandez
Karl John Hernandez

Reputation: 328

Facebook SDK Image posting error

I'm having a bit of a problem, whenever I attempt to post images to facebook, an error that resembles the below screenshot always show.

It works on emulator but not on device.

I used the old and also tried the new facebook SDK (3.0) for android with no success.

Facebook error upon attempting to post image

Here's the class code of my facebookshare app

public class FacebookShare extends Activity
{
    private String                      APP_ID, APP_SECRET, Name, Link, Description, Picture;
    private int                         fbTYPE;
    private Facebook                    facebook;
    private AsyncFacebookRunner mAsyncRunner;
    private Activity                    ctx;
    private Bitmap                      bitmap;

    SharedPreferences                   mPrefs;

    public FacebookShare(Activity ctx)
    {
        APP_ID = "...obfuscated...";

        facebook = new Facebook(APP_ID);
        mAsyncRunner = new AsyncFacebookRunner(facebook);
        this.ctx = ctx;
    }

    public void shareFB(int TypeOfSharing)
    {
        APP_ID = "...obfuscated...";
        facebook = new Facebook(APP_ID);
        mAsyncRunner = new AsyncFacebookRunner(facebook);

        this.fbTYPE = TypeOfSharing;
        loginToFacebook();
    }

    public void loginToFacebook()
    {
        Log.v("debugging", "Entered Login to facebook");
        String access_token = mPrefs.getString("access_token", "");
        long expires = mPrefs.getLong("access_expires", 0);

        if (!access_token.equals(""))
        {
            facebook.setAccessToken(access_token);

            Log.v("Access Token", facebook.getAccessToken());
        }

        if (expires != 0)
        {
            facebook.setAccessExpires(expires);
        }

        if (!facebook.isSessionValid())
        {
            Log.v("debugging", "Session is Invalid");

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

                public void onCancel()
                {
                    // Function to handle cancel event
                }

                public void onComplete(Bundle values)
                {
                    // Function to handle complete event
                    // Edit Preferences and update facebook acess_token

                    SharedPreferences.Editor editor = mPrefs.edit();
                    editor.putString("access_token", facebook.getAccessToken());
                    editor.putLong("access_expires", facebook.getAccessExpires());
                    editor.commit();

                    if (fbTYPE == 1)
                    {
                        postToWall();
                    }
                    else if (fbTYPE == 0)
                    {
                        postToWall(getBitmap());
                    }
                }

                public void onError(DialogError error)
                {
                    Log.v("debugging", error.getMessage());
                }

                public void onFacebookError(FacebookError fberror)
                {
                    Log.v("debugging", fberror.getMessage());
                }

            });
            Log.v("debugging", "Passed from authorization");
        }
        else
        {
            if (fbTYPE == 1)
            {
                Log.v("debugging", "Entered Post to facebook");
                postToWall();
            }
            else if (fbTYPE == 0)
            {
                Log.v("debugging", "Entered Post image to facebook");
                postToWall(getBitmap());

            }
        }
    }

    public void clearCredentials()
    {

        try
        {

            facebook.logout(ctx);

        }
        catch (MalformedURLException e)
        {

            e.printStackTrace();

        }
        catch (IOException e)
        {

            e.printStackTrace();

        }

    }

    public void postToWall()
    {
        // post on user's wall.
        Bundle params = new Bundle();
        params.putString("description", getDescription());
        params.putString("picture", getPicture());
        params.putString("name", getName());
        params.putString("link", getLink());

        facebook.dialog(ctx, "feed", params, new DialogListener()
        {

            public void onFacebookError(FacebookError e)
            {
                e.printStackTrace();
                Log.e("FBDEBUG", e.toString());
            }

            public void onError(DialogError e)
            {
                e.printStackTrace();
                Log.e("FBDEBUG", e.toString());
            }

            public void onComplete(Bundle values)
            {
                Toast.makeText(ctx, "Thanks for sharing JOLENPOP", Toast.LENGTH_SHORT).show();
            }

            public void onCancel()
            {
                // Login_Activity.asyncFBLogin fblogin = null;
                // fblogin.execute();
            }
        });

    }

    public void postToWall(Bitmap bmImage)
    {
        Log.v("debugging", "entered postToWall(bitmap)");
        byte[] data = null;
        Bitmap bm = Bitmap.createBitmap(bmImage);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bm.compress(CompressFormat.JPEG, 100, baos);
        data = baos.toByteArray();

        Bundle params = new Bundle();
        params.putString("method", "post");
        params.putString("message", getDescription());
        params.putByteArray("image", data);

        try
        {
            String response = facebook.request("me");
            response = facebook.request("me/photos", params, "POST");
            if (response == null || response.equals("") || response.equals("false"))
            {
                Log.v("response String", response);
                return;
            }
            else if (response.toLowerCase().contains("error"))
            {
                Log.v("response String", response);
                return;
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
            Log.e("FBDEBUG", e.toString());
            return;
        }

        Toast.makeText(ctx, "Your photo has been successfuly published!", Toast.LENGTH_LONG).show();
    }

    public void getProfileInformation()
    {
        mAsyncRunner.request("me", new RequestListener()
        {
            public void onComplete(String response, Object state)
            {
                Log.d("Profile", response);
                String json = response;
                try
                {
                    JSONObject profile = new JSONObject(json);
                    // getting name of the user
                    String name = profile.getString("name");
                    // getting email of the user
                    String email = profile.getString("email");

                    runOnUiThread(new Runnable()
                    {

                        public void run()
                        {
                            // Toast.makeText(getApplicationContext(), "Name: " + name
                            // + "\nEmail: " + email, Toast.LENGTH_LONG).show();
                        }

                    });
                }
                catch (JSONException e)
                {
                    e.printStackTrace();
                }
            }

            public void onIOException(IOException e, Object state)
            {

            }

            public void onFileNotFoundException(FileNotFoundException e, Object state)
            {

            }

            public void onMalformedURLException(MalformedURLException e, Object state)
            {

            }

            public void onFacebookError(FacebookError e, Object state)
            {

            }
        });
    }

    /**
     * setters
     * */
    public void setFacebook(Facebook facebook)
    {
        this.facebook = facebook;
    }

    public void setAsyncRunner(AsyncFacebookRunner mAsyncRunner)
    {
        this.mAsyncRunner = mAsyncRunner;
    }

    public void setPrefs(SharedPreferences mPrefs)
    {
        this.mPrefs = mPrefs;
    }

    public void setName(String val)
    {
        this.Name = val;
    }

    public void setLink(String val)
    {
        this.Link = val;
    }

    public void setBitmap(Bitmap val)
    {
        this.bitmap = val;
    }

    public void setDescription(String val)
    {
        this.Description = val;
    }

    public void setPicture(String val)
    {
        this.Picture = val;
    }

    /**
     * getters
     * */

    public String getAppID()
    {
        return this.APP_ID;
    }

    public String getName()
    {
        return this.Name;
    }

    public String getLink()
    {
        return this.Link;
    }

    public String getDescription()
    {
        return this.Description;
    }

    public String getPicture()
    {
        return this.Picture;
    }

    public Bitmap getBitmap()
    {
        return this.bitmap;
    }

}

and here's how I used it:

fbShare = new FacebookShare(this);
mPrefs = PreferenceManager.getDefaultSharedPreferences(this);

Log.v("debugging", "entered post to image");
Bitmap screenshot = this.glSurfaceView.mRenderer.screenCapture;
fbShare.setName("JOLENPOP");
fbShare.setDescription("I got a score of " + this.glSurfaceView.mRenderer.Score + " in JOLENPOP! Try to beat me!");
fbShare.setBitmap(screenshot);
fbShare.setPrefs(mPrefs);
fbShare.shareFB(0);

I tried the Built-in app and also facebook.FORCE_DIALOG_AUTH with no difference in their results.. Thanks in advance, and more power :)

Upvotes: 2

Views: 423

Answers (1)

rightparen
rightparen

Reputation: 1693

I suspect this has to do with setting the parameter as a byte[] instead of as a Bitmap.

The most straightforward path may be to try using Request.newUploadPhotoRequest() without modifying the resulting Request. Once you get that working, you can add additional parameters to customize the post or look at the implementation of that method to see how it builds the request if you want to do a deeper change.

Upvotes: 2

Related Questions