es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

registerForActivityResult y onActivityResult son términos de programación en Kotlin. – registerForActivityResult se traduce como “registrarse para recibir el resultado de una actividad”. – onActivityResult se traduce como “acción que se ejecuta una vez que se ha recibido el resultado de una actividad”.

Actualmente estoy tratando de aprender de un tutorial paso a paso para cargar una imagen o archivo en mi servidor mientras uso Volley. Este tutorial está un poco desactualizado y realmente no entiendo cómo puedo solucionar estos problemas.

El tutorial:

  1. ‘onActivityResult (Int, Int, Intent?): Unit’ está obsoleto. Obsoleto en Java.

  2. El fragmento está intentando registrarse para recibirActivityResult después de haber sido creado. Los fragmentos deben llamar a registerForActivityResult() antes de ser creados (es decir, inicialización, onAttach() o onCreate()).

Mi código:

Kotlin

//Subiendo fotos
private fun launchGallery() {
val intent = Intent(Intent.ACTION_PICK)
intent.type = “image/*”
var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
// No hay códigos de solicitud
val data: Intent? = result.data
}
}
}

private fun uploadImage() {
imageData ?: return
val request = object : VolleyFileUploadRequest(
Request.Method.POST,
postURL,
{
println(“la respuesta es: $ it”)
},
{
println(“el error es: $ it”)
}
) {
override fun getByteData(): MutableMap<string, filedatapart=””> {
var params = HashMap<string, filedatapart=””>()
params[“imageFile”] = FileDataPart(“image”, imageData!!, “jpeg”)
return params
}
}
Volley.newRequestQueue(requireContext()).add(request)
}

@Throws(IOException::class)
private fun createImageData(uri: Uri) {
val inputStream = requireContext().contentResolver.openInputStream(uri)
inputStream?.buffered()?.use {
imageData = it.readBytes()
}
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (resultCode == Activity.RESULT_OK && requestCode == IMAGE_PICK_CODE) {
val uri = data?.data
if (uri != null) {
imageView.setImageURI(uri)
createImageData(uri)
}
}
super.onActivityResult(requestCode, resultCode, data)
}</string,></string,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para solucionar la función obsoleta de onActivityResult, podemos reemplazarla con la nueva versión de la función que es registerForActivityResult.

    Para solucionar el segundo problema en el que el fragmento intenta registrarse para un resultado de actividad después de haber sido creado, podemos llamar a registerForActivityResult en el método de ciclo de vida onCreate o onViewCreated.

    Código actualizado:

    //Subir fotos
    private lateinit var resultLauncher: ActivityResultLauncher<intent>
    private var imageData: ByteArray? = null
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    
        resultLauncher = registerForActivityResult(
            ActivityResultContracts.StartActivityForResult()
        ) { result ->
            if (result.resultCode == Activity.RESULT_OK) {
                // No hay códigos de solicitud
                val data: Intent? = result.data
                if (data != null) {
                    val uri = data.data
                    if (uri != null) {
                        imageView.setImageURI(uri)
                        createImageData(uri)
                    }
                }
            }
        }
    }
    
    private fun launchGallery() {
        val intent = Intent(Intent.ACTION_PICK)
        intent.type = "image/*"
        resultLauncher.launch(intent)
    }
    
    private fun uploadImage() {
        imageData?: return
        val request = object : VolleyFileUploadRequest(
            Request.Method.POST,
            postURL,
            {
                println("La respuesta es: $it")
            },
            {
                println("El error es: $it")
            }
        ) {
            override fun getByteData(): MutableMap<string, filedatapart=""> {
                var params = HashMap<string, filedatapart="">()
                params["imageFile"] = FileDataPart("image", imageData!!, "jpeg")
                return params
            }
        }
        Volley.newRequestQueue(requireContext()).add(request)
    }
    
    @Throws(IOException::class)
    private fun createImageData(uri: Uri) {
        val inputStream = requireContext().contentResolver.openInputStream(uri)
        inputStream?.buffered()?.use {
            imageData = it.readBytes()
        }
    }
    

    En esta actualización, hemos movido la variable resultLauncher fuera de la función y la hemos inicializado dentro del método de ciclo de vida onViewCreated. Luego, hemos reemplazado la función antigua onActivityResult con la nueva función resultLauncher.launch dentro de la función launchGallery. Finalmente, hemos eliminado la función antigua onActivityResult.</string,></string,>

Comments are closed.