【问题标题】:Dealing with file formats (filepaths from Camera, Uris from Gallery)处理文件格式(来自相机的文件路径,来自画廊的 Uris)
【发布时间】:2016-04-13 21:17:02
【问题描述】:

因此,在为我的应用创建照片部分时,用户既可以拍照也可以从图库中选择图片,但我遇到了一些奇怪的问题。

“拍照”实现依赖于getExternalCacheDir() 给出的系统中缓存目录的绝对文件路径,因此操作这些文件是通过描述图像文件位置的字符串来完成的。

但是,当我尝试从图库中获取图片时,使用获取 MediaStore.Images.Media.EXTERNAL_CONTENT_URI 的 Intent,相应的图像采用 Uri 的形式。

为了保持一致性,我尝试通过执行 .getPath() 将这个 Uri 转换为路径,但这只给了我包含图像的文件夹,而不是实际图像的完整路径。

如何从库 Intent 中获取提供给我的图像的完整路径,以便我可以纯粹根据文件路径工作?

【问题讨论】:

    标签: android image android-intent android-camera uri


    【解决方案1】:

    如何获得从图库 Intent 给我的图像的完整路径

    你没有。

    不要求MediaStore 仅索引您可以直接访问文件系统的图像。特别是,对于运行 Android 4.4+ 并具有可移动媒体的数亿设备,MediaStore 可以很容易地在其索引中包含您无法从文件系统访问的图像,因为您无法任意访问可移动存储。

    根据您对这些图像的处理方式,使用an image-loading library 或仅使用use ContentResolver and methods like openInputStream() to read in the content。另外,openInputStream() 可以同时使用 file:content: Uri 值,因此您不必分别处理这两种数据源类型。

    【讨论】:

    • 我只是想让用户从相机或图库中选择头像图片(应用于 ImageView 的小图像)。
    • @KaliMa:如果您打算使用该图像一段时间(即明天),则需要对其进行复制,例如复制到您的内部存储中。一旦您的流程终止,您使用Uri 的权利将失效。您可以尝试 takePersistableUriPermission() 在 API 级别 19+ 上避免这种情况,但您可能无法获得可持久的读取权限,这在旧设备上无济于事。使用从openInputStream() 获得的InputStream 和普通Java 文件I/O 将内容复制到您管理的文件中。
    • @KaliMa:早在 Android 2.2 和更早的时间范围内,几乎所有设备都具有通过用户可移除的微型 SD 卡实现的外部存储。此外,Android 1.x/2.x 通过 USB 大容量存储(想想:拇指驱动器)处理 USB 连接,这意味着如果将设备插入主机,应用程序将无法使用外部存储。 Android 3.0 解决了这两个问题。现在可能有在 micro SD 卡上带有外部存储的设备,但我不知道(我一直在寻找......)。我不会相信一个模拟器来测试这个。
    • @KaliMa:这个答案来自 Jon Skeet。根据定义,这是正确的答案,即使问题是“我如何烤蛋奶酥?” :-) 但是,是的,这就是我的想法。 “我想根据你的博文,我根本不应该弄乱 Uri.getPath()”——正确。您唯一关心Uri 的内部结构是它是否应该是您的 Uri(例如,对于您的ContentProvider)并且您需要确定它映射到什么内容.对于来自其他应用程序的Uri,将其视为不透明句柄。
    • @KaliMa:嗯,在你的情况下,你显然是在使用它来加载图像。您从MediaStore 返回的Uri 不是您的Uri。这是一个MediaStoreUri。除了关心该方案不是http/https(因此可以由ContentResolveropenInputStream()处理)之外,您无需关心其余内容,例如路径。
    猜你喜欢
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 2016-06-12
    • 1970-01-01
    • 2015-08-30
    • 2020-02-13
    • 1970-01-01
    相关资源
    最近更新 更多