1

我正在尝试通过 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");

它返回相同的错误。

有人有什么想法吗?

4

2 回答 2

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;
}
于 2012-09-28T18:24:53.163 回答
0

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

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

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

谢谢,杰西

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

于 2012-09-28T12:32:57.213 回答