FirebaseUI使用2个活动登录kotlin

问题描述 投票:0回答:2

FirebaseUIAuth使用2个活动进行登录。

大家好,早上好,我有问题。我使用FirebaseUI使用社交网络或电子邮件和电话进行身份验证。登录是完美的,在所有社交网络中进入会话,一切都很完美。问题是当我关闭会话时。当我关闭会话并且我想返回活动时,它不会将我返回到主要活动。它保留在第二个活动中,当我最小化应用程序并再次返回时,就会出现登录选项。

我澄清一下,第一个活动,登录按钮在哪里由同一个firebaseUI创建,我的意思是第一个活动是空白的。

我认为问题是我需要在onStart(),onResume()中使用一些方法。我不知道在这些方法中放什么,以便再次创建活动,并可以执行startActivityForResult()方法并绘制会话按钮。

我试图删除finish()方法,那些在代码中没有消除第一个活动的人,坏的是如果我这样做,将出现第一个空白活动,并且不会绘制firebaseUI提供的登录按钮。

对翻译感到抱歉 - 我使用了翻译。我希望我的问题得到了解

第一项活动

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_firebase_auth)
    if (currentUser != null && auth != null) {
        startActivity(Intent(this@FirebaseAuthActivity, SignedInActivity::class.java))
        finish()
    } else {
        authenticateUser()
    }
}

private fun authenticateUser() {
    startActivityForResult(AuthUI.getInstance()
            .createSignInIntentBuilder()
            .setTheme(R.style.CustomTheme)
            .setLogo(R.drawable.firelogo)
            .setAvailableProviders(getProviderList())
            .setIsSmartLockEnabled(true)
            .build(),
            REQUEST_CODE)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    val response: IdpResponse? = IdpResponse.fromResultIntent(data)
    if (requestCode == REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {
            startActivity(Intent(this@FirebaseAuthActivity, SignedInActivity::class.java))
            finish()
            return
        }
    }
}

private fun getProviderList(): List<AuthUI.IdpConfig> {
    val providers = ArrayList<AuthUI.IdpConfig>()
    providers.add(AuthUI.IdpConfig.EmailBuilder().build())
    providers.add(AuthUI.IdpConfig.GoogleBuilder().build())
    providers.add(AuthUI.IdpConfig.FacebookBuilder().build())
    providers.add(AuthUI.IdpConfig.TwitterBuilder().build())
    providers.add(AuthUI.IdpConfig.PhoneBuilder().build())
    return providers
}

第二项活动

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_signed_in)
    if (currentUser == null) {
        startActivity(Intent(this@SignedInActivity, FirebaseAuthActivity::class.java))
        finish()
    }
    btn_signout.setOnClickListener() {
        signOut()    }
}


private fun signOut() {
    AuthUI.getInstance()
            .signOut(this)
            .addOnCompleteListener{ task ->
                if (task.isSuccessful) {
                    startActivity(Intent (this@SignedInActivity, FirebaseAuthActivity::class.java))
                    finish()
                } else {
                    //  Report error to user
                }
            }
}

有任何想法吗。

android kotlin firebase-authentication
2个回答
0
投票

如果当前用户已登录,请移动您的支票

overload fun onStart(){}

要么

overload fun onResume(){}

我不记得哪个,因为我没有我的电脑,但我知道这是其中之一。我遇到了同样的问题+有时会让我在登录后立即登录。将支票移动到其中一个功能就可以了(但我不记得哪个),所以试试两个。编辑只想指定当我说检查当前用户时我的意思是这段代码。

If(currentUser != null){}

编辑

好的,所以我很接近......是的。我的工作是在我的主要活动中启动Firebase Auth。然后在onCreate中我有一个获取当前用户信息的功能,让我使用它。

    var mAuth: FirebaseAuth? = null
    val RC_SIGN_IN = 123

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)

    val toggle = ActionBarDrawerToggle(
            this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
    drawer_layout.addDrawerListener(toggle)
    toggle.syncState()
    nav_view.setNavigationItemSelectedListener(this)

    setUserProfile()
}

fun setUserProfile(){
    mAuth = FirebaseAuth.getInstance()
    val mUser = mAuth?.currentUser

    tvEmail.text = mUser?.email
    tvDisplayName.text = mUser?.displayName
}

在onStart()中,我做的是检查用户是否未登录我强制用户登录返回点后强制他们登录是onStart方法,然后我再次运行setUserProfile()。发生的事情是,如果我在create和onStart上都没有这样做,那么如果我在那个时间特定签名,我将只能获得currentUser数据。否则将没有错误但没有currentUser数据。

    override fun onStart() {
    super.onStart()

    if (mAuth!!.currentUser == null){
        iForced()
    }
    setUserProfile()

}

我的函数强制用户登录iForced()

    fun iForced(){
    startActivityForResult(
        AuthUI.getInstance()
                .createSignInIntentBuilder()
                .build(),
        RC_SIGN_IN)
}

我希望这不会令人困惑。


0
投票

好吧,我找到了我遇到的问题的解决方案,一些不舒服,但我解决了问题,我必须说的一些奇怪的方法loginOut()deleteAccount()方法里面的addOnCompleteListener方法我把条件 - > if (task.isSuccessful)我把它倒了 - > if (!task.isSuccessful)这引起了2种行为

第一个 - 就是在设备上,当我按下按钮关闭会话时,如果他将我发送到第一个活动,它会显示我FirebaseUI提供的按钮

第二个 - 是在模拟器中发生相反的情况,现在在设备上发生的事情现在发生在模拟器中

所以我决定删除那个条件,它是设备和模拟器上的一个宝石,他们将我返回到第一个活动,使用firebaseUI提供的按钮

那么这些方法会让他们像这样:

private fun signOut() { AuthUI.getInstance() .signOut(this@SignedInActivity) .addOnCompleteListener{ startActivity( Intent(this@SignedInActivity, FirebaseAuthActivity::class.java)) finish() } }

private fun deleteAccount() { AuthUI.getInstance() .delete(this@SignedInActivity) .addOnCompleteListener{ startActivity( Intent(this@SignedInActivity, FirebaseAuthActivity::class.java)) finish() } }

现在的问题是onBackPressed()方法

即使有人有更好的解决方案,欢迎,有条件有助于查看是否有错误。

感谢Vahalaru和Chisko的答案,他们帮助了我。

© www.soinside.com 2019 - 2024. All rights reserved.