3

我的 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 上一切正常。谢谢您的帮助 !

4

3 回答 3

3

上面的库仅在您裁剪成更小的图像时才有用。如果你想裁剪到更好分辨率的图像,最好使用 Android Crop Intent。

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();
    }
}
于 2013-10-17T19:02:10.360 回答
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();
}

}

于 2013-07-29T23:51:26.427 回答
1

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

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

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

于 2013-10-29T12:39:11.893 回答