I'm working on an image editing Android application. In one of my activities I call an intent to pick an image from the gallery in onCreate() like this:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);
Then I receive data like this:
@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");
}
}
The loadImage
method:
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;
}
Now my problem is that sometimes I see NPE-s in Crashlytics claiming that photoBitmap is null when the user presses the next button.
@OnClick(R.id.toolbar_next)
void onToolbarNextClick() {
float originalScale = (float) (previewImageView.getHeight()) / (float) (photoBitmap.getHeight());
...
}
The only Crashlytics log I see is that the user leaves for the intent (I placed a Crashlytics log inside onPause
). No log for onActivityResult
, so my best guess is that onActivityResult
is not called, thus my bitmap is not loaded, thus it will be null when the user presses next.
Question: why is onActivityResult
called sometimes, and sometimes not? Are there any other possible causes of photoBitmap
being null?
photoBitmap.getHeight());
. Do not use this code ifphotoBitmap==null
. Thats all! Check for null before use. – ThoronimageUri
inonActivityResult
, but you don't pass it intoloadImage()
. Could it be, that this causes the NPE? – Perseus