【发布时间】: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() 被调用。现在您可以访问位图数据,并且可以将此数据保存到之前创建的空文件中。如果你明白我的意思。