要自己写一个相机应用直接使用相机硬件,首先应用需要一个权限设置,在AndroidManifest.xml中加上使用设备相机的权限:
<uses-permission android:name="android.permission.CAMERA" />
为你的应用创建自定义的相机,一般步骤如下:
1.检测相机硬件并获取访问
2.建立一个Preview类:需要一个相机预览的类,继承 SurfaceView
类,并实现SurfaceHolder接口。
3.建立预览的布局。
4.为拍照建立监听。
5.拍照并且存储文件。
6.释放相机。
因为相机是一个共享资源,所以应该被谨慎管理,这样应用之间才不会发生冲突。
所以使用完相机之后应该调用 Camera.release()
来释放相机对象。
如果不释放,后续的使用相机请求(其他应用或本应用)都会失败。
检测相机硬件
如果你的程序没有在manifest的声明中要求有相机,那么你应该在运行时检查相机的存在与否,主要用了PackageManager.hasSystemFeature()
方法。比如:
/** Check if this device has a camera */
private boolean checkCameraHardware(Context context)
{
if (context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_CAMERA))
{
// this device has a camera
return true;
}
else
{
// no camera on this device
return false;
}
}
设备上可能有多个相机,Android 2.3以后可以使用 Camera.getNumberOfCameras()
来查看相机的数目。
如下面这段程序用于检测设备中的相机,并得到默认相机的索引号:
private int getDefaultCameraId()
{
int defaultId = -1;
// Find the total number of cameras available
mNumberOfCameras = Camera.getNumberOfCameras();
// Find the ID of the default camera
CameraInfo cameraInfo = new CameraInfo();
for (int i = 0; i < mNumberOfCameras; i++)
{
Camera.getCameraInfo(i, cameraInfo);
if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK)
{
defaultId = i;
}
}
if (-1 == defaultId)
{
if (mNumberOfCameras > 0)
{
// 如果没有后向摄像头
defaultId = 0;
}
else
{
// 没有摄像头
Toast.makeText(getApplicationContext(), R.string.no_camera,
Toast.LENGTH_LONG).show();
}
}
return defaultId;
}
看了
Camera类的代码实现后,其中不带参数的open()方法
:默认是调用后置摄像头
public static Camera open()
{
int numberOfCameras = getNumberOfCameras();
CameraInfo cameraInfo = new CameraInfo();
for (int i = 0; i < numberOfCameras; i++)
{
getCameraInfo(i, cameraInfo);
if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK)
{
return new Camera(i);
}
}
return null;
}
访问相机
当检测到设备上有相机之后,必须获取其访问权,获取一个 Camera 类的对象。 要获取主要的相机,可以使用 Camera.open()
方法,注意异常处理。
在使用这个方法的时候一定要检查异常,如果相机正在被使用或者不存在,没有处理异常,将会使得应用被系统关闭。