Деятельность:
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;
}
Попробуйте это:
Инит FacebookSdk.sdkInitialize () в фрагменте'onCreateView с
()`.
Следующая строка инициализации callbackManager = CallbackManager.Фабрика.создать()`;
Выполнить по метод onActivityResult()` в классе фрагмента.
Добавить callbackManager свой.метод onActivityResult(requestCode, resultCode, данных);
в метод onActivityResult фрагмент ()
.
Убедитесь, что удалить FacebookInit()
и `callbackManager от активности.
loginButton.setFragment(this);
Эта линия уже в вопросе. Но просто хотел написать это для других разработчиков, которые за взгляд.
Если вы используете кнопку Вход FB в фрагмент убедитесь, что вы добавить это в свой метод onCreateView. Это обеспечивает перезвонить, чтобы перейти к фрагменту, а не к вашей деятельности.
для более старых версий:
изменить метод, как показано ниже:
@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
, и совсем недавно удовлетворил или отклонил разрешения.
Вы Don'т нужна 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 или доля должны вперед `метод 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);
}
если в Фрагмент это loginButton важно.setFragment(этого);
Я потратил ~3 часа, чтобы выяснить, у меня были непонимания с использованием API facebook.
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()`.