Crop does not work for gallery images

前端 未结 3 1841
闹比i
闹比i 2020-12-07 05:00

I am using the following code to crop images from camera and gallery :

private void doCrop() {
    final ArrayList cropOptions = new ArrayL         


        
相关标签:
3条回答
  • 2020-12-07 05:21

    Hi Can u Try this,

    @Override
        public void onActivityResult(final int requestCode, int resultCode,
                Intent data) {
            try {
                switch (requestCode) {
                case GALLERY_PIC_REQUEST:
                    if (resultCode == RESULT_OK) {
                        try {
                            picUri = data.getData();
                            System.out.println("Image Path::>  "+picUri.getPath());
                            performCrop();
                        } catch (Exception e) {
                            ShowDialog_Ok("Error", "Couldn't load photo");
                        }
                    }
                    break;
                case CAMERA_PIC_REQUEST:
                    if (resultCode == RESULT_OK) {
                        try {
                            picUri = data.getData();
                            System.out.println("Image Path::>  "+picUri.getPath());
                            performCrop();
                        } catch (Exception e) {
                            ShowDialog_Ok("Error", "Couldn't load photo");
                        }
                    }
                    break;
                case CROP_PIC_REQUEST:
                    Bitmap bitmap;
                    String path = "";
                    if (resultCode == RESULT_OK) {
                        String oldPath = fashionlyPreferences.getImagePath();
                        try {
                            picUri = data.getData();
                            path = Helper.GetPathFromURI(context, picUri);
                            bitmap  = BitmapFactory.decodeFile(path);
                            Img_View.setImageBitmap(bitmap);
                        } catch (Exception e) {
                            ShowDialog_Ok("Error", "Couldn't load photo");
                        }
                    }
    
                    break;
                }
            } catch (Exception e) {
            }
        }
    

    //Function for Crop

    private void performCrop() {
                    // take care of exceptions
                    try {
                        if (picUri!=null) {
                             Intent cropIntent = new Intent("com.android.camera.action.CROP");
                             cropIntent.setDataAndType(picUri, "image/*");
                             cropIntent.putExtra("crop", "true");
                             cropIntent.putExtra("scale", true);
                             cropIntent.putExtra("aspectX", 0);
                             cropIntent.putExtra("aspectY", 0);
                            //cropIntent.putExtra("outputX", 400); 
                            // cropIntent.putExtra("outputY", 400);
                             cropIntent.putExtra("return-data", false);
                             startActivityForResult(cropIntent, CROP_PIC_REQUEST);
                        }
                    }
                    // respond to users whose devices do not support the crop action
                    catch (ActivityNotFoundException anfe) {
                        Toast.makeText(this, "This device doesn't support the crop action!", Toast.LENGTH_SHORT).show();
                    }
             }
    
    0 讨论(0)
  • 2020-12-07 05:22

    please use library project for crop image form camera or gallery . perfect it will work.

    https://github.com/biokys/cropimage

    0 讨论(0)
  • 2020-12-07 05:28

    Try this Working code

    Buttonclick to take camera

    dialog.show();
    

    Add this inside Oncreate()

    captureImageInitialization();
    

    try this it will work

    // for camera
    
        private void captureImageInitialization() {
            try {
                /**
                 * a selector dialog to display two image source options, from
                 * camera ‘Take from camera’ and from existing files ‘Select from
                 * gallery’
                 */
                final String[] items = new String[] { "Take from camera",
                        "Select from gallery" };
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                        android.R.layout.select_dialog_item, items);
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
    
                builder.setTitle("Select Image");
                builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int item) { // pick
                                                                            // from
                                                                            // camera
                        if (item == 0) {
                            /**
                             * To take a photo from camera, pass intent action
                             * ‘MediaStore.ACTION_IMAGE_CAPTURE‘ to open the camera
                             * app.
                             */
                            Intent intent = new Intent(
                                    MediaStore.ACTION_IMAGE_CAPTURE);
    
                            /**
                             * Also specify the Uri to save the image on specified
                             * path and file name. Note that this Uri variable also
                             * used by gallery app to hold the selected image path.
                             */
                            mImageCaptureUri = Uri.fromFile(new File(Environment
                                    .getExternalStorageDirectory(), "tmp_avatar_"
                                    + String.valueOf(System.currentTimeMillis())
                                    + ".jpg"));
    
                            intent.putExtra(
                                    android.provider.MediaStore.EXTRA_OUTPUT,
                                    mImageCaptureUri);
    
                            try {
                                intent.putExtra("return-data", true);
                                // intent.putExtra("return-data1", true);
    
                                startActivityForResult(intent, PICK_FROM_CAMERA);
                                // finish();
                            } catch (ActivityNotFoundException e) {
                                e.printStackTrace();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
    
                        } else {
                            // pick from file
                            /**
                             * To select an image from existing files, use
                             * Intent.createChooser to open image chooser. Android
                             * will automatically display a list of supported
                             * applications, such as image gallery or file manager.
                             */
                            /*
                             * Intent intent = new Intent();
                             * 
                             * intent.setType("image/*");
                             * intent.setAction(Intent.ACTION_GET_CONTENT);
                             * 
                             * startActivityForResult(Intent.createChooser(intent,
                             * "Complete action using"), PICK_FROM_FILE);
                             */
    
                            try {
    
    
                                Intent intent = new Intent();
                                intent = new Intent(Intent.ACTION_PICK);
                                intent.setType("*/*");
                                intent.putExtra(
                                        android.provider.MediaStore.EXTRA_OUTPUT,
                                        mImageCaptureUri);
                                startActivityForResult(Intent.createChooser(intent,
                                        "Complete action using"), PICK_FROM_FILE);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
    
                        }
                    }
                });
    
                dialog = builder.create();
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
            } catch (OutOfMemoryError o) {
                o.printStackTrace();
            }
    
        }
    
        public class CropOptionAdapter extends ArrayAdapter<CropOption> {
    
            private ArrayList<CropOption> mOptions;
            private LayoutInflater mInflater;
    
            public CropOptionAdapter(Context context, ArrayList<CropOption> options) {
                super(context, R.layout.crop_selector, options);
    
                mOptions = options;
    
                mInflater = LayoutInflater.from(context);
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup group) {
                // new try
                try {
    
                    if (convertView == null)
                        convertView = mInflater.inflate(R.layout.crop_selector,
                                null);
    
                    CropOption item = mOptions.get(position);
    
                    if (item != null) {
                        ((ImageView) convertView.findViewById(R.id.iv_icon))
                                .setImageDrawable(item.icon);
                        ((TextView) convertView.findViewById(R.id.tv_name))
                                .setText(item.title);
    
                        return convertView;
                    }
    
                    return null;
    
                } catch (Exception e) {
    
                    e.printStackTrace();
    
                }
    
                if (convertView == null)
                    convertView = mInflater.inflate(R.layout.crop_selector, null);
    
                CropOption item = mOptions.get(position);
    
                if (item != null) {
                    ((ImageView) convertView.findViewById(R.id.iv_icon))
                            .setImageDrawable(item.icon);
                    ((TextView) convertView.findViewById(R.id.tv_name))
                            .setText(item.title);
    
                    return convertView;
                }
    
                return null;
            }
        }
    
        public class CropOption {
            public CharSequence title;
            public Drawable icon;
            public Intent appIntent;
        }
    
    
    
    // Method for Crop
                private void doCrop() {
    
                    try {
                        final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();
                        /**
                         * Open image crop app by starting an intent
                         * ‘com.android.camera.action.CROP‘.
                         */
                        Intent intent = new Intent("com.android.camera.action.CROP");
                        intent.setType("image/*");
    
                        /**
                         * Check if there is image cropper app installed.
                         */
                        List<ResolveInfo> list = getPackageManager().queryIntentActivities(
                                intent, 0);
    
                        int size = list.size();
    
                        /**
                         * If there is no image cropper app, display warning message
                         */
                        if (size == 0) {
    
                            Toast.makeText(this, "Can not find image crop app",
                                    Toast.LENGTH_SHORT).show();
    
                            return;
                        } else {
                            /**
                             * Specify the image path, crop dimension and scale
                             */
                            intent.setData(mImageCaptureUri);
    
                            intent.putExtra("outputX", 300);
                            intent.putExtra("outputY", 300);
                            intent.putExtra("aspectX", 1);
                            intent.putExtra("aspectY", 1);
                            intent.putExtra("scale", true);
                            intent.putExtra("return-data", true);
    
                            /**
                             * There is posibility when more than one image cropper app
                             * exist, so we have to check for it first. If there is only one
                             * app, open then app.
                             */
    
                            if (size == 1) {
                                Intent i = new Intent(intent);
                                ResolveInfo res = list.get(0);
    
                                i.setComponent(new ComponentName(
                                        res.activityInfo.packageName, res.activityInfo.name));
    
                                startActivityForResult(i, CROP_FROM_CAMERA);
                            } else {
                                /**
                                 * If there are several app exist, create a custom chooser
                                 * to let user selects the app.
                                 */
                                for (ResolveInfo res : list) {
                                    final CropOption co = new CropOption();
    
                                    co.title = getPackageManager().getApplicationLabel(
                                            res.activityInfo.applicationInfo);
                                    co.icon = getPackageManager().getApplicationIcon(
                                            res.activityInfo.applicationInfo);
                                    co.appIntent = new Intent(intent);
    
                                    co.appIntent.setComponent(new ComponentName(
                                            res.activityInfo.packageName,
                                            res.activityInfo.name));
    
                                    cropOptions.add(co);
                                }
    
                                CropOptionAdapter adapter = new CropOptionAdapter(
                                        getApplicationContext(), cropOptions);
    
                                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                                builder.setTitle("Choose Crop App");
                                builder.setAdapter(adapter,
                                        new DialogInterface.OnClickListener() {
                                            public void onClick(DialogInterface dialog,
                                                    int item) {
                                                startActivityForResult(
                                                        cropOptions.get(item).appIntent,
                                                        CROP_FROM_CAMERA);
                                            }
                                        });
    
                                builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
                                    @Override
                                    public void onCancel(DialogInterface dialog) {
    
                                        if (mImageCaptureUri != null) {
                                            getContentResolver().delete(mImageCaptureUri,
                                                    null, null);
                                            mImageCaptureUri = null;
                                        }
                                    }
                                });
    
                                AlertDialog alert = builder.create();
    
                                alert.show();
                            }
                        }
                    }
    
                    catch (Exception e) {
    
                        Log.e("Error", "ERROR IN CODE:" + e.toString());
    
                        e.printStackTrace();
    
                    }
                }
    

    onActivityResult :

          if (requestCode == PICK_FROM_CAMERA) {
    
                    doCrop();
    
                }
        else if (requestCode == PICK_FROM_FILE) {
                    mImageCaptureUri = intent.getData();
    
                    doCrop();
                }       
    else if (requestCode == CROP_FROM_CAMERA) {
    
                    Bundle extras = intent.getExtras();
                    /**
                     * After cropping the image, get the bitmap of the cropped image and
                     * display it on imageview.
                     */
    
    
                    if (extras != null) {
    
                        Bitmap photo = extras.getParcelable("data");
                        // Camera Output
    
    
    
                            viewImage.setImageBitmap(photo);
    
                            ContextWrapper cw = new ContextWrapper(getApplicationContext());
                            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
                            String imageFileName = "JPEG_" + timeStamp + "_";
                            File directory1 = cw.getDir("Picture",Context.MODE_PRIVATE);
                            File mypath1 = new File(directory1, imageFileName + ".png");
                            picturepath = mypath1.toString();
    
                            // FileOutputStream fos = null;
                            try {
                                // fos = openFileOutput(filename, Context.MODE_PRIVATE);
                                System.out.println("mypath = " + mypath1);
                                fos = new FileOutputStream(mypath1);
    
                                // Use the compress method on the BitMap object to write
                                // image to the OutputStream
                                photo.compress(Bitmap.CompressFormat.PNG, 100, fos);
    
                                try {
                                    fos.flush();
                                    fos.close();
    
    
                                } catch (IOException e1) {
    
                                    e1.printStackTrace();
                                }
                                try {
                                    fos.close();
                                } catch (IOException e) {
    
                                    e.printStackTrace();
                                }
                            } catch (FileNotFoundException e) {
                                e.printStackTrace();
                            }
    
    
    
                    }
                }
    
    0 讨论(0)
提交回复
热议问题