1.清单文件需要添加的权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2.布局文件
<TextureView
android:id="@+id/camView"
android:layout_width="903dp"
android:layout_height="fill_parent" />
3.相机预览
TextureView camView;
Handler handler;
private CameraManager mCameraManager;
private String[] permission = {
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
};
private CameraDevice.StateCallback mStateCallback;
private CameraDevice mCameraDevice;
private CaptureRequest.Builder mPreviewCaptureRequest;
private CameraCaptureSession.StateCallback mSessionStateCallback;
private CameraCaptureSession mCameraCaptureSession;
private CameraCaptureSession.CaptureCallback mSessionCaptureCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler(this.getMainLooper());
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return;
}
//动态获取权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, permission, 1);
}
camView = findViewById(R.id.camView);
initTextureViewStateListener();
initCameraDeviceStateCallback();
initSessionStateCallback();
initSessionCaptureCallback();
}
private void openCamera() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
return;
}
String product = getProductProperty();
int cameraId = Camera.CameraInfo.CAMERA_FACING_FRONT;
if (product != null && product.contains("sample_a_none")) {
cameraId = Camera.CameraInfo.CAMERA_FACING_BACK;
}
Log.d(TAG, "start camera: " + cameraId);
mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
mCameraManager.openCamera(String.valueOf(cameraId), mStateCallback, handler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
private void initCameraDeviceStateCallback() {
mStateCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
mCameraDevice = camera;
repeatPreview();
Log.d(TAG, "onOpened: ");
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {
}
@Override
public void onError(@NonNull CameraDevice camera, int error) {
}
};
}
private void repeatPreview() {
try {
SurfaceTexture surfaceTexture = camView.getSurfaceTexture();
surfaceTexture.setDefaultBufferSize(903, 493);
Surface previewSurface = new Surface(surfaceTexture);
mPreviewCaptureRequest = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewCaptureRequest.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
mPreviewCaptureRequest.addTarget(previewSurface);
mCameraDevice.createCaptureSession(Arrays.asList(previewSurface), mSessionStateCallback, handler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
private void initTextureViewStateListener() {
camView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
openCamera();
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
});
}
private void initSessionStateCallback() {
mSessionStateCallback = new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
mCameraCaptureSession = session;
try {
mCameraCaptureSession.setRepeatingRequest(mPreviewCaptureRequest.build(), mSessionCaptureCallback, handler);
Log.d(TAG, "mSessionStateCallback onConfigured: ");
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
}
};
}
private void initSessionCaptureCallback() {
mSessionCaptureCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureStarted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, long timestamp, long frameNumber) {
super.onCaptureStarted(session, request, timestamp, frameNumber);
Log.d(TAG, "mSessionCaptureCallback onCaptureStarted: ");
}
@Override
public void onCaptureProgressed(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull CaptureResult partialResult) {
super.onCaptureProgressed(session, request, partialResult);
Log.d(TAG, "mSessionCaptureCallback onCaptureProgressed: ");
}
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result);
Log.d(TAG, "mSessionCaptureCallback onCaptureCompleted: ");
}
@Override
public void onCaptureFailed(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull CaptureFailure failure) {
super.onCaptureFailed(session, request, failure);
Log.d(TAG, "mSessionCaptureCallback onCaptureFailed session: " + session.getDevice().getId());
}
};
}
public static String getProductProperty() {
try {
Class cla = Class.forName("android.os.SystemProperties");
Method getter = cla.getDeclaredMethod("get", String.class);
String value = (String) getter.invoke(null, "ro.product.name");
return value;
} catch (Exception ex) {
ex.printStackTrace();
}
return "default";
}
@Override
protected void onDestroy() {
super.onDestroy();
if (null != mCameraDevice) {
mCameraDevice.close();
mCameraDevice = null;
}
}