39 votes

OnActivityResult n'est parfois pas appelé après l'intention ACTION_GET_CONTENT

Je travaille sur une application Android d'édition d'images. Dans une de mes activités, j'appelle une intention pour choisir une image dans la galerie dans onCreate comme ceci :

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);

Je reçois alors des données comme celles-ci :

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Crashlytics.log("onActivityResult called");
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == PICK_IMAGE && resultCode == Activity.RESULT_OK && data != null) {
        Crashlytics.log("Data received from image pick intent");
        imageUri = data.getData();
        loadImage();
    } else {
        //if we do not select a picture, go back to the dashboard
        Crashlytics.log("Data not received");
        onBackPressed();
        Log.d(TAG, "no picture selected");
    }
}

El loadImage méthode :

private void loadImage() {
    try {
        photoBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
    } catch (IOException e) {
        Crashlytics.log("IOException from getBitmap");
        Log.d(TAG, e.getMessage());
        showToastAndPressBack();
        return;
    }

    if (photoBitmap == null) {
        Crashlytics.log("photoBitmap is null in onActivityResult");
        showToastAndPressBack();
        return;
    }

    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    imgVWidth = size.x;
    int height = size.y;
    imgVHeight = (int) (((float) imgVWidth / photoBitmap.getWidth()) * photoBitmap.getHeight());
    photoInImgViewBitmap = Bitmap.createScaledBitmap(photoBitmap, imgVWidth, imgVHeight, true);
    imageAlreadyPicked = true;
}

Maintenant, mon problème est que parfois je vois des NPE dans Crashlytics prétendant que photoBitmap est nulle lorsque l'utilisateur appuie sur le bouton suivant.

@OnClick(R.id.toolbar_next)
void onToolbarNextClick() {
    float originalScale = (float) (previewImageView.getHeight()) / (float) (photoBitmap.getHeight());
    ...
}

Le seul journal Crashlytics que je vois est que l'utilisateur part pour l'intention (j'ai placé un journal Crashlytics à l'intérieur de onPause ). Pas de journal pour onActivityResult donc ma meilleure supposition est que onActivityResult n'est pas appelé, donc mon bitmap n'est pas chargé, donc il sera nul lorsque l'utilisateur appuiera sur next.

Question : pourquoi onActivityResult appelé parfois, et parfois non ? Y a-t-il d'autres causes possibles de photoBitmap étant nulle ?

-1voto

NITHIN VARGHESE Points 112

Pour démarrer l'activité de la caméra, utilisez ce code

   Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(cameraIntent, CAMERA_REQUEST);

Pour obtenir le bitmap

 @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == Activity.RESULT_OK){
        if(requestCode==CAMERA_REQUEST) {
            Bitmap photo = (Bitmap) data.getExtras().get("data"); }
         }else{
           //Camera request cancelled}
        }

-1voto

Dithesh Points 4

Essayez ceci, ça a marché parfaitement

     Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(i, LOAD_IMAGE_RESULTS);

  @SuppressLint("Recycle")
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

           if (requestCode == LOAD_IMAGE_RESULTS && resultCode == RESULT_OK && data != null) {
                    // Let's read picked image data - its URI
                    Uri pickedImage = data.getData();

                    // Let's read picked image path using content resolver
                    String[] filePath = {MediaStore.Images.Media.DATA};
                    @SuppressLint("Recycle") Cursor cursor = null;
                    if (pickedImage != null) {
                        cursor = getContentResolver().query(pickedImage, filePath, null, null, null);
                    }
                    if (cursor != null) {
                        cursor.moveToFirst();

                        String imagePath = cursor.getString(cursor.getColumnIndex(filePath[0]));
      }
    }
}

vous pouvez maintenant convertir imagepath en bitmap

-1voto

danny117 Points 1978

Appelez super.onActivityResult après votre code la dernière ligne de la méthode. Vous avez dit à Android que vous avez terminé lorsque vous appelez le super.

J'ai aussi remarqué que vous enregistrez une séquence de caractères. Ne faites pas ça, vous n'allez rien arranger avec ça.

 Crashlytics.log("Data not received");

Vous devez sauvegarder certaines données. Considéré comme l'utilisateur a annulé parce que votre code ne capture pas cela.

/* suppose que la méthode log a une entrée int */

Crashlytics.log("Data not received");
Crashlytics.log(requestCode);
Crashlytics.log(resultCode);

-1voto

ANUJ TAYAL Points 56

Utilisez cette option pour choisir dans la galerie :

Intent i = new Intent(Intent.ACTION_PICK);
i.setType("image/*");
startActivityForResult(i, REQUEST_CODE);

Maintenant vous obtiendrez un callback dans onActivityResult :

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case REQUEST_CODE:
            if (resultCode != RESULT_CANCELED) {
//use data to get the selected image
            }
            break;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X