GOOGLE ADS

jueves, 14 de abril de 2022

¿Cómo manejar Activity.onActivityResult() con Jetpack Compose?

Estoy tratando de implementar sugerencias de inicio de sesión en mi aplicación de Android usando Jetpack Compose, pero esta API requiere una Activitypara funcionar.

fun showPhoneNumberHint(activity: Activity) {
val hintRequest: HintRequest = HintRequest.Builder()
.setPhoneNumberIdentifierSupported(true)
.build()
val intent = Auth.CredentialsApi.getHintPickerIntent(apiClient, hintRequest)
val requestCode = 12345
try {
startIntentSenderForResult(activity, intent.intentSender, requestCode, null, 0, 0, 0, null)
} catch (exception: SendIntentException) {
// Error handling
}
}

Así que supongo que tendré que pasar el objeto Actividad hasta Composable donde se necesita, lo que no parece muy limpio pero debería funcionar.

Pero ahora el resultado de la sugerencia se recibirá en la Actividad onActivityResult()y no estoy seguro de cuál es la forma correcta de devolverlo al Composable donde se necesita.

¿Hay alguna forma limpia/estándar/alternativa de hacer esto? Preferiblemente mantendría toda esta lógica contenida dentro del Composable.


Solución del problema

Activity.onActivityResult()está en desuso y no debe usarlo incluso sin componer. Debe usar las API de resultados de actividad introducidas en AndroidX Activity and Fragment.

Las API de resultados de actividad proporcionan una registerForActivityResult()API para registrar la devolución de llamada del resultado. registerForActivityResult()toma an ActivityResultContracty an ActivityResultCallbacky devuelve an ActivityResultLauncherque usará para iniciar la otra actividad.

Ejemplo sin componer:

val getContent = registerForActivityResult(GetContent()) { uri: Uri? ->
// Handle the returned Uri
}
override fun onCreate(savedInstanceState: Bundle?) {
//...
val selectButton = findViewById<Button>(R.id.select_button)
selectButton.setOnClickListener {
// Pass in the mime type you'd like to allow the user to select
// as the input
getContent.launch("image/*")
}
}

En el uso de redacción rememberLauncherForActivityResult()en lugar de registerForActivityResult:

val result = remember { mutableStateOf<Bitmap?>(null) }
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.TakePicturePreview()) {
result.value = it
}
Button(onClick = { launcher.launch() }) {
Text(text = "Take a picture")
}
result.value?.let { image ->
Image(image.asImageBitmap(), null, modifier = Modifier.fillMaxWidth())
}

El problema con la API que está tratando de usar es que requiere el uso de onActivityResult. Entonces, no tienes otra opción que usarla. Intente abrir un problema en github solicitando actualizar su API.

No hay comentarios:

Publicar un comentario

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...