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?
In this article, we will discuss the Activity Result API, an alternative to the deprecated startActivityForResult + onActivityResult methods. We will use Kotlin in this article for the code samples. Android introduced the Activity Result APIs as a major change in the androidx. activity:activity:1.2.
First you use startActivityForResult() with parameters in the first Activity and if you want to send data from the second Activity to first Activity then pass the value using Intent with the setResult() method and get that data inside the onActivityResult() method in the first Activity .
class); startActivityForResult(i, 100); 2.In your secondActivity class write following code for onClick Event For ex: In secondActivity if you want to send back data: Intent intent= new Intent(); intent. putExtra("result",result); setResult(RESULT_OK,intent); finish();
You must add following code for taking images from devices
choosebtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i1=new Intent(); i1.setType("image/*"); i1.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(i1,1); } }); @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == 1 && resultCode == RESULT_OK && data != null && data.getData() != null) { imguri=data.getData(); mainpreview.setImageURI(data.getData()); } else { Toast.makeText(getApplicationContext(),"please choose image",Toast.LENGTH_SHORT).show(); } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With