简体   繁体   English

Android相机意图与裁剪

[英]Android Camera Intent with Crop

I've been trying to crop and resize an image while taking a picture through the camera intent but don't understand what I'm doing wrong here -- can't get the cropped image data even if the file is correctly saved on the phone. 我一直在尝试裁剪和调整图像大小,同时通过相机意图拍摄照片,但不明白我在这里做错了什么 - 即使文件正确保存在文件上也无法获取裁剪后的图像数据电话。

...
public class Add extends Activity {
    private String imageFilePath;
    ...
    protected void onCreate(Bundle savedInstanceState) {
    ...
        imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/tmp/" + String.valueOf(System.currentTimeMillis()) + ".jpg";
        imageFile = new File(imageFilePath);
        imageFileUri = Uri.fromFile(imageFile);
        Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
        intent.putExtra("crop", "true");
        intent.putExtra("outputX", 600);
        intent.putExtra("outputY", 600);
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true); 
        startActivityForResult(intent, 0);
        ...
    }
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(requestCode) {
        case 0 : {    
        Bitmap bitmap = BitmapFactory.decodeFile(imageFilePath);
    }
    }
}

If I use intent.putExtra("crop", "true"); 如果我使用intent.putExtra("crop", "true"); , imageFilePath returns null, if not it returns the correct file. imageFilePath返回null,否则返回正确的文件。

Thanks for your help! 谢谢你的帮助!

Try This :: 试试这个 ::

private void doCrop() {
    final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();

    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setType("image/*");

    List<ResolveInfo> list = getPackageManager().queryIntentActivities(
            intent, 0);

    int size = list.size();

    if (size == 0) {
        Toast.makeText(this, "Can not find image crop app",
                Toast.LENGTH_SHORT).show();

        return;
    } else {
        intent.setData(mImageCaptureUri);

        /*
         * intent.putExtra("outputX", 200); intent.putExtra("outputY", 200);
         */

        intent.putExtra("outputX", int_Height_crop);
        intent.putExtra("outputY", int_Width_crop);
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true);

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

Cropoption:: Cropoption ::

package com.any;

import android.content.Intent;
import android.graphics.drawable.Drawable;

public class CropOption {
    public CharSequence title;
    public Drawable icon;
    public Intent appIntent;
}

Try to remove this line: intent.putExtra("return-data", true); 尝试删除此行:intent.putExtra(“return-data”,true);

You dont need to pass this in. That line of code will allow you to retrieve your bitmap by the data intent. 你不需要传入它。这行代码将允许你通过数据意图检索你的位图。 In this case, your getting your bitmap from a URI. 在这种情况下,您从URI获取位图。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM