【问题标题】:Firebase android onAuthStateChanged not fired and result code is -1 alwaysFirebase android onAuthStateChanged 未触发,结果代码始终为 -1
【发布时间】:2017-02-11 15:49:38
【问题描述】:

我有一个签名活动,我正在为我的应用使用 Firebase 身份验证和 firebase UI。我的登录屏幕上有两个按钮 Google + 和一个用于电子邮件密码组合的按钮。

我有两个问题

我的身份验证状态更改未触发,在我的 onActivityResult 中,我的结果代码始终为 -1

当我关闭我的应用并重新安装/重新运行我的应用时,我会进入一个空白屏幕。

请查看下方的签名活动

public class SigninActivity extends AppCompatActivity {

public static final String ANONYMOUS = "anonymous";
public static final int RC_SIGN_IN = 1;
private static final String TAG = "SigninActivity";

//private MessageAdapter mMessageAdapter;
private ProgressBar mProgressBar;

private String mUsername, loginUser;

// Firebase instance variables
private FirebaseAuth mFirebaseAuth;
private FirebaseAuth.AuthStateListener mAuthStateListener;
private FirebaseDatabase mFirebaseDatabase;
private FirebaseStorage mFirebaseStorage;
private DatabaseReference mMessagesDatabaseReference;
private StorageReference mChatPhotosStorageReference;
private View mLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mLayout = findViewById(android.R.id.content);
    mUsername = ANONYMOUS;
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    // Initialize Firebase components
    mFirebaseAuth = FirebaseAuth.getInstance();
    mFirebaseStorage = FirebaseStorage.getInstance();

    // Initialize references to views
    mProgressBar = (ProgressBar) findViewById(R.id.progressBar);

    // Initialize progress bar
    mProgressBar.setVisibility(ProgressBar.INVISIBLE);

    mAuthStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();;
            Log.d("onAuthStateChanged", String.valueOf(user));
            if (user != null) {
                if (user.getDisplayName() != null) {
                    loginUser = onSignedInInitialize(user.getDisplayName());
                } else {
                    loginUser = onSignedInInitialize(getString(R.string.email_user));
                }
                // User is signed in
            } else {
                // User is signed out
                startActivityForResult(
                        AuthUI.getInstance()
                                .createSignInIntentBuilder()
                                .setProviders(
                                        AuthUI.EMAIL_PROVIDER,
                                        AuthUI.GOOGLE_PROVIDER)
                                .setTheme(R.style.GreenTheme)
                                .build(),
                        RC_SIGN_IN);
            }
        }
    };
}

@Override
protected void onStart() {
    super.onStart();
    mFirebaseAuth.addAuthStateListener(mAuthStateListener);
}

@Override
protected void onStop() {
    super.onStop();
    if (mAuthStateListener != null) {
        mFirebaseAuth.removeAuthStateListener(mAuthStateListener);
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == RC_SIGN_IN) {
        Log.d("requestCode", String.valueOf(requestCode));
        Log.d("resultCode", String.valueOf(resultCode));
        Log.d("data", String.valueOf(data));

        if (resultCode == RESULT_OK) {
            // Sign-in succeeded, set up the UI
            Snackbar.make(mLayout, getString(R.string.signin_string),
                    Snackbar.LENGTH_LONG).show();
            Intent intent = new Intent(getApplicationContext(), MainActivity.class);
            startActivity(intent);
        } else if (resultCode == RESULT_CANCELED) {
            // Sign in was canceled by the user, finish the activity
            Snackbar.make(mLayout, getString(R.string.signin_cancel),
                    Snackbar.LENGTH_LONG).show();
            finish();
        }
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.sign_out_menu:
            AuthUI.getInstance().signOut(this);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

private String onSignedInInitialize(String username) {
    if (username != null) {
        mUsername = username;
    } else {
        mUsername = getString(R.string.email_sign);
    }
    return username;
}
}

追踪:

我尝试调试我的代码,requestCode 为 1(如预期的那样,但结果代码为 -1)

02-11 10:34:19.609 4429-4429/App_Name D/requestCode:1

02-11 10:34:19.609 4429-4429/App_Name D/resultCode:-1

【问题讨论】:

  • 您的跟踪显示 resultCode 为 -1。该值为Activity.RESULT_OK。这意味着您对AuthUIrequestCodeRC_SIGN_IN(等于1)的调用成功。该活动结果的出现也意味着您的AuthStateListener 正在触发,因为这是您调用AuthUI 的地方。你能进一步解释问题是什么吗?
  • 问题是,当我关闭我的应用程序(在后台关闭而不退出)并打开我的应用程序时,我得到一个空白屏幕
  • 请注意,成功登录会保留在设备上,直到用户退出。看起来如果SigninActivity 在用户已经登录时启动,它会调用onSignedInInitialize(),然后not finish()。这可能是您看到的空白画面吗?
  • 这回答了问题,空白屏幕即将完成。我在开始活动之前使用了标准 FLAGS,它有助于解决问题

标签: android firebase firebase-authentication


【解决方案1】:

qbix 的回复帮助解决了我的问题

【讨论】:

  • 应提供解决方案或解释。
猜你喜欢
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2016-10-07
  • 2020-10-17
  • 2020-08-26
  • 2012-12-09
  • 1970-01-01
  • 2017-04-10
相关资源
最近更新 更多