在Android Lollipop中从Uri剪下照片后,总是Null还没回来?

Sil*_*ght 4 android crop onactivityresult

我试图在拍照或拍照后从Uri裁剪图像.我的代码是这样的:

public static void cropImage(Uri uri, Activity activity, int action_code) {
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    intent.putExtra("crop", "true");
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("outputX", 600);
    intent.putExtra("outputY", 600);
    intent.putExtra("scale", true);
    intent.putExtra("return-data", true);
    if (intent.resolveActivity(activity.getPackageManager()) != null) {
        activity.startActivityForResult(intent, action_code);
    } else {
        Toast.makeText(activity, "No Crop App Available", Toast.LENGTH_SHORT).show();
    }
}
Run Code Online (Sandbox Code Playgroud)

onActivityResult()像这样覆盖:

if (resultCode == Activity.RESULT_OK && requestCode == Utils.CODE_CROP_IMAGE) {
    Bundle extras = data.getExtras();
    showCenterToast("ccc");
    if (extras != null) {
        showCenterToast("CCC");
        Bitmap photo = extras.getParcelable("data");
        ivAvatar.setImageBitmap(photo); // display image in ImageView
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(Utils.AVATAR_FILE);
            photo.compress(Bitmap.CompressFormat.PNG, 100, fos);// (0-100)compressing file
            showCenterToast("DDD");
            Utils.AVATAR_FILE_TMP.delete();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
           IoUtil.closeSilently(fos);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在Android Pre-Lollipop的设备上,我能够获取Bitmap photo并显示它ImageView.但是,在Android Lollipop上,我总是null来自data.getExtras();.

我google了很多,但在Android Lollipop上裁剪图像却没什么用处.

Android改变了com.android.camera.action.CROPLollipop 的裁剪机制.那么,新机制是什么?如何Bitmap在Lollipop上裁剪后返回?

任何提示将不胜感激.提前致谢.

小智 7

我认为您的问题与Android版本无关,但与您想要裁剪的图像无关.裁剪图像在课堂上处理com.android.gallery3d.filtershow.crop.CropActivity#BitmapIOTask.当图像太大而无法返回时,它将尝试返回图像的拇指,并且有时会返回null.为避免这种情况,您可以通过设置创建uri来保存结果的intent.putExtra(MediaStore.EXTRA_OUTPUT, tmpUri);位置来获取裁剪图像的uri而不是位图tmpUri.然后你可以从中获取位图tmpUri.

示例代码:

private static final String IMAGE_FILE_LOCATION = "file:///sdcard/temp.jpg";//temp file
private static Uri tmpUri = Uri.parse(IMAGE_FILE_LOCATION);//The Uri to store the big bitmap

public static void cropImage(Uri uri, Activity activity, int action_code) {
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    intent.putExtra("crop", "true");
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("outputX", 600);
    intent.putExtra("outputY", 600);
    intent.putExtra("scale", true);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, tmpUri);
    if (intent.resolveActivity(activity.getPackageManager()) != null) {
        activity.startActivityForResult(intent, action_code);
    } else {
        Toast.makeText(activity, "No Crop App Available", Toast.LENGTH_SHORT).show();
    }
}
Run Code Online (Sandbox Code Playgroud)

并且在函数onActivityResult中:

if (resultCode == Activity.RESULT_OK && requestCode == Utils.CODE_CROP_IMAGE) {
    // Bundle extras = data.getExtras();
    Uri uri = data.getData();
    showCenterToast("ccc");
    if (uri != null) {
        showCenterToast("CCC");
        // Bitmap photo = null;
        // if (tmpUri != null) {
        //     photo = decodeBitmapFromUri(tmpUri); // Get bitmap from uri.
        // }

        Bitmap photo = decodeUriAsBitmap(uri);
        ivAvatar.setImageBitmap(photo); // display image in ImageView
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(Utils.AVATAR_FILE);
            photo.compress(Bitmap.CompressFormat.PNG, 100, fos);// (0-100)compressing file
            showCenterToast("DDD");
            Utils.AVATAR_FILE_TMP.delete();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
           IoUtil.closeSilently(fos);
        }
    } else {
        showCenterToast("Uri is NULL");
    }
}

private Bitmap decodeUriAsBitmap(Uri uri){
    Bitmap bitmap = null;
    try {
        bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        return null;
    }
    return bitmap;
}
Run Code Online (Sandbox Code Playgroud)

我没有测试我的代码是否正确,但我认为你可以修复错误.