gpt4 book ai didi

android - 为什么我的 facebook android sdk 登录被调用了两次?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:57:26 25 4
gpt4 key购买 nike

我正在使用 Facebook SDK,问题是 FormSubmit 函数运行了两次。它被 getView 函数调用,被 onCreateViewstatusCallback 调用,如何解决?

public class Home extends Fragment implements LoginListener {
public View rootView;
public ImageView HomeBg;
public ImageView buttonLoginLogout;
public TextView chi;
public TextView eng;
public ColorStateList oldColor;
public SharedPreferences prefs;
public EasyTracker tracker = null;

//Facebook login
private Session.StatusCallback statusCallback = new SessionStatusCallback();

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

tracker = EasyTracker.getInstance(getActivity());
prefs = getActivity().getSharedPreferences("memberData", 0);

getActivity().getActionBar().hide();

rootView = inflater.inflate(R.layout.home, container, false);
buttonLoginLogout = (ImageView) rootView.findViewById(R.id.home_connectFB);
eng = (TextView) rootView.findViewById(R.id.btn_eng);
chi = (TextView) rootView.findViewById(R.id.btn_chi);

if (Utility.getLocale(getActivity()).equals("TC")) {
chi.setTextColor(getActivity().getResources().getColor(
android.R.color.white));
oldColor = eng.getTextColors();
} else {
eng.setTextColor(getActivity().getResources().getColor(
android.R.color.white));
oldColor = chi.getTextColors();

}

eng.setOnClickListener(setChangeLangListener("EN"));
chi.setOnClickListener(setChangeLangListener("TC"));

//Facebook login
Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);

Session session = Session.getActiveSession();
if (session == null) {
if (savedInstanceState != null) {
session = Session.restoreSession(getActivity(), null, statusCallback, savedInstanceState);
}
if (session == null) {
session = new Session(getActivity());
}
Session.setActiveSession(session);
if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
}
}

updateView();

return rootView;
}

@Override
public void onStart() {
super.onStart();
Session.getActiveSession().addCallback(statusCallback);
tracker.set(Fields.SCREEN_NAME, "Landing Page " + Utility.getLocale(getActivity()));
tracker.send(MapBuilder.createAppView().build());
}

@Override
public void onStop() {
super.onStop();
Session.getActiveSession().removeCallback(statusCallback);
EasyTracker.getInstance(getActivity()).activityStop(getActivity());
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(getActivity(), requestCode, resultCode, data);
}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Session session = Session.getActiveSession();
Session.saveSession(session, outState);
}

private void updateView() {
Session session = Session.getActiveSession();
if (session.isOpened()) {
// get request

if (!session.getAccessToken().equals(prefs.getString("token", "")))
new FormSubmit(getActivity(),this,tracker).execute("login", session.getAccessToken());
else
onTaskComplete(prefs.getString("token", ""),prefs.getString("memberId", ""));

} else {
buttonLoginLogout.setImageResource(R.drawable.landing_btn_connect_facebook);
buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) { onClickLogin(); }
});
}
}

private void onClickLogin() {
Session session = Session.getActiveSession();
if (!session.isOpened() && !session.isClosed()) {
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
} else {
Session.openActiveSession(getActivity(), this, true, statusCallback);
}
}

private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state, Exception exception) {
updateView();
}
}

public OnClickListener setChangeLangListener(final String lang) {
OnClickListener changeLangListener = new OnClickListener() {
@Override
public void onClick(View arg0) {
Configuration config = new Configuration(getResources().getConfiguration());

if (Utility.getLocale(getActivity()).equals("TC") && lang.equals("EN")) {
tracker.send(MapBuilder.createEvent("menu_click","language", "switchEN", null).build());
config.locale = Locale.ENGLISH;
chi.setTextColor(oldColor);
eng.setTextColor(getActivity().getResources().getColor(
android.R.color.white));
} else if (Utility.getLocale(getActivity()).equals("EN") && lang.equals("TC")) {
tracker.send(MapBuilder.createEvent("menu_click","language", "switchTC", null).build());
config.locale = Locale.TRADITIONAL_CHINESE;
eng.setTextColor(oldColor);
chi.setTextColor(getActivity().getResources().getColor(
android.R.color.white));
}

getResources().updateConfiguration(config,getResources().getDisplayMetrics());

onConfigurationChanged(config);
}
};
return changeLangListener;
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Intent intent = getActivity().getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
getActivity().finish();
startActivity(intent);
}

@Override
public void onResume() {
super.onResume();
AppEventsLogger.activateApp(getActivity(),getResources().getString(R.string.app_id));
}

@Override
public void onTaskComplete(String token, String memberId) {
Toast.makeText(getActivity(), "t:" + token + "m:" + memberId, Toast.LENGTH_LONG).show();

buttonLoginLogout.setImageResource(R.drawable.landing_btn_take_a_selfie);
buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
((LandingPage)getActivity()).tabHost.setCurrentTab(2);
}
});
}

@Override
public void onTaskFailure(String errorMsg) {
Toast.makeText(getActivity(), errorMsg, Toast.LENGTH_LONG).show();
}

public void saveMemberInfo(String token, String memberId){
SharedPreferences.Editor editor = prefs.edit();
editor.putString("token", token);
editor.putString("memberId", memberId);
editor.commit();
}

}

最佳答案

如下所示更新您的 SessionStatusCallback() 方法并检查输出。

如果有效,则将其标记为已接受的答案。

private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
updateView();
}
}
}

SessionStatusCallback() 方法将在您的 session 从一种状态更改为另一种状态时每次调用。

在登录 Facebook 之前,您的 SessionState 是 SessionState.CLOSED。当您尝试登录 Facebook 并且身份验证步骤成功时,您的 session 将变为 SessionState.OPENING,此时您的 SessionStatusCallback() 方法将被执行。

但在当前情况下,您的 session 尚未完全打开,它正在打开过程中。因此,在此之后,当您的 session 完全打开时, session 状态更改为 SessionState.OPENED,因此再次调用您的 SessionStatusCallback() 方法。

这就是为什么按照我上面的描述更改您的 SessionStatusCallback() 方法并且它将完美运行的原因。

关于android - 为什么我的 facebook android sdk 登录被调用了两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21762471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com