Android: crash after cropping image when updating OS version to 5.1.1

I updated the version of Android OS 5 to version 5.1.1, and also updated the Google Camera app and Google Photos. After that, when I tried to capture the image and crop it, my application crashes with the following error:

FATAL EXCEPTION: main Process: com.app.test, PID: 4857 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { typ=image/jpeg }} to activity {com.app.test/com.app.test.newActivity.activities.TestActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String)' on a null object reference at android.app.ActivityThread.deliverResults(ActivityThread.java:3574) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3617) at android.app.ActivityThread.access$1300(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1352) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String)' on a null object reference at com.app.test.newActivity.activities.TestActivity.onActivityResult(TestActivity.java:127) at android.app.Activity.dispatchActivityResult(Activity.java:6192) at android.app.ActivityThread.deliverResults(ActivityThread.java:3570)             at android.app.ActivityThread.handleSendResult(ActivityThread.java:3617)             at android.app.ActivityThread.access$1300(ActivityThread.java:151)             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1352)             at android.os.Handler.dispatchMessage(Handler.java:102)             at android.os.Looper.loop(Looper.java:135)             at android.app.ActivityThread.main(ActivityThread.java:5254)             at java.lang.reflect.Method.invoke(Native Method)             at java.lang.reflect.Method.invoke(Method.java:372)             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

It used to work fine. The code I used is as follows:

Image Code:

 try { Intent imageCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (imageCapture.resolveActivity(getContext().getPackageManager()) != null) { imageCapture.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory().getAbsolutePath() + Constants.image_path))); startActivityForResult(imageCapture, Constants.CAMERA_IMAGE_CAPTURE); } } catch (ActivityNotFoundException anfe) { Toast.makeText(getContext(), "device doesn't support capturing images!", Toast.LENGTH_SHORT).show(); } 

Image coding

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); if (resultCode == RESULT_OK) { if (requestCode == CAMERA_IAMGE_CROP) { Bundle extras = intent.getExtras();//intent.getExtras() is always returns NULL here Bitmap thePic = extras.getParcelable("data"); //setImageOnImageView(thePic); } else if (requestCode == Constants.CAMERA_IMAGE_CAPTURE)) { processCapturedImage(); } } } private void processCapturedImage() { try { String path = Environment.getExternalStorageDirectory().getAbsolutePath() + Constants.image_path; File file = new File(path); if (file.exists()) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.RGB_565; Bitmap bm = BitmapFactory.decodeFile(path, options); int rotate = AndroidUtils.getRotateValue(file.getAbsolutePath()); if (rotate != 0) { Debug.print("Profile pic rotation value is not 0."); /****** Image rotation ****/ Matrix matrix = new Matrix(); matrix.postRotate(rotate); bm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true); } picUri = getImageUri(getApplicationContext(), bm); performCropAction(); } else { Tools.showToast(EditProfileActivity.this, "Error occurred, please try again."); } } catch (Exception e) { Debug.printException(e); } } private void performCropAction() { try { Intent cropAction = new Intent("com.android.camera.action.CROP"); cropAction.setDataAndType(picUri, "image/*"); cropAction.putExtra("crop", "true"); cropAction.putExtra("aspectX", 1); cropAction.putExtra("aspectY", 1); cropAction.putExtra("outputX", AS.getInPixels(100)); cropAction.putExtra("outputY", AS.getInPixels(100)); cropAction.putExtra("return-data", true); startActivityForResult(cropAction, CAMERA_IAMGE_CROP); } catch (ActivityNotFoundException anfe) { Toast.makeText(this, "your device doesn't support the crop action!", Toast.LENGTH_SHORT).show(); } } 

As you can see, Additional Extras = aim.getExtras (); Here intur.getExtras () always returns NULL.

Any help really appreciated! Thanks.

+6
source share
3 answers

Over Android 5.0. Returning the URI in the onActivityResult function handles it with the phone version accordingly.

 Bitmap selectedBitmap; if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { Bundle extras = data.getExtras(); selectedBitmap = extras.getParcelable("data"); } else{ Uri uri = data.getData(); selectedBitmap=MediaStore.Images.Media.getBitmap(this.getContentResolver(),uri); } 

Hope this helps!

+5
source

I have the same problem. The new CROP action does not use the onActivityResult () method. Resolution: copy the file to the folder where you want to save the cropped image, run "com.android.camera.action.CROP" with the previously copied file. When the user clicks the "Save" button after cropping, the new copied file will be replaced with the cropped image. Ask me if you have any questions.

+2
source

@nikash Solution number one: if you want to use only the standard Camera Crop activity for Android, you should know that the new camera activity (Android 5.1.1) does not return anything for the onActivityResult () method. It just crop the image you provide. If you provide Crop Activity with the original image, it will replace the original image with the new cropped one. He cannot save it separately. You can create a copy of the original image (do not put this copy in the application data folder, since the camera does not have any permissions to work with any files in your actions folder). After that, you can send a new link of the copied image to Camera crop activity. Then, after cropping, you can move the cropped (to the copied) image to any desired folder.

Solution number two: better than the first. You can use this image trimmer: https://android-arsenal.com/details/1/207

The second solution is better than the first. Easy to use, easy to implement, and you donโ€™t like the errors of other devices. It will work everywhere without the standard Camera Crop feature. Your application may be API7 or higher. Remember to put the โ€œcompileโ€ com.edmodo: cropper: 1.0.1 '' into your gradle file. Compilation. And enjoy it.

Use case: Main activity:

 Intent cropIntent = new Intent(Main.this, CropActivity.class); cropIntent.putExtra("from", input.getAbsolutePath()); cropIntent.putExtra("to", output.getAbsolutePath()); startActivityForResult(cropIntent, CROP_IMAGE); 

Harvest Activity:

 Bitmap bmp = BitmapFactory.decodeFile(new File(getIntent().getExtras().getString("from")).getAbsolutePath()); cropImageView.setImageBitmap(bmp); saveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getIntent().putExtra("bitmap", cropImageView.getCroppedImage()); setResult(RESULT_OK, getIntent()); finish(); } }); 

After you can get it in the Main activity:

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK && data != null && requestCode == CROP_IMAGE) { croppedBitmap.setImageBitmap((Bitmap) data.getParcelableExtra("bitmap")); } } 

The cropping image scale should contain:

 <com.edmodo.cropper.CropImageView xmlns:custom="http://schemas.android.com/apk/res-auto" android:id="@+id/CropImageView" android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content" custom:aspectRatioX="5" /> 

Here you can find more about usage: https://github.com/edmodo/cropper/wiki

+2
source

Source: https://habr.com/ru/post/989273/


All Articles