Facebook Войти 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);
}
}
Fragment:
@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
Попробуйте следующее:
-
Init FacebookSdk.sdkInitialize()
в фрагменте onCreateView()
.
-
Следующая строка init callbackManager = CallbackManager.Factory.create()
;
-
Реализовать на onActivityResult()
в классе Фрагмент.
-
Добавьте свой callbackManager.onActivityResult(requestCode, resultCode, data);
в фрагменте onActivityResult()
.
Убедитесь, что из активности удалены FacebookInit()
и callbackManager
.
Ответ 2
для более старых версий:
измените метод, как показано ниже:
@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();
}
}
UPDATE: для 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()
переслать результаты входа в callbackManager
, созданные в onCreate()
:
@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.
Ответ 3
loginButton.setFragment(this);
Эта строка уже находится в вопросе. Но просто хотел написать это для любых других разработчиков, которые смотрят.
Если вы используете кнопку входа FB в фрагмент, убедитесь, что вы добавили это в свой метод onCreateView. Это обеспечивает обратный вызов, чтобы перейти к фрагменту, а не к вашей активности.
Ответ 4
Также учтите, что если у вас есть два менеджера обратного вызова для двух разных операций (например, вход в систему и общий доступ), первый, который получает onActivityResult, может получить второй обратный вызов и наоборот. Это поведение также может привести к тому, что ваш callback не будет вызван.
Ответ 5
Это сработало для меня
Инициализировать диспетчер обратного вызова
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);
}