我想让谷歌登录到我的应用程序,但我得到这个错误。
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