保存媒体文件
由用户创建的像图片和视频这样的媒体文件,应该保存到设备的外部存储目录中(SD卡)以节省系统空间,并且允许用户在本设备以外能够访问这些文件。在设备上有很多肯能的保存媒体文件的目录位置,但是作为开发者应该只考虑两个标准的位置:
Evironment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES):这个方法会返回一个标准的、共享的且推荐使用的目录位置。这个目录是共享的(公共的),因此其他应用程序能够很容易的在该位置发现、读取、改变和删除被保存的文件。如果你的应用程序被卸载,保存在该位置的媒体文件将不会被删除。要避免对用户既存的图片和视频的干扰,你应该像下面代码所示的那样,在这个目录内部给你的应用程序创建一个子目录。这个方法在Android2.2(API Level8)以后的版本中有效,对于早期API版本的等同调用,请看“保存共享文件”
Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES):这个方法返回一个跟你的应用程序关联的用于保存图片和视频的位置。如果你的应用程序被卸载,保存在这个位置的任何文件都会被删除。这个位置的文件的安全性并不是被强制的,其他的应用程序可以读取、改变和删除它们。
下列示例代码演示了如何给媒体文件创建一个File或Uri对象,它们能够被用于调用设备Camera的Intent对象,或者作为构建Camera应用程序的一部分。
public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;
/** Create a file Uri for saving an image or video */
private static Uri getOutputMediaFileUri(int type){
return Uri.fromFile(getOutputMediaFile(type));
}
/** Create a File for saving an image or video */
private static File getOutputMediaFile(int type){
// To be safe, you should check that the SDCard is mounted
// using Environment.getExternalStorageState() before doing this.
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "MyCameraApp");
// This location works best if you want the created images to be shared
// between applications and persist after your app has been uninstalled.
// Create the storage directory if it does not exist
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
Log.d("MyCameraApp", "failed to create directory");
return null;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
if (type == MEDIA_TYPE_IMAGE){
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_"+ timeStamp + ".jpg");
} else if(type == MEDIA_TYPE_VIDEO) {
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"VID_"+ timeStamp + ".mp4");
} else {
return null;
}
return mediaFile;
}
注意:Environment.getExternalStoragePublicDirectory()是在Android2.2(API Level 8)以后才有效,如果你的目标设备是更早的Android版本,要使用Environment.getExternalStorageDirectory()来替代。
Camera功能:
Android提供了一个Camera应用程序能够控制的宽泛的Camera功能数组,如图片格式、闪光灯模式、聚焦设置等等。本节列出了通用的Camera功能,并简要的讨论如何使用它们。大多数的Camera功能能够通过Camera.Parameters对象来访问和设置。但是,有几个重要的功能需要比Camera.Parameters更简化的设置。这些功能被包含下文的以下章节中:
1. 测光和调焦
2. 面部识别
3. 延时摄影
关于如何通过Camera.Parameters来使用这些控制功能的一般性信息,请看“使用Camera功能”。对于如何通过Camera参数对象来使用这些控制功能的更详细信息,下表中的功能项会链接到指定的API文档。
表1.这些Camera功能按照它们被引入Android API Level的版本来排序
功能 | API Level | 介绍 |
Face Detection | 14 | 标识图片内部的人脸,并使用这个标识来调焦、测光和白平衡处理。 |
Metering Areas | 14 | 在图片内指定多个点,用于计算白平衡 |
Focus Areas | 14 | 在图片内设置多个点,用于调焦 |
White Balance Lock | 14 | 自动的停止或启动白平衡调整 |
Exposure Lock | 14 | 自动的停止或启动曝光调整 |
Video Snapshot | 14 | 获取视频中的一张照片(帧获取) |
Time Lapse Video | 11 | 用设置延迟的帧来记录延时视频 |
Multiple Cameras | 9 | 在一个设备上支持多个Camera,包括前面和背面的Camera |
Focus Distance | 9 | 报告Camera和作为焦点对象之间的距离 |
Zoom | 8 | 设置图像的缩放率 |
Exposure Compensation | 8 | 增加或减少曝光级别 |
GPS Data | 5 | 在图像中包含或忽略地理位置数据 |
White Balance | 5 | 设置白平衡模式,它会影响采集图像中的颜色值 |
Focus Mode | 5 | 设置Camera的调焦模式,如自动、固定、微距或无限远 |
Scene Mode | 5 | 预设一种特定的摄影环境,如夜晚、沙滩、雪地、黄昏等场景 |
JPEG Quality | 5 | 设定JPEG图像的压缩级别,它会增加或减少图像输出的文件质量和尺寸 |
Flas Mode | 5 | 切换闪光灯,或使用自动设置 |
Color Effects | 5 | 设置采集图像的颜色效果,如黑白效果、棕褐色调或取反色。 |
Anti-Banding | 5 | 减少由于JPEG压缩所带来的颜色渐变的影响 |
Picture Format | 1 | 指定图片的文件格式 |
Picture Size | 1 | 指定保存图片的像素尺寸 |
注意:由于硬件的不同和软件的实现,这些功能不是所有的设备都支持的。