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 ?