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 protocol should be http or 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");

Start code change--->> アクションが友達の場合、redirect_uri を SITE URL で上書きします

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 には、Facebook からのリターン コードを処理する Webview クライアントがあり、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/) を参照してください。

それでも問題が解決しない場合は、お気軽にコミュニティ Web サイト >(http://facebook.stackoverflow.com/) に投稿し、「android」でタグ付けしてください。

ありがとう、ジェシー

友達を追加するためのダイアログがあり、現在はサポートされていないため、わかりません

于 2012-09-28T12:32:57.213 に答える