状況に応じて、さまざまなアクティビティを呼び出すエントリポイントとして機能するメインアクティビティがあります。特に、Firebase Authを使用してユーザーのサインインを管理しています。
_startActivityForResult(
AuthUI.getInstance().createSignInIntentBuilder()
.setAvailableProviders(providers)
.build(),
RC_SIGN_IN)
_
返されたインテント/データを区別するためにonActivityResult()
を上書きします。次に例を示します。
_ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
REQUEST_CODE_1 -> {
// update UI and stuff
}
RC_SIGN_IN -> {
// check Firebase log in
}
// ...
}
}
_
documentation で強く推奨されているアクティビティ結果APIでは、ActivityResultLauncher
の前にprepareCall()
を作成し、アクティビティが作成済み状態であることを確認する必要があります起動しても、複数のアクティビティの結果をonActivityResult()
のように(少なくとも1か所で)正常に処理する方法がわかりません。
この記事 を見ると、ActivityResultContract
型の子内部クラスmultipleを実装する必要があるようです(したがって、複数のprepareCall()
's?)、それらは異なるcontractsであると想定されるため、私は正しいですか?上記のonActivityResult()
ロジックを反映したスケルトンの例を誰かに見せてもらえますか?
この場合、AuthUIによって返されたものはすでにインテントだったので、以下の例のように使用します。
private val startForResult =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
when(result.resultCode){
RESULT_OK -> {
val intent = result.data
// Handle the Intent...
mUser = FirebaseAuth.getInstance().currentUser
}
RESULT_CANCELED -> {
} else -> {
} }
}
以下を使用して、どこからでも(ボタンのクリックなどで)アクティビティを開始します。
AuthUI.getInstance().createSignInIntentBuilder().setAvailableProviders(providers)
.build().apply {
startForResult.launch(this)
}
結果のアクティビティは必要な数だけ呼び出すことができ、それぞれに個別のコールバックがあります。
val startForResult = prepareCall(ActivityResultContracts.StartActivityForResult())
{ result: ActivityResult ->
if (result.resultCode == Activity.RESULT_OK) {
// you will get result here in result.data
}
}
}
startForResult(Intent(activity, CameraCaptureActivity::class.Java))
アクティビティクラスを指定するだけです-CameraCaptureActivity::class.Java