【问题标题】:Saving files and external storage保存文件和外部存储
【发布时间】:2016-08-01 18:31:18
【问题描述】:

我的理解是否正确,在 Android 上,如果您想保存/保留用相机拍摄的图像,您只能先在外部存储上创建图像?如果不存在外部存储,那么您就不走运了吗?但是假设存储确实存在,我可以在拍摄照片后将其移动到我想要的任何地方(包括私人内部存储)?

【问题讨论】:

  • 检查你的谷歌是否正常工作?只需转到 www.google.com 并粘贴“android 将图像保存到内部存储示例”并按 Enter 键,转到前 10 个链接。 Mine just worked fantastic.
  • @MKJParekh:当我在 Google 上运行该搜索时,恰好有一个结果,而且似乎不是问题的答案。
  • 我将这个stackoverflow.com/questions/15662258/… 作为我在前 10 名中的第二个链接。将其与 stackoverflow.com/questions/5991319/… 之类的链接一起使用
  • 我发现的很多答案都在使用硬编码路径,我几乎立即想忽略它,因为这是一种不好的做法......据我所知,应该使用内置的在getFilesDir()、getExternalFilesDir()、getExternalStoragePublicDirectory()等中
  • stackoverflow.com/questions/5991319/… 在这里,这不是你想要的吗?与之前的评论相同

标签: android android-camera android-file


【解决方案1】:

这取决于您所说的“用相机拍摄的图像”是什么意思。

如果您直接使用相机 API(例如,android.hardware.Camera),或者在您的应用中使用直接使用相机 API 的库,您应该能够将图像存储在 internal storage 上而不会出现问题。

如果您尝试使用ACTION_IMAGE_CAPTUREyou are at the mercy of whatever third-party camera app handles the request。一种方法是只要求缩略图,使用普通的ACTION_IMAGE_CAPTURE Intent,但图像将是缩略图大小。但是,您可以通过结果 Intent 上的额外内容获得 Bitmap,您可以将其写入内部存储。

欢迎您使用EXTRA_OUTPUTcontent: Uri,在您的应用程序中指向ContentProvider。理想情况下,这是可行的,您的ContentProvider 将获得图像并将其保存到内部存储中。我会假设一些相机应用程序可以正确处理这个问题。不过,我也希望:

  • 某些相机应用无法识别content: 方案、try to use the path as a file,并崩溃

  • 某些相机应用无法识别content: 方案try to use the path as a file,失败,捕获异常,并忽略您的EXTRA_OUTPUT

  • 一般忽略EXTRA_OUTPUT 的一些相机应用

  • 一些相机应用在其ACTION_IMAGE_CAPTURE 处理中存在干扰您的应用的其他错误

ACTION_IMAGE_CAPTURE 本质上是不可靠的。这很容易尝试,但由于相机应用程序错误,它不会 100% 工作。仅当您可以告诉用户 ¯\_(ツ)_/¯ 时才使用它。

如果不存在外部存储,那么你就不走运了?

如果用户没有external storage,那么他们遇到的问题比您的应用无法运行要大得多

但是假设存储确实存在,我可以在拍摄照片后将其移动到我想要的任何位置(包括私人内部存储)?

“始终”是对ACTION_IMAGE_CAPTURE 的强烈声明。假设如果您获得了一张保存在外部存储设备上的图片,并且如果您有权使用外部存储设备,那么您可以将其移至内部存储设备。

【讨论】:

  • 我知道缩略图可以直接保存,但我主要指的是用takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);这样的线条成像的全尺寸。在这个例子中,photoFile 必须指向外部存储上的一个点吗?或者是否有一些权限可以允许它存储在内部?当它到达 onActivityResult 方法时,文件已被数据填充。
  • @KaliMa:“在这个例子中,photoFile 必须指向外部存储上的某个点吗?” - 请参阅我的回答,特别是以“欢迎您使用 EXTRA_OUTPUT 和内容:Uri”开头的部分及以后。您不能使用 file: Uri 指向您应用的内部存储空间,因为第三方相机应用无权访问它。
  • 我不熟悉file: Uri,所以感谢您的澄清。我刚读了你的博客文章。由于 ACTION_IMAGE_CAPTURE 的不可靠性/不一致,您是否建议直接使用 Camera API?
  • @KaliMa:这取决于您的应用程序的性质。如果拍照是应用程序功能的重要组成部分,则直接使用相机 API 或库(例如,mine)可以让您获得更大的控制权,但代价是您自己承受痛苦和痛苦。如果拍照是您应用的辅助功能,请使用 ACTION_IMAGE_CAPTURE,并进行大量输出验证,并专注于在输出无法按预期工作时如何最好地 ¯\_(ツ)_/¯ 您的用户。
猜你喜欢
  • 2011-12-14
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-10
  • 2021-08-18
相关资源
最近更新 更多