android - Facebook SDK 图片发布错误

标签 android facebook-android-sdk

我遇到了一个问题,每当我尝试将图像发布到 Facebook 时,总是会显示类似于下面的屏幕截图的错误。

它可以在模拟器上运行,但不能在设备上运行。

我使用了旧的,也尝试了新的 facebook SDK (3.0) 对于 android 没有成功。

Facebook error upon attempting to post image

这是我的 facebookshare 应用程序的类代码

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

}

这是我的使用方法:

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

我尝试了内置应用程序和 facebook.FORCE_DIALOG_AUTH,结果没有任何差异。提前致谢,还有更多功能:)

最佳答案

我怀疑这与将参数设置为字节[]而不是位图有关。

最直接的路径可能是尝试使用 Request.newUploadPhotoRequest() 而不修改生成的请求。一旦您开始工作,您可以添加其他参数来自定义帖子,或者查看该方法的实现,以了解它如何构建请求(如果您想做更深入的更改)。

关于android - Facebook SDK 图片发布错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13265764/

相关文章:

java - 如何使用 MVVM 和 Retrofit 将存储库实现到我的项目中

Android Facebook SDK - 与公众分享帖子

android - Graph Api 不在 Android 上返回性别

android - 用于智能手机的相机控制 HTML/PHP/Javascript?

html页面的Android KitKat webview宽度

android - Facebook 个人资料图片 Android 返回 null

Android Facebook SDK FacebookDialog.shareDialogBu​​ilder 不显示我的描述

Android facebook sdk 实现失败 "an error occurred"

android - 使用 AsyncTask 进行 HTML 解析会使主线程变慢

android - 应避免使用 flatDirs,因为它不支持任何元数据格式