startActivityForResult() deprecated for google sign in



我想让谷歌登录到我的应用程序,但我得到这个错误。

startActivityForResult() deprecated in java

这是我的代码:

val signInIntent = googleSignInClient.signInIntent
startActivityForResult(signInIntent,RC_SIGN_IN)

我知道,我必须使用registerForActivityResult();,但我不知道如何使用它。

驱动器上链接的代码很接近,但不完全正确。您混淆了resultCode和responseccode。你应该检查result.resultCode == Activity.RESULT_OK,而不是result.resultCode == 100在你的回调registerForActivityResult

使用旧的startActivityForResult(intent,code)流程,您将使用整数代码(例如100)启动活动,然后检查onActivityResult中的代码,以确保您正在处理正确的响应。对于回调,整数请求/响应代码不再需要或使用。

private val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result ->
if (result.resultCode == Activity.RESULT_OK) {
// handle the response in result.data
}
}

则按照别人的指示使用

val signInIntent = googleSignInClient.signInIntent
launcher.launch(signInIntent)

在这里的答案中也有一些这样的例子

目前还不是错误。这是关于已弃用方法的警告。registerForActivityResult()需要ActivityResultContract。在本例中是StartActivityForResult()。你只需要声明一个变量

private val launcher = registerForActivityResult(StartActivityForResult()){result ->  //Intent
....
}

和启动意图时需要使用launcher.launch(signInIntent)

这是警告。然而,它会让你感到奇怪,并担心未来的版本。

所以我这样做了。

val signInIntent: Intent = mGoogleSignInClient.signInIntent
launcher.launch(signInIntent)

重要的是,这里的数据来源使用谷歌意图的东西。

private val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result ->
if (result.resultCode == Activity.RESULT_OK) {
val task = GoogleSignIn.getSignedInAccountFromIntent(result.data)
handleSignInResult(task)
}
}

就是这样。它起作用了,而且没有警告。我还提出了一个问题,这是一个谜,所以如果你去看看就好了。无法生成应用包…使用mergereleaseresource


最新更新