应用程序重启后Facebook访问令牌丢失

时间:2015-05-17 14:54:06

标签: android facebook android-fragments facebook-access-token facebook-sdk-4.0

我正在使用Facebook SDK 4.0并使用内置的LoginButton。 我有一个Fragment,其中包含LoginButton,另一个只包含一个TextBox。

以下是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);
}
}

活动看起来像这样:

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;
}
}

我想要做的是检查用户是否已经登录。如果有,则显示测试片段,否则我会显示登录片段。

因此,当用户首次登录时,我使用接口回调来通知Activity用户已登录并显示TestFragment。此外,如果用户离开应用程序然后返回,我会检查用户是否通过检查访问令牌登录onCreate()方法。

当用户首次登录时,它可以根据需要运行。 但我面临的问题是,如果我杀死应用程序或将其从“最近”列表中删除,我将丢失访问令牌。 AccessToken.getCurrentAccessToken()始终返回null。 这不是处理它的正确方法吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

登录成功后,将访问令牌保存在某处。到数据库或共享首选项。当您的应用开始时,请检查是否存在访问令牌以及是否有效。

相关问题