public class Cam2 {
String tag = "seeker";
CameraManager camMgr;
String sCameraID = "";
CameraDevice cam ;
public void init(Context ctx){
camMgr = (CameraManager) ctx.getSystemService(Context.CAMERA_SERVICE);
try {
//获取可用摄像头列表
for (String cameraId : camMgr.getCameraIdList()) {
//获取相机的相关参数
CameraCharacteristics characteristics = camMgr.getCameraCharacteristics(cameraId);
// 不使用前置摄像头。
Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING);
Log.i(tag, "facing:" + facing);
if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) {
sCameraID = cameraId;
break;
}
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
if (map == null) {
continue;
}
// 检查闪光灯是否支持。
//Boolean available = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
}
} catch (CameraAccessException e) {
e.printStackTrace();
} catch (NullPointerException e) {
//不支持Camera2API
}
imgReader = ImageReader.newInstance(640, 480, ImageFormat.YUV_420_888, 5);
imgReader.setOnImageAvailableListener(new OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = reader.acquireNextImage();
Log.i(tag, "-- " + image.getFormat() + " " + image);
image.close();
}
}, null);
}
ImageReader imgReader = null;
public void open(final Surface outputTarget){
try {
camMgr.openCamera(sCameraID, new StateCallback() {
@Override
public void onOpened(CameraDevice camera) {
// TODO Auto-generated method stub
Log.i(tag, "cam onOpened:" + camera);
cam = camera;
try {
final Builder builder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.addTarget(outputTarget);
builder.addTarget(imgReader.getSurface());
// 自动对焦应
builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
camera.createCaptureSession(Arrays.asList(outputTarget, imgReader.getSurface()), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
try {
// 开启相机预览并添加事件
CaptureRequest mPreviewRequest = builder.build();
//发送请求
session.setRepeatingRequest(mPreviewRequest, null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onError(CameraDevice camera, int error) {
// TODO Auto-generated method stub
Log.i(tag, "cam onError:" + error);
camera.close();
cam = null;
}
@Override
public void onDisconnected(CameraDevice camera) {
// TODO Auto-generated method stub
Log.i(tag, "cam onDisconnected:" + camera);
camera.close();
cam = null;
}
}, new Handler(new Callback() {
@Override
public boolean handleMessage(Message msg) {
Log.i(tag, "cam msg:" + msg);
return false;
}
}));
} catch (CameraAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void close(Surface outputTarget){
if(cam != null){
try {
Builder builder = cam.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.removeTarget(outputTarget);
} catch (CameraAccessException e) {
e.printStackTrace();
}
cam.close();
}
}
}
public class MainActivity extends Activity {
private Cam2 cam2 = new Cam2();
SurfaceView surfaceView ;
SurfaceHolder surfaceHolder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = (SurfaceView) findViewById(R.id.surface);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(surfaceCb);
cam2.init(this);
}
SurfaceHolder.Callback surfaceCb = new Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
cam2.close(holder.getSurface());
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
cam2.open(holder.getSurface());
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
};
}