定义布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextureView
android:id="@+id/texture_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.constraint.ConstraintLayout>
代码实现
public class MainActivity extends AppCompatActivity{
private static final String TAG = "CameraTest";
private TextureView mTextureView;
private CameraManager mCameraManager;
private CameraDevice mCameraDevice;
private CameraCaptureSession mCameraCaptureSession;
private CaptureRequest.Builder mPreviewRequestBuilder;
private List<String> mBackCameraIds;
private HandlerThread mHandlerThread;
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextureView = findViewById(R.id.texture_view);
mCameraManager = (CameraManager) getSystemService(CAMERA_SERVICE);
getAllBackCameraId();
mHandlerThread = new HandlerThread("camera-background");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
}
private TextureView.SurfaceTextureListener mSurfaceTextureListener = new TextureView.SurfaceTextureListener() {
@SuppressLint("MissingPermission")
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
String mainBackCameraId = mBackCameraIds.get(0);
try {
mCameraManager.openCamera(mainBackCameraId, mCameraDeviceStateCallback, mHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@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 CameraDevice.StateCallback mCameraDeviceStateCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice cameraDevice) {
mCameraDevice = cameraDevice;
try {
SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
Surface surface = new Surface(surfaceTexture);
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
mPreviewRequestBuilder.addTarget(surface);
mCameraDevice.createCaptureSession(Arrays.asList(surface), mSessionStateCallback, mHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onDisconnected(@NonNull CameraDevice cameraDevice) {
}
@Override
public void onError(@NonNull CameraDevice cameraDevice, int error) {
}
};
private CameraCaptureSession.StateCallback mSessionStateCallback = new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
mCameraCaptureSession = session;
try {
mCameraCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null, mHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
}
};
private void takePhoto() {
try {
SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
Surface surface = new Surface(surfaceTexture);
CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
builder.addTarget(surface);
CameraCaptureSession.CaptureCallback captureCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
android.util.Log.i(TAG, "takePhoto");
super.onCaptureCompleted(session, request, result);
}
};
mCameraCaptureSession.capture(builder.build(), captureCallback, mHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
private void getAllBackCameraId() {
mBackCameraIds = new ArrayList<>();
try {
for (String cameraId : mCameraManager.getCameraIdList()) {
CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(cameraId);
Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING);
if (facing != null && facing == CameraCharacteristics.LENS_FACING_BACK) {
mBackCameraIds.add(cameraId);
}
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}