在Android中,这两种拍照方式有什么不同?
我想了解这两种情况下发生了什么。我使用的代码直接来自 假设清单文件中存在所有必要的读/写权限 场景1:在Android中,这两种拍照方式有什么不同?,android,android-intent,bitmap,android-camera,Android,Android Intent,Bitmap,Android Camera,我想了解这两种情况下发生了什么。我使用的代码直接来自 假设清单文件中存在所有必要的读/写权限 场景1: static final int REQUEST_IMAGE_CAPTURE = 1; private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveA
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);
}
}
这段代码似乎对我有用,但我不知道它到底在做什么。它基本上启动了相机,让我拍一张照片,然后在onActivityResult中,我可以通过这种方式获取缩略图,而不是从意图中提取
场景2:
String mCurrentPhotoPath;
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = "file:" + image.getAbsolutePath();
return image;
}
static final int REQUEST_TAKE_PHOTO = 1;
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
...
}
// Continue only if the File was successfully created
if (photoFile != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(photoFile));
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
Bundle extras = data.getExtras(); //data is null here!!!
Bitmap imageBitmap = (Bitmap) extras.get("data");
mImageView.setImageBitmap(imageBitmap);
}
}
另一方面,这个场景应该允许我获取完整的文件,但它不起作用,并为我抛出一个错误,因为Intent变量为null,所以我没有访问任何内容的权限
我的问题是:
takePictureContent.putExtra(MediaStore.EXTRA_输出,Uri.fromFile(photoFile))代码>出于某种原因。我怎么知道这个文件在哪里?我真的需要mPhotoPath
吗?还是应该保留对文件photoFile
的访问权限,在我使用onActivityResult方法时,这些文件已丢失?保存此文件的正确做法是什么?将其作为成员变量
getExternalStoragePublicDirectory
——这与保存在内部存储器中不同吗?我假设有很多方法来保存文件:内部存储、RAM、SD卡、连接到手机的存储设备(如外部HDD)、云等等。我如何知道什么是什么Intent
中的缩略图(如果未指定文件名),或将文件保存到原始Intent
附加文件中指定的文件名。我不认为有一种方法可以同时做到这两个方面。如果要保存完整图像,然后制作缩略图,则必须自己创建缩略图。有关目的的详细信息,请参见此处:Intent
中指定的photoFile
:takePictureContent.putExtra(MediaStore.EXTRA_输出,Uri.fromFile(photoFile))代码>Uri
存储在某个地方,可能是作为成员变量,以便以后可以访问它。这是成功拍摄照片后图像将保存到的Uri
getExternalStoragePublicDirectory
将位于用于共享数据的任何介质上—可能是SD卡或内部SD存储器因此,基本上,如果您不提供文件名,它会将缩略图保存在RAM中,如果您提供了文件名,它会在文件名处保存完整图片(如果您愿意,您可以从中制作缩略图)?保存到图片目录或DCIM是最佳做法吗?请更正您的第一条评论。我不知道与是否使用图片或DCIM相关的任何最佳实践,但只有在您希望图像与其他应用程序共享时才使用它们。如果你扮演一个摄像机,我会说使用DCIM。如果您不希望新图片显示在库中,请为您的应用程序使用专用存储位置。在我的情况下,它们是图片,我不希望从应用程序本身外部访问,除非用户希望将所有内容备份到其他位置。我会用什么来代替呢?