![](/img/trans.png)
[英]Facebook Login CallbackManager FacebookCallback called onCancel() every time
[英]Facebook Login CallbackManager FacebookCallback not called?
活動:
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;
}
嘗試這個:
在片段的onCreateView()
初始化FacebookSdk.sdkInitialize()
onCreateView()
。
下一行init callbackManager = CallbackManager.Factory.create()
;
在Fragment類中實現onActivityResult()
。
添加你的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.