Android 4.3裁剪图库resultCode取消

时间:2013-07-29 17:38:21

标签: android gallery crop

我的Galaxy Nexus现在在Android 4.3上运行,允许我使用这个新版本测试我的应用程序。除了裁剪外,一切似乎都很好。

我有一个应用程序,它使用相机拍照,然后通过图库应用程序裁剪图像。

我也可以从图库中选择一张图片并将其裁剪掉。 自Android 4.3起,图库应用程序发生了变化。

如果我使用相机api拍照,然后要求画廊在我的 onActivityResult方法中裁剪,则resultCode设置为0 (意味着取消),而我点击了“保存”裁剪视图。

但是如果我从图库中选择一张图片并裁剪它一切正常,则resultCode参数设置为-1。 在两种情况下,我都用相同的方法裁剪图片。

我手机上有quickpic(替代图库应用),一切正常!

private void performCrop(Uri picUri) {
    try {
        int aspectX = 750;
        int aspectY = 1011;

        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(picUri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("scale", "true");
        intent.putExtra("aspectX", aspectX);
        intent.putExtra("aspectY", aspectY);
        intent.putExtra("scaleUpIfNeeded", true);

        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCurrentPhotoPath)));

        startActivityForResult(intent, CROP);
    }
    catch (ActivityNotFoundException anfe) {
        String errorMessage = "Your device doesn't support the crop action!";
        Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
        toast.show();
    }
}

在Android 4.2.2上一切正常。 谢谢你的帮助!

3 个答案:

答案 0 :(得分:3)

您是否考虑过使用像这样的库:

https://github.com/biokys/cropimage

我发现com.android.camera.action.CROP有时可能会因手机而异,但并不总是可用,因此如果您想要发布它,可能会给您带来一些问题。

<强>更新

我已经使用Android 4.3测试了上面的库,它没有问题。您只需将库添加到项目中即可。

然后你可以用非常类似的方式编写你的方法:

private void performCrop(Uri picUri) {
//you have to convert picUri to string and remove the "file://" to work as a path for this library
String path = picUri.toString().replaceAll("file://", "");

try {
    int aspectX = 750;
    int aspectY = 1011;

    Intent intent = new Intent(this, CropImage.class);
    //send the path to CropImage intent to get the photo you have just taken or selected from gallery
    intent.putExtra(CropImage.IMAGE_PATH, path);

    intent.putExtra(CropImage.SCALE, true);

    intent.putExtra("aspectX", aspectX);
    intent.putExtra("aspectY", aspectY);

    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCurrentPhotoPath)));

    startActivityForResult(intent, CROP);
}
catch (ActivityNotFoundException anfe) {
    String errorMessage = "Your device doesn't support the crop action!";
    Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
    toast.show();
}

}

答案 1 :(得分:3)

只有在裁剪成较小的图像时,上面的库才有用。如果要裁剪为更好的分辨率图像,最好使用Android裁剪意图。

picUri必须是指向您图像的有效URI,outputUri应该是您为编写裁剪图像而创建的新文件。它适用于所有设备和4.3源代码确实有com.android.camera.action.CROP意图可供使用。我已经在很多设备上测试了它并且运行良好。

private void performCrop(Uri picUri, Uri outputUri) {
    try {
        int aspectX = 2000;
    int aspectY = 1200;

        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(picUri, "image/*");
        intent.putExtra("scale", "true");
        intent.putExtra("aspectX", aspectX);
        intent.putExtra("aspectY", aspectY);
        intent.putExtra("scaleUpIfNeeded", true);
        intent.putExtra("return-data", false);

        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);

        startActivityForResult(intent, CROP);
    }
    catch (ActivityNotFoundException anfe) {
        String errorMessage = "Your device doesn't support the crop action!";
        Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
        toast.show();
    }
}

答案 2 :(得分:1)

我也在Nexus 10上遇到过这个问题。裁剪意图返回已取消的代码。经过一些调整后我找到了解决方案:

在我的情况下,setDataAndType()中设置的输入文件与使用MediaStore.EXTRA_OUTPUT extra的输出集相同。使用相同的输入和输出文件在大多数设备上都能正常工作,特别是在4.3以下的设备上。但是在4.3上会导致作物被取消。只需使用不同的文件进行输入和输出即可解决问题。

因此,您需要确保picUri参数指向的文件与您的mCurrentPhotoPath不同。我不确定从4.2到4.3的确切变化导致了这个问题。但是使用不同的文件似乎很容易解决它。