web-dev-qa-db-ja.com

Facebook Login CallbackManager FacebookCallbackが呼び出されていませんか?

  • LoginButtonでログインしようとしましたが、ログインコールバックが呼び出されていません(LoginButtonはフラグメント内にあります)。
  • FacebookSdk.sdkInitializeは、アプリケーションonCreateで呼び出されます
  • ログインが完了した後、コールバックは呼び出されません。コードは次のとおりです。

アクティビティ:

public class FrameActivity extends BaseActivity {

 public static CallbackManager callbackManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
// FacebookSdk.sdkInitialize is called in the Application onCreate

callbackManager = CallbackManager.Factory.create();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    callbackManager.onActivityResult(requestCode, resultCode, data);

}
}

断片:

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_login, container, false);
    LoginButton loginButton = (LoginButton) view.findViewById(R.id.login_button);
    loginButton.setReadPermissions("user_friends");
    loginButton.setReadPermissions("public_profile");
    loginButton.setReadPermissions("email");
    loginButton.setReadPermissions("user_birthday");
    // If using in a fragment
    loginButton.setFragment(this);
    // Other app specific specialization

    // Callback registration
    loginButton.registerCallback(FrameActivity.callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {


}
        @Override
        public void onCancel() {
            // App code

        }

        @Override
        public void onError(FacebookException exception) {
            // App code

        }
    });
    return view;
}
28

これを試して:

  1. フラグメントのFacebookSdk.sdkInitialize()onCreateView()を初期化します。

  2. 次の行init callbackManager = CallbackManager.Factory.create();

  3. FragmentクラスのonActivityResult()に実装します。

  4. callbackManager.onActivityResult(requestCode, resultCode, data);をフラグメントonActivityResult()に追加します。

アクティビティからFacebookInit()callbackManagerを必ず削除してください。

49
loginButton.setFragment(this); 

この行はすでに問題になっています。しかし、見過ごしている他の開発者のためにこれを書きたかっただけです。

フラグメントでFBログインボタンを使用している場合は、これをonCreateViewメソッドに追加してください。これにより、コールバックはアクティビティに行くのではなく、フラグメントに行きます。

16
Prakash

古いバージョンの場合:

メソッドを次のように変更します。

_ @Override
 public void onActivityResult(int requestCode, int resultCode, Intent data)
 {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK)
    {

        com.facebook.Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
    }
    else
    {
        com.facebook.Session.getActiveSession().closeAndClearTokenInformation();
    }

}
_

更新:v2.3の場合、 ここから

アクティビティまたはフラグメントのonCreate()メソッドにコールバックを追加します。

_@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(this.getApplicationContext());

callbackManager = CallbackManager.Factory.create();

LoginManager.getInstance().registerCallback(callbackManager,
        new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                // App code
            }

            @Override
            public void onCancel() {
                 // App code
            }

            @Override
            public void onError(FacebookException exception) {
                 // App code   
            }
});
}
_

ログインに成功すると、LoginResultパラメーターに新しいAccessTokenと、最後に許可または拒否されたアクセス許可が設定されます。

ログインに成功するためにregisterCallbackは必要ありません。現在のアクセストークンの変更に従うには、以下で説明するAccessTokenTrackerクラスを使用できます。

次に、onActivityResult()で、ログイン結果をonCreate()で作成されたcallbackManagerに転送します。

_@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    callbackManager.onActivityResult(requestCode, resultCode, data);
}
_

FacebookSDK LoginまたはShareと統合するすべてのアクティビティとフラグメントは、onActivityResultをcallbackManagerに転送する必要があります。

10
user4670319

また、2つの異なる操作(ログインや共有など)に2つのコールバックマネージャーがある場合、onActivityResultを受け取る最初のコールバックマネージャーが2番目のコールバックを受け取り、その逆も可能であることも考慮してください。この動作により、コールバックが呼び出されないこともあります。

2
Eli Kohen

これは私のために働いた

コールバックマネージャーの初期化

CallbackManager sCallbackManager = CallbackManager.Factory.create();

コールバックを登録するメソッドを作成します

private void configureFacebookAppInviteCallBack(){

    AppInviteDialog appInviteDialog = new AppInviteDialog(InviteHomeFragment.this);
                        appInviteDialog.registerCallback(sCallbackManager,
                                new FacebookCallback<AppInviteDialog.Result>() {
                                    @Override
                                    public void onSuccess(AppInviteDialog.Result result) {
                                        Log.d("rht", "Invitation Sent Successfully");
                                        CommonUtils.getInstance().showToast("50");
                                    }

                                    @Override
                                    public void onCancel() {
                                        Log.d("rht", "Error Occured in facebook invite ");
                                    }

                                    @Override
                                    public void onError(FacebookException e) {
                                        if(e!=null) {
                                            Log.d("rht", "Error Occured in facebook invite ");
                                        }else{
                                            Log.d("rht", "Error Occured in facebook invite");
                                        }
                                    }
                                });


}

OnActivityResultを実装します。

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.v("rht", "onActivityResult called requestCode "+requestCode+" resultCode "+resultCode);

        sCallbackManager.onActivityResult(requestCode, resultCode, data);
    }
1
Rohit Mandiwal

フラグメント内でこれが重要な場合loginButton.setFragment(this);

0
Ashish Chaugule

Facebook APIの使用について誤解していることを理解するために、約3時間を費やしました。

_    void someInitCode() {
        callbackManager = CallbackManager.Factory.create();

        LoginManager.getInstance().registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        callAPI();
                    }
                    @Override
                    public void onCancel() {
                    }

                    @Override
                    public void onError(FacebookException exception) {
                    }

                });

}
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (AccessToken.getCurrentAccessToken() != null) callAPI();
            else callbackManager.onActivityResult(requestCode, resultCode, data);
        } else {
            Log.d("hole", "not ok");
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
_

元の呼び出しはonSuccess()コードを別の関数callAPI()に入れなかったため、すでにログインに成功していてもAPIを呼び出すことはありません。その理由は、ログインおよび再ログインがonSuccess()内に入らないためです!

私が見つけた回避策は、アクセストークンをチェックし、callAPI()onSuccess()の両方でonActivityResult()への呼び出しを分離することです。

0
林果皞