在我的应用中,我正在尝试实施Facebook登录。我在启动后有一个IntroLogin Activity来确定用户是否已经登录。如果用户已登录,则会直接加载MainActivity。否则,它会要求用户登录。
我确定用户是否登录的方法在Android 6+中运行良好。但是,在Android Lollipop中,在用户登录后(用户获取应用程序身份验证以在弹出窗口中使用该信息),该应用程序将关闭。我在日志中没有FC或任何消息。它刚关闭。即使用户重新启动应用程序,它也会再次提示登录。
我的IntroLogin活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_intro_login);
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
loginButton = (Button) findViewById(R.id.login_button);
FacebookSdk.sdkInitialize(getApplicationContext());
callbackManager = CallbackManager.Factory.create();
AccessToken accessToken = AccessToken.getCurrentAccessToken();
if(accessToken != null){
finish();
}
else{
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
PopupLogin();
}
});
}
}
public void PopupLogin() {
// Set permissions
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile"));
LoginManager.getInstance().setLoginBehavior(LoginBehavior.WEB_VIEW_ONLY).registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.i(TAG, "onSuccess: " + loginResult);
startActivity(new Intent(IntroLogin.this, MainActivity.class));
finish();
}
@Override
public void onCancel() {
Log.d("MyApp", "Login canceled");
Snackbar snackbar = Snackbar.make(loginButton, "Login process canceled", Snackbar.LENGTH_INDEFINITE);
snackbar.getView().setBackgroundColor(ContextCompat.getColor(IntroLogin.this, R.color.colorPrimaryDark));
snackbar.setActionTextColor(ContextCompat.getColor(IntroLogin.this, R.color.pure_white));
snackbar.setAction(R.string.retry_login, new View.OnClickListener() {
@Override
public void onClick(View view) {
loginButton.performClick();
}
});
snackbar.show();
}
@Override
public void onError(FacebookException error) {
Log.d("Myapp", error.toString());
Toast.makeText(IntroLogin.this, error.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
更新
我找到原因但不是解决方案,我认为OnActivityResult
没有在棒棒糖中被调用,这可能是我没有看到任何记录的原因。
答案 0 :(得分:0)
你应该在调用super.oncreate()
之后初始化你的facebooksdk
此外,您在finish()
时调用accessToken != null
,这意味着当用户已登录Facebook时,它将关闭活动..
将onCreate()方法代码更改为:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
setContentView(R.layout.activity_intro_login);
callbackManager = CallbackManager.Factory.create();
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
loginButton = (Button) findViewById(R.id.login_button);
updateWithToken(AccessToken.getCurrentAccessToken());
accessTokenTracker = new AccessTokenTracker() {
@Override
protected void onCurrentAccessTokenChanged(AccessToken oldToken, AccessToken newToken) {
updateWithToken(newToken);
}
};
accessTokenTracker.startTracking();
}
private void updateWithToken(AccessToken currentAccessToken) {
if (currentAccessToken != null) {
Log.d("FB", "User Logged IN.");
//programetically logout user or do your on success
LoginManager.getInstance().logOut();
} else {
Log.d("FB", "User Logged Out.");
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
PopupLogin();
}
});
}
}
答案 1 :(得分:0)
找出原因。我在loginActivity中添加了android:launchMode="singleTop"
,这就是OnActivityResult没有调用的原因。