【问题标题】:Android 4.3 crop gallery resultCode CancelAndroid 4.3 裁剪库结果代码取消
【发布时间】:2013-07-29 15:05:51
【问题描述】:

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

【问题讨论】:

    标签: android gallery crop


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      仅当您裁剪成小得多的图像时,上述库才有用。如果您想裁剪成分辨率更高的图像,最好使用 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();
          }
      }
      

      【讨论】:

        【解决方案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();
        }
        

        }

        【讨论】:

        • Thx 效果很好。但是你能解释一下 Android 4.3 上的这种行为吗?我在三星 s3 设备上的 Android 4.1 上也看到了这种奇怪的行为。
        • @noxius 你的意思是android com.android.camera.action.CROP 的行为吗?还是你的意思是我建议的图书馆的行为?
        • android返回0的行为=拍照后取消
        • 啊,对于三星来说,我认为他们的大多数手机都使用 TW (TouchWiz) 相机应用程序作为相机,而 com.android.camera.action.CROP 只是 AOSP 的一部分( Android Open Source Project)相机应用程序,因此大多数三星手机不支持它。我认为在 4.3 中他们已经更新了 AOSP 相机应用程序,所以现在裁剪的行为有所不同,但是我没有查看 Android 源代码来找出究竟发生了什么变化。但基于三星的问题,最好避免 Android 裁剪并使用库来减少其他设备上的兼容性问题。希望对您有所帮助。
        • 我已经在大多数三星设备(注 2、注 1、GS3、GS4、GS2)上测试了 com.android.camera.action.CROP,它运行良好。此外,在具有 4.3 的 Nexus 设备上。它只是提供适当的额外选项。 Crop 意图在所有这些的源代码中都可以找到。
        猜你喜欢
        • 2021-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-02
        • 2013-10-20
        相关资源
        最近更新 更多