Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OnActivityResult sometimes not called after ACTION_GET_CONTENT intent

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?

like image 220
WPMed Avatar asked Dec 05 '17 09:12

WPMed


People also ask

What can I use instead of Startactivity for results?

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.

How do I get data from startActivityForResult?

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 .

How does onActivityResult work on Android?

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();


1 Answers

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();     } } 
like image 146
jay Avatar answered Sep 19 '22 05:09

jay