簡體   English   中英

Facebook登錄CallbackManager沒有調用FacebookCallback?

[英]Facebook Login CallbackManager FacebookCallback not called?

  • 我嘗試使用LoginButton登錄但是沒有調用登錄回調。(LoginButton在片段中)。
  • 在Application onCreate中調用FacebookSdk.sdkInitialize
  • 登錄完成后不會調用回調。 這是代碼:

活動:

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

嘗試這個:

  1. 在片段的onCreateView()初始化FacebookSdk.sdkInitialize() onCreateView()

  2. 下一行init callbackManager = CallbackManager.Factory.create() ;

  3. 在Fragment類中實現onActivityResult()

  4. 添加你的callbackManager.onActivityResult(requestCode, resultCode, data); 在片段onActivityResult()

確保從活動中刪除FacebookInit()callbackManager

loginButton.setFragment(this); 

這條線已經存在問題。 但只是想為其他任何過度開發的開發人員寫這篇文章。

如果您在片段中使用FB登錄按鈕,請確保將其添加到onCreateView方法中。 這樣可以確保回調轉到Fragment而不是轉到您的活動。

對於舊版本:

更改方法如下:

 @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登錄或共享集成的每個活動和片段都應將onActivityResult轉發到callbackManager。

還要考慮到,如果您有兩個不同操作的兩個回調管理器(如登錄和共享),則接收onActivityResult的第一個回調管理器可以接收第二個回調,反之亦然。 該行為也可以使您的回調不被調用。

這對我有用

初始化回調管理器

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

如果在Fragment中這是重要的loginButton.setFragment(this);

我花了大約3個小時才發現我誤解了使用facebook API。

    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()

我找到的解決方法是檢查訪問令牌,並在onSuccess()onActivityResult()分別調用callAPI() onActivityResult()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM