【问题标题】:When are camera files saved in Android when I take pictures this way?当我以这种方式拍照时,相机文件何时保存在 Android 中?
【发布时间】:2016-04-04 13:20:24
【问题描述】:

所以我尝试使用http://developer.android.com/training/camera/photobasics.html 中的代码进行跟踪,但显然有一些臭名昭著的“null Intent”错误,所以我试图了解一切是如何工作的。我有几个问题,所以我将把每个问题分成自己的 SO 问题。我将从缩略图开始。

如果我这样拍照:

static final int REQUEST_IMAGE_CAPTURE = 1;

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        mImageView.setImageBitmap(imageBitmap);
    }
}

然后我会得到我拍摄的照片的缩略图/位图。我拍摄的照片是否仍以完整形式存在于我的文件系统中,还是我的相机基本上拍摄了一张完整的照片(我可以在相机应用程序本身中看到,当我可以在拍照后单击重试/确定时),扔掉它离开,给我一个缩略图的位图,还是它把整个文件保存在某个奇怪的默认位置,只返回给我缩略图?

【问题讨论】:

  • 当您拍照时,位图数据首先保留在您的设备 (RAM) 的内存中,而不是您的文件系统中。然后,当您决定将数据保存到文件系统时,您可以使用 File 类和 FileOutputStream 将此位图数据保存到文件系统。
  • 那么当我没有指定文件名时,图片保存在RAM中(这是临时存储,不是永久的,被清除等),并且Bitmap缩略图被传递到Intent中?此缩略图是否也在 RAM 中?
  • 是的,在 onActivityResult() 的 Intent 中,您可以直接从 RAM 中获取数据。您可以将其保存到您的文件或什么都不做。如果你什么都不做,垃圾收集器稍后会清理它,你的图片就会丢失。
  • 那么不同的是,如果我传入一个文件名,例如使用takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));,那么 Intent 中必然不会保存任何内容? (编辑:或者,为了澄清,直接使用文件路径被认为更安全,因为你知道那里会有一个文件——根据相机的实现,意图中可能有也可能没有?)
  • 好吧,在这种情况下,photoFile 只是您仍然为空文件的路径。您创建了一个文件,但还没有任何内容。你拍了一张照片,接受它,你回到之前的 Activity 并且 onActivityResult() 被调用。现在您可以访问位图数据,并且可以将此数据保存到之前创建的空文件中。如果你明白我的意思。

标签: android bitmap camera


【解决方案1】:

这取决于相机应用的实现。

有数千种 Android 设备型号,预装了数百个相机应用。还有许多其他相机应用程序可以通过 Play 商店和其他地方下载。这些应用程序只需要遵守ACTION_IMAGE_CAPTURE 合同(有些甚至没有做到这一点)。 这些相机应用如何履行合同取决于这些应用的开发者。

【讨论】:

  • 我不知道应该如何在我的应用程序中实现任何类型的相机活动,因为“一切都不一样”对我没有多大帮助。 Android 自己网站上的代码似乎并没有提供太多关于这个主题的信息。我如何告诉我的相机在做什么?我怎么知道我必须如何更改实施?什么是“ACTION_IMAGE_CAPTURE合约”?
  • @SeanHill:“我不知道应该如何在我的应用程序中实现任何类型的相机活动”——请关注the instructions,不要假设超出这些说明的任何内容。 “我怎么知道我的相机在做什么?” ——一般来说,你不会。例如,相机应用程序可以将照片上传到某个 Web 服务器。您无法监视该活动。您将工作委派给第三方应用程序;老实说,该应用程序如何工作与您无关。
  • @SeanHill:如果您担心缺乏控制,请不要使用ACTION_IMAGE_CAPTURE。使用相机 API 或 libraries built atop of those APIs 在您自己的应用程序中拍照,而不是委托给其他应用程序。 “什么是“ACTION_IMAGE_CAPTURE 合同”? -- 那是the aforementioned documentation
  • 那么大多数人是怎么做的呢?只是假设人们遵守合同?因为那样的话,否则您必须创建几个 if 语句来检查相机实现可能工作的所有可能方式,不是吗?
  • @SeanHill:“因为那样的话,否则你必须创建几个 if 语句来检查相机实现可能工作的所有可能方式,不是吗?” - 正确的。但是,生产级代码需要验证输入并优雅地降级。最大的健全性检查是您是否提供EXTRA_OUTPUT,以确认onActivityResult() 中确实有一个文件。一些相机应用程序存在错误,即使您要求它们保存文件,它们也不会将文件保存在 EXTRA_OUTPUT 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
相关资源
最近更新 更多