Camera的控制
5.0以后,Android发布了新的摄像头控制API,称之为camera2
现在讲的是已经deprecated的android.hareware.camera,来控制摄像头
很简单,Camera mCamera = Camera.open()
打开摄像头实例
如果不设置参数,默认打开后摄像头,一般情况参数1是前摄像头
具体的看API文档Android.hardware.camera
然后对其进行控制。
预览
要拍照首先要预览,通常用surfaceView
来预览。
然后需要一个SurfaceHoler
来连接camera和surfaceView.
所有需要SurvaceHolder mHolder = mSurfaceView.getHolder()
来获取实例。
然后对Holder如下操作
mHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
initCamere();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
if(mCamera!=null)
{
if(isPreview)mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
});
这三个被覆盖的方法顾名思义,都是完成生命周期的功能,分别对应view的创建,改变,销毁
记得在销毁里面释放camera,因为这个资源一次只能有一个APP来操作。
然后有如下:
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
来设置buffer状态,说实在的我也搞不懂是啥,没仔细看文档,都是这么设置的,就这样吧。
Holder设置好了,下面就连接holder和mCamera
mCamera.setPreviewDisplay(mHolder);
然后就可以开始预览了
mCamera.startPreview();
停止就是stopPreview()
释放摄像头资源就是release()
参数
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(1280,720);
mCamera.setParameters(parameters);
第一行是获得摄像头的参数,第二行就是设置参数,内容很多种,这个是设置预览的格式
然后必须设置第三行,才能使得参数生效。
变焦
if(parameters.isZoomSupported())
{
parameters.setZoom(60);
}
这个变焦我弄了一晚上,上网查,其实就是这么简单三行而已。
参数设置里面有个setZoom,就是设置变焦数值
注意,变焦数值可能不同设备有区别
parameters.getMaxZoom()
可以获得最大数值,然后在1到这个数值之间设置
如果返回0,就表示不能变焦。
记得在设置边角前一定要检查是否支持变焦
就是isZoomSupported()
这一句,我在模拟器上获得的结果是不支持变焦,苦恼了很久以为是物理变焦才支持。后来直接在NOTE3上试验,发现是支持的。所以,一切需要在实机上测试为准。
还有个类似的isSoomthZoomSupported()我的手机上是false,不知道是什么状况,反正用前一种就好。
总结
基本上都是很简单易懂的,直接看API文档就可以理解。其他的功能比如对焦,摄像,保存图片暂时没有深入研究,下次要学习camera2也就是新的API。
实际使用中需要添加更多的try catch块来避免错误。
练习完成的代码
public class CameraActivity extends AppCompatActivity {
private Camera mCamera;
private SurfaceView mSurfaceView;
private SurfaceHolder mHolder;
private boolean isPreview = false;
private Activity context = this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
final RelativeLayout layout = (RelativeLayout)findViewById(R.id.layout);
Button btnTake = (Button)findViewById(R.id.btn_take);
btnTake.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MsgManager.simpleLongSnackbar(layout,String.valueOf(mCamera.getParameters().getMaxZoom()));
MsgManager.makeLongToast(context,String.valueOf(mCamera.getParameters().isSmoothZoomSupported())).show();
}
});
}
@Override
protected void onResume() {
super.onResume();
mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView_camera);
initView();
}
@Override
protected void onPause() {
super.onPause();
if(mCamera!=null) {
mCamera.release();
mCamera = null;
}
}
public static Camera getCameraInstance(){
Camera c = null;
try {
c = Camera.open(); // attempt to get a Camera instance
}
catch (Exception e){
// Camera is not available (in use or does not exist)
}
return c; // returns null if camera is unavailable
}
private void initView() {
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = mSurfaceView.getHolder();
mHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
initCamere();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
if(mCamera!=null)
{
if(isPreview)mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
});
// deprecated setting, but required on Android versions prior to 3.0
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
private void initCamere() {
if(!isPreview)
{
mCamera = Camera.open();
mCamera.setDisplayOrientation(90);
}
if(mCamera!=null&&!isPreview)
{
try {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(1280,720);
if(parameters.isZoomSupported())
{
parameters.setZoom(60);
}
mCamera.setParameters(parameters);
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
}catch (Exception e)
{
e.printStackTrace();
}
isPreview = true;
}
}
}