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