Facebook for Android FacebookDialog.ShareDialogBu​​ilder无法识别Request.newUploadStagingResourceWithImageRequest返回的URI

时间:2015-03-04 00:44:49

标签: android facebook facebook-graph-api

我对android和facebook比较新,所以请耐心等待。重要说明:无论我输入h ..这意味着http://www。我不打算在这里发布链接,但我必须解释这个(我的许可只允许2个链接)所以请耐心等待。

此应用使用FacebookDialog.ShareDialogBu​​ilder进行Facebook帖子。如果使用.setPicture方法的帖子图像被赋予静态硬编码URL h..example.com / share_name / image_name.png,这一切都很有效。在这种情况下,帖子工作,图片显示在帖子上,一切都很好。

但是,发送到帖子的图像是由应用程序动态创建的。因此我将图像发送到Facebook的临时区域,这也很好。 Request.newUploadStagingResourceWithImageRequest返回一个响应,该响应具有JSON编码的URI位置 在facebook的临时区域中的图像。

问题是FacebookDialog.ShareDialogBu​​ilder不喜欢那个URI位置。不知怎的,它没有形成正确的东西,或者我只是做错了什么。

以下是详细信息以及我尝试过的内容:

1)uriMine,图像存储的位置,因为它最初从Facebook的暂存资源上传调用返回:   " fbstaging://graph.facebook.com/staging_resources/MDE4NTY0NzE4MDQ0MTUwNjA6MTM5ODI2Nzc3Ng==" ;.我不知道协议是什么" fbstaging:"是关于(我在网上搜索和搜索但没有)但我 一开始就按原样运行应用程序。结果显然是不可预测的结果,因为它卡在一个循环中(弯针类不断重复,没有特定的模式)。它会显示帖子屏幕,但你无法输入信息,因为它会锁定,关闭,重复等...

2)在网上进行了一些关于格式良好的URL的教育之后,我用h ..替换了fbstaging://,从而将uriMine变量更改为以下内容: h..graph.facebook.com / staging_resources / MDE4NTY0NzE4MDQ0MTUwNjA6MTM5ODI2Nzc3Ng ==   这解决了无限循环问题(使得后期工作正常),除了它不会显示任何图像。

3)为了查看它是否适用于h..blablabla.com / image_resource表单的任何旧普通URL,我在网上对一些图像进行了硬编码,并且工作正常,并显示了图像。 / p>

4)好的,我保证,我做得最多(哇!)。所以,它现在的立场是:

  

a)将uriMine作为fbstaging传递://graph.facebook.com/staging_resources/etc等     让它吓坏了。

     

b)发送在线资源的正常URL工作正常(顺便说一下,形成一个浏览器形成它)。

     

c)预先http://www。而不是fbstaging://使帖子工作,但Facebook没有显示图像,好像它无法找到它。

顺便说一句,通过将其复制/粘贴到浏览器中直接转到上面,会被重定向到以下内容:

h..dnsrsearch.com / index.php的origURL = HTTP%3A // www.graph.facebook.com / staging_resources / MDE4NTY0NzE4MDQ0MTUwNjA6MTM5ODI2Nzc3Ng%3D%3D&安培; R =

显然它无法找到它。

  

SO:

     

错误的URI或我缺少的URI是什么?请帮忙。

     

非常感谢您花时间和耐心阅读本文。

public class FacebookActivity extends Activity {

// initialize the global object to enable passing of activity to facebook dialog
public GlobalClass globalObject = new GlobalClass();

private UiLifecycleHelper uiHelper; // for Facebook...to mimic android's activity life cycle

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    uiHelper = new UiLifecycleHelper(this, null);
    uiHelper.onCreate(savedInstanceState);

    // set the calling activity...to pass to Face book
    globalObject.setCurrentActivity(this);

    // start Facebook Login
    Session currentSession = new Session(this);
    currentSession = Session.openActiveSession(this, true, new Session.StatusCallback() {

        // callback when session changes state
        @Override
        public void call(final Session session, SessionState state, Exception exception) {

            // this callback should fire multiple times, be sure to get the right one i.e.  session.isOpened()
            if (session.isOpened()) {

                // make request to the /me API
                Request.newMeRequest(session, new Request.GraphUserCallback() {

                  // callback after Graph API response with user object
                  @Override
                  public void onCompleted(GraphUser user, Response response) {
                      if (user != null) {
                            Bitmap bitmap = takeScreenshot();
                            Request imageRequest = Request.newUploadStagingResourceWithImageRequest(Session.getActiveSession(), bitmap, new Request.Callback() {

                                @Override
                                public void onCompleted(Response response) {

                                    String uriMine = "";
                                    JSONObject data = response.getGraphObject().getInnerJSONObject();
                                    try {
                                        uriMine = data.getString("uri");
                                        uriMine = "http://www." + uriMine.substring(12); // strip off the "fbstaging://" from the uri
                                    } catch (JSONException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }

                                    if (FacebookDialog.canPresentShareDialog(getApplicationContext(), 
                                            FacebookDialog.ShareDialogFeature.SHARE_DIALOG))
                                        {
                                            FacebookDialog shareDialog = new FacebookDialog.ShareDialogBuilder(globalObject.getCurrentActivity())
                                            .setLink("https://play.google.com/store")
                                            .setPicture(uriMine) 
                                            .setRequestCode(NativeProtocol.DIALOG_REQUEST_CODE)
                                            .setApplicationName("This is the App Name")
                                            .setName("This is the name")
                                            .setDescription("This is the description")
                                            .setCaption("This is the caption")
                                            .build();
                                            uiHelper.trackPendingDialogCall(shareDialog.present());
                                        }
                                    else
                                    {
                                        Toast.makeText(globalObject.getCurrentActivity(), "Please install the Facebook App first from Google Play.", Toast.LENGTH_LONG).show();    
                                    }
                                }
                            });
                            imageRequest.executeAsync();
                      }
                  }
                }).executeAsync();
            }
        }
      });
}

1 个答案:

答案 0 :(得分:0)

登台资源端点仅用于为打开的图形对象或操作暂存二进制数据,而不适用于常规链接共享。请参阅此处的文档:https://developers.facebook.com/docs/reference/android/current/class/Request/#newUploadStagingResourceWithImageRequest

在这种情况下,您可以使用PhotoShareDialogBuilder(但之后无法添加链接),也可以将图片上传到您自己的托管服务,并使用http / https网址在setPicture方法中。