【问题标题】:Error when trying to show Facebook Android SDK Add Friend Dialog尝试显示 Facebook Android SDK 添加好友对话框时出错
【发布时间】:2012-09-23 13:23:28
【问题描述】:

我正在尝试通过 fb sdk 显示添加朋友对话框。

                Bundle parameters = new Bundle();
                parameters.putString("id", i.getUid());
                FacebookSession.getSession().dialog(getSherlockActivity(), "friends", parameters,
                          new Facebook.DialogListener()
                          {
                            public void onFacebookError( FacebookError e ) {   }
                            public void onError(DialogError e) {   }
                            public void onCancel() {  }
                            @Override
                            public void onComplete(Bundle values) {
                                // TODO Auto-generated method stub

                            }
                          } );

有一个加载屏幕,出现一个对话框框,但内容只是:

redirect_uri URL 协议必须是 HTTP 或 HTTPS

通常在创建 facebook 对话框时不需要指定 redirect_uri。即使我尝试手动指定一个,例如:

parameters.putString("redirect_uri", "http://www.facebook.com");

它返回相同的错误。

有人有什么想法吗?

【问题讨论】:

    标签: android facebook dialog


    【解决方案1】:

    Facebook 仅支持“对话”请求中的提要、Oauth 和 Apprequest 操作。对于这些请求,即使将 redirect_uri 指定为“fbconnect://success”,也不会给出错误“redirect_uri URL 协议应为 http 或 https”。不幸的是,当我们发出朋友对话框时,facebook 将 redirect_uri 设为 http/https 并且 redirect_uri 的域名应在 APP 设置中的“SITE URL”参数中定义。

    无论如何,我们通过覆盖 facebook SDK 中的 redirect_uri 解决了这个问题。在 facebook.java 中,我们对对话框方法进行了以下更改:

    public void dialog(Context context, String action, Bundle parameters,
        final DialogListener listener) {
    
    String endpoint = DIALOG_BASE_URL + action;
    parameters.putString("display", "touch");
    

    开始代码更改--->> 如果操作是朋友,您将在这里用您的站点 URL 覆盖 redirect_uri

    if(action.contentEquals("friends")) 
    {
      parameters.putString("redirect_uri", "http://www.yourdomain.com");
    } 
    else 
    {
      parameters.putString("redirect_uri", REDIRECT_URI);
    }
    

    结束代码更改

    if (action.equals(LOGIN)) {
        parameters.putString("type", "user_agent");
        parameters.putString("client_id", mAppId);
    } else {
        parameters.putString("app_id", mAppId);
    }
    
    if (isSessionValid()) {
    

    开始代码修改--->>在好友对话中我们不需要access_token

       if(!action.contentEquals("friends")) 
             parameters.putString(TOKEN, getAccessToken());
    

    结束代码更改

    }
    String url = endpoint + "?" + Util.encodeUrl(parameters);
    if (context.checkCallingOrSelfPermission(Manifest.permission.INTERNET)
            != PackageManager.PERMISSION_GRANTED) {
        Util.showAlert(context, "Error",
                "Application requires permission to access the Internet");
    } else {
        new FbDialog(context, url, listener).show();
    }
    

    } 另一个棘手的部分是在 FbDialog.java 中有一个 Webview 客户端处理来自 facebook 的返回代码,您必须对 FbDialog.java 进行以下更改:

    private class FbWebViewClient extends WebViewClient {
    
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        Util.logd("Facebook-WebView", "Redirect URL: " + url);
        if (url.startsWith(Facebook.REDIRECT_URI)) {
            Bundle values = Util.parseUrl(url);
    
            String error = values.getString("error");
            if (error == null) {
                error = values.getString("error_type");
                Util.logd("Facebook-WebViewError", "error type: " + error);
            }
            else
                  Util.logd("Facebook-WebViewError", "error: " + error);
            if (error == null) {
                mListener.onComplete(values);
            } else if (error.equals("access_denied") ||
                       error.equals("OAuthAccessDeniedException")) {
                mListener.onCancel();
            } else {
                mListener.onFacebookError(new FacebookError(error));
            }
    
            FbDialog.this.dismiss();
            return true;
        } else if (url.startsWith(Facebook.CANCEL_URI)) {
            mListener.onCancel();
            FbDialog.this.dismiss();
            return true;
        } else if (url.contains(DISPLAY_STRING)) {
            return false;
        }
    

    开始修改代码--->> 在好友对话中,redirect_uri 是您的 SITE URL,因此请检查 url 变量并相应地处理成功和失败

        else  if (url.startsWith("http://www.yourdomain.com")) {
           Bundle values = Util.parseUrl(url);
    
             String error = values.getString("error");
             if (error == null) {
                 error = values.getString("error_type");
                 Util.logd("Facebook-WebViewError", "error type: " + error);
             }
             else
                Util.logd("Facebook-WebViewError", "error: " + error);
             if (error == null) {
                 mListener.onComplete(values);
             } else if (error.equals("access_denied") ||
                        error.equals("OAuthAccessDeniedException")) {
                 mListener.onCancel();
             } else {
                 mListener.onFacebookError(new FacebookError(error));
             }
    
             FbDialog.this.dismiss();
             return true;
        }
       // launch non-dialog URLs in a full browser
       // getContext().startActivity(
       //         new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
    

    结束代码更改

        return false;
    }
    

    【讨论】:

      【解决方案2】:

      我在developers.facebook.com 提交了一份错误报告并得到了以下答复:

      我们的 SDK 不支持添加好友。请参阅此处 >(https://developers.facebook.com/docs/reference/androidsdk/) 了解我们关于 > 支持的文档。

      如果您仍然遇到问题,请随时在我们的社区网站上发帖 >(http://facebook.stackoverflow.com/) 并标记为“android”。

      谢谢, 杰西

      我不明白,因为有一个添加朋友的对话框,现在不支持了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多