文章目录
自定义相机的一般步骤
- 是否有摄像头、是否有访问摄像头的权限
- 创建相机预览类,继承SurfaceView并实现SurfaceHolder接口,用来预览相机的即时图片
- 有了相机预览类之后,搭建预览布局将预览视图和界面控件结合起来
- 连接控件的监听器以响应用户的动作,拍摄照片或视频,比如一个按钮点击事件
拍摄照片和视频并保存输出 - 摄像头使用完毕后,要正确地释放相机以便于其他应用使用
注意:
相机是共享资源,必须合理管理才不至于和其他同样用到相机的应用发生冲突
当你的应用使用完相机之后,记得调用Camera.release()方法以释放Camera对象。如果没有正确地释放相机,设备上的任何应用,随后任何访问相机的尝试,都有可能失败、退出
设置权限
<!--摄像头权限-->
<uses-permission android:name="android.permission.CAMERA"/>
<!--具备摄像头-->
<uses-feature android:name="android.hardware.camera"/>
<!--存储图像或者视频权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--录制音频权限-->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
检测相机
private boolean checkCameraHardware(Context context) {
// 支持所有版本
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
// Android 2.3 (API Level 9) 及以上的
// return Camera.getNumberOfCameras() > 0;
}
访问相机
public static Camera getCameraInstance(){
Camera c = null;
try {
// 在多个摄像头时,默认打开后置摄像头
c = Camera.open();
// Android 2.3(API 9之后可指定cameraId摄像头id,可选值为后置(CAMERA_FACING_BACK)/前置( CAMERA_FACING_FRONT)
// c = Camera.open(cameraId);
} catch (Exception e){
// Camera被占用或者设备上没有相机时会崩溃。
}
return c; // returns null if camera is unavailable
}
注意: 在部分设备上,打开摄像头时可能会花费较长的时间,因此此操作应该在子线程上执行,然后以回调的方式传递Camera 对象,避免出现ANR;
检测相机功能
在获取到Camera对象之后,可以调用Camera.getParameters()方法并检测该方法返回的Camera.Parameters对象所支持的功能以获取到更多关于相机功能的信息。当使用API 9及以上时, 使用Camera.getCameraInfo()检测摄像头是前置还是后置、图像的方向,具体使用可以参看【Camera相机开发】实现开启相机
创建预览类
摄像头预览类继承自SurfaceView,能够实时的展示来自摄像头的图像数据,方便用户捕捉图片和视频
下面的代码演示了预览类的基本创建。这个类继承自SurfaceHolder.Callback以获取创建和销毁该预览视图的回调事件,这些事件在指派相机预览输入时所需要的
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private Surf


526

被折叠的 条评论
为什么被折叠?



