gpt4 book ai didi

android - 应用重启后 Facebook 访问 token 丢失

转载 作者:太空狗 更新时间:2023-10-29 13:19:54 28 4
gpt4 key购买 nike

我正在使用 Facebook SDK 4.0 并使用内置的登录按钮。我有一个包含 LoginButton 的 Fragment 和另一个只包含一个 TextBox 的 fragment 。

这是 Fragment 的代码 fragment :

public class LoginFragment extends Fragment {

private OnLoginFragmentInteractionListener mListener;
LoginButton loginButton;
CallbackManager callbackManager;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
}

callbackManager = CallbackManager.Factory.create();
}

@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) view.findViewById(R.id.login_button);

// If using in a fragment
loginButton.setFragment(this);

// Callback registration
loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Toast.makeText(getActivity(), "Logged in successfully.", Toast.LENGTH_SHORT).show();
onLoginEvent(true);
}
@Override
public void onCancel() {
Toast.makeText(getActivity(), "Login canceled.", Toast.LENGTH_SHORT).show();
onLoginEvent(false);
}
@Override
public void onError(FacebookException exception) {
Toast.makeText(getActivity(), "Failed to log in. Please try again.", Toast.LENGTH_SHORT).show();
onLoginEvent(false);
}
});

return view;
}

public void onLoginEvent(boolean loginSuccess) {
if (mListener != null) {
mListener.onLoginFragmentInteraction(loginSuccess);
}
}

public interface OnLoginFragmentInteractionListener {
public void onLoginFragmentInteraction(boolean onLoginSuccess);
}

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

Activity 看起来像这样:

public class LoginActivity extends ActionBarActivity implements
LoginFragment.OnLoginFragmentInteractionListener, TestFragment.OnFragmentInteractionListener {

static final String TAG = "LoginActivity";

private LoginFragment loginFragment;
private TestFragment testFragment;
private AccessToken accessToken;
private AccessTokenTracker accessTokenTracker;
private Profile fbProfile;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);

FacebookSdk.sdkInitialize(getApplicationContext());

if (savedInstanceState == null) {
// Add the fragment on initial activity setup
Log.d(TAG, "Bundle = null, isLoggedIn() = " + isLoggedIn());
if (isLoggedIn()) {
testFragment = new TestFragment();
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, testFragment).commit();
} else {
loginFragment = new LoginFragment();
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, loginFragment).commit();
}
} else {
// Or set the fragment from restored state info
Fragment frag = getSupportFragmentManager()
.findFragmentById(R.id.fragment_container);
if (frag instanceof LoginFragment) {
Log.d(TAG, "Bundle != null, fragment = LoginFragment");
loginFragment = (LoginFragment) frag;
}
else if (frag instanceof TestFragment) {
Log.d(TAG, "Bundle != null, fragment = TestFragment");
testFragment = (TestFragment) frag;
}
}
}


@Override
public void onLoginFragmentInteraction(boolean loginSuccess) {
updateUI(loginSuccess);
}

public void updateUI(boolean loggedIn) {
// User is logged in, show the main fragment
if (loggedIn) {
testFragment = new TestFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, testFragment).commit();
}
// User is logged out, show the login fragment
else {
loginFragment = new LoginFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, loginFragment).commit();
}
}

public boolean isLoggedIn() {
accessToken = AccessToken.getCurrentAccessToken();
if (accessToken != null && !accessToken.isExpired())
return true;
else
return false;
}
}

我想做的是检查用户是否已经登录。如果已经登录,则显示测试 fragment ,否则显示登录 fragment 。

所以在用户首次登录时,我通过接口(interface)回调通知Activity用户已经登录,并展示TestFragment。此外,如果用户离开应用程序然后返回,我会检查 onCreate() 方法是否通过检查访问 token 登录用户。

当用户首次登录时,它会按预期工作。但我面临的问题是,如果我终止该应用程序或将其从“最近”列表中删除,我将丢失访问 token 。 AccessToken.getCurrentAccessToken() 始终返回 null。这不是正确的处理方式吗?

最佳答案

正如您在评论中提到的。当 FacebookSDK 完成初始化时,你应该检查用户登录。
您的问题是您在 SDK 尚未完成初始化时检查了 AccessToken。为解决此问题,请在 FacebookSdk.InitializeCallback 的 onInitialized() 方法中检查 AcessToken,该方法在 SDK 初始化时调用。

FacebookSdk.sdkInitialize(getApplicationContext(), new FacebookSdk.InitializeCallback() {    @Override    public void onInitialized() {        if (isLoggedIn()) {            ..............        }    }});

关于android - 应用重启后 Facebook 访问 token 丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30288167/

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