Android并不限制我们只能通过内置应用程序来访问硬件摄像头。我们有足够多的方法可以访问底层硬件,并且有许多与Camera应用程序本身一样的方法,而且能够在任何想要的应用程序类型中使用这些功能。
Android中使用Camera类访问该设备上的摄像头硬件,使我们能够真正捕获图像,并且可以通过其嵌套的Camera.Parameters类更改不同的属性设置,例如闪光灯激活以及白平衡的值,在清单文件中配置CAMERA权限;同样再开启摄像头之前,还需要创建某种类型的Surface,使得Camera应用程序能够在其上面绘制取景器或者预览图像。Suface是一个抽象类,表示绘制图像的位置。提供一个绘制Surface的简单方法是使用SurfaceView类。SurfaceView是标准视图中提供Surface的具体类;
为了在代码中实现通过Camera类使用此SurfaceView,需要添加一个SufaceHolder类。这个holder类可以作为Surface上的一个监听器,并且可以通过回调提供接口,从而让我们知道什么时候创建,销毁,或更改Surface。同时,Surfaceview 类还提供一个getHolder方法,用于获得对应其Surface的SurfaceHolder对象。
使用代码:
package com.example.administrator.media2; import android.content.pm.ActivityInfo; import android.graphics.Camera; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; import java.io.IOException; public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback { private SurfaceView surfaceView; private android.hardware.Camera camera; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); surfaceView = (SurfaceView) findViewById(R.id.camera_surfaceview); SurfaceHolder surfaceHolder = surfaceView.getHolder();//holder作为SurfaceView的监听器 surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //给这个holder设置一个回调,用于监听SurfaceView的创建毁掉等 surfaceHolder.addCallback(this); } //当Surfaca已经创建的时候呢,我们就要准备好开始使用实际的Camera对象le @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { camera = android.hardware.Camera.open(); //最后一步是讲预览显示设置为正在使用的SufaceHolder try { camera.setPreviewDisplay(surfaceHolder); } catch (IOException e) { camera.release(); } //最后启动摄像头预览 camera.startPreview(); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { camera.startPreview(); camera.release(); } }