1
votes

J'appelle startActivityForResult et je constate que onActivityResult n'est pas appelé

J'essaie de choisir une image dans la galerie et de l'appliquer à une vue de texte.

J'ai appelé la fonction startActivityForResult () et surchargé la fonction onActivityResult () mais en testant, j'ai trouvé que onActivityResult () n'est pas appelé. Quelle en serait la raison?

Il a super.onActivityResult (requestCode, resultCode, data)

var intent: Intent = Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
               startActivityForResult(intent, IMG_RESULT)


            }


        }

    }


    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
//I made this toast to see if the program arrived to onActivityResult but it never showed
        Toast.makeText(this, "Success", Toast.LENGTH_SHORT).show()

        if (resultCode == Activity.RESULT_OK)
            if (data != null) {
                val contentURI = data!!.data
                try {

                    val bitmap = MediaStore.Images.Media.getBitmap(this.contentResolver, contentURI)
                    val path = saveImage(bitmap)
                    Toast.makeText(this@MainActivity, "Image Saved!", Toast.LENGTH_SHORT).show()
                    image_blank!!.setImageBitmap(bitmap)

                } catch (e: IOException) {
                    e.printStackTrace()
                    Toast.makeText(this@MainActivity, "Failed!", Toast.LENGTH_SHORT).show()
                }


            }


    }

    fun saveImage(myBitmap: Bitmap): String {


2 commentaires

Quelle est la valeur de IMG_RESULT?


Appelez-vous startActivityForResult depuis un Fragment ou une Activity ?


3 Réponses :


0
votes

Lorsque vous utilisez android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI , il n'y a aucune garantie que l'utilisateur choisira une image.

La solution ci-dessous limitera l'utilisateur à choisir une image et ne spécifie pas à partir de quel endroit cela sera fait - l'utilisateur est libre de naviguer et de choisir ce qu'il veut.

 val intent = Intent(Intent.ACTION_GET_CONTENT)
 intent.type = "image/*"
 intent.putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/jpeg", "image/png", "image/bmp"))
 startActivityForResult(intent, IMG_RESULT)

Cette solution exacte fonctionne dans mon projet et devrait être bien prêt à l'emploi pour vous aussi.


0 commentaires

0
votes

Deux possibilités:

  1. onActivityResult () n'est jamais appelé si votre activité définit noHistory sur true.

android:noHistory="true"

Cette méthode n'est jamais appelée si votre activité définit noHistory sur true. https://developer.android.com/reference/android/app/ Activity.html # startActivityForResult

  1. le code de la requête est <0, ne déclenchera pas onActivityResult () (ne peut le trouver documenté nulle part, mais selon les commentaires de nombreux autres développeurs).

requestCode int: If> = 0, ce code sera renvoyé dans onActivityResult () lorsque l'activité se termine, comme décrit dans startActivityForResult (Intent, int).


1 commentaires

Oh, votre deuxième réponse était correcte! Mon problème était que mon IMG_RESULT était défini sur -1. Merci beaucoup!



0
votes

Si vous appelez startActivityForResult à partir d'un fragment , assurez-vous que l'activité parente propagera le résultat.

Dans votre activité

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case IMG_RESULT:
            if (resultCode = RESULT_OK) {
                // put here your code
                ...
            }
            break;
        default:
            super.onActivityResult(requestCode, resultCode, data);
    }
}

Dans votre fragment

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case A_REQUEST_CODE_USED_IN_YOUR_ACTIVITY:
            ...
            break;
        case ANOTHER_REQUEST_CODE_USED_IN_YOUR_ACTIVITY:
            ...
            break;
        default:
            // this will propagate the result to your Fragment
            super.onActivityResult(requestCode, resultCode, data);
    }
}


0 commentaires