Android,使用单个 startActivityForResult 选择和裁剪图像,但检索原始图像 URI?

Posted

技术标签:

【中文标题】Android,使用单个 startActivityForResult 选择和裁剪图像,但检索原始图像 URI?【英文标题】:Android, Pick & Crop image using single startActivityForResult, but retrieving original image URI? 【发布时间】:2013-05-28 13:11:00 【问题描述】:

前段时间我设法使以下代码工作(感谢互联网上像你这样的人,绝对不是 android 文档......)。 它的基本作用是启动文件选择活动(在本例中为图像),然后直接跳转到图像裁剪活动,然后将裁剪后的图像保存到提供的文件流中。

    File file = new File(saveTo);
    FileOutputStream fs = new FileOutputStream(file);
    fs.close();

    Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
    intent.setType("image/*");
    intent.putExtra("crop", "true");
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("outputX", maxImageSize);
    intent.putExtra("outputY", maxImageSize);
    intent.putExtra("scale", "true");
    //intent.putExtra("return-data", false);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
    intent.putExtra("noFaceDetection", !false);
    intent.putExtra("setWallpaper", false);
    startActivityForResult(intent, CROP_FROM_CAMERA);

首先,我想明确一点,这可以完美运行,我对这段代码没有任何问题。

上面的代码在其意图中没有返回任何数据。这是因为“return-data” extra 被有意注释掉,因此裁剪后的图像直接保存到打开的流中,而不是占用设备内存,并防止大图像出现丑陋行为。

我想知道的是: 如何获取原始文件的 URI不是创建的文件\缩略图)选择然后裁剪? 有没有办法做到这一点,而无需拆开工作代码并尝试分几个步骤来做到这一点? (就像首先选择图像然后运行裁剪活动,在两者之间存储原始文件 URI)

【问题讨论】:

它返回的唯一数据是位图的内联数据。所以我看到的唯一方法是将文件 uri 存储在本地变量中并在需要时检索。 由于上面的代码处理的是在同一个 Intent 中选择和裁剪,我不知道如何通过这个 IntentBEFORE 存储选定的文件 URI。这实际上就是我首先发布这个问题的原因。 从uri加载位图并在“数据”额外设置Parcelable位图。 我认为你没有抓住重点。当 startActivityForResult(intent, CROP_FROM_CAMERA);被调用,操作系统接管,在该行返回之前无法获取 URI。 【参考方案1】:

经过一些研究,我发现依赖此意图是一种不好的做法,因为它可能会在未来版本的 Android 操作系统中被删除或更改。 猜猜这就是为什么一开始就很难找到有关它的任何真实信息的原因。 无论如何,我最终使用了自定义裁剪库,而不是依赖于内部的 android 意图。

【讨论】:

你用的是哪个库? 我很好地阅读了 The CommonsBlog(所有者在 *** 上非常活跃),在那里我发现了使用集成裁剪功能背后的问题,为什么使用自定义库更好,它是我在其中找到了一些指向自定义库的链接。现在我正在使用这个library,这是我正在谈论的blog post,你可以在那里找到其他库。 感谢您的链接,请问您为什么从其他 4 中选择该库?如果有某种原因,它可以节省我的一些时间:) 不客气。实际上,我快速浏览了其中一些库的文档,并选择了一个似乎是最基本和最稳定的库,我没有太多时间来测试所有这些库。到目前为止,我使用的那个没有任何问题。 我花了一天的时间试图使裁剪意图起作用(因为它可以与默认图库一起使用,但不能与 Google 照片应用程序一起使用),现在我找到了那个博客。谢谢@r41n

以上是关于Android,使用单个 startActivityForResult 选择和裁剪图像,但检索原始图像 URI?的主要内容,如果未能解决你的问题,请参考以下文章

android开发之路03

如何使用 Intent 限制录音时间?

Android 手把手带你玩转自定义相机

在 Android 中使用具有多个布局的单个片段

Android 导航架构组件 - 导航架构组件是不是意味着仅使用单个活动?

Android,使用单个 startActivityForResult 选择和裁剪图像,但检索原始图像 URI?