android 实现android5以上 同时打开前后摄像头 Java写个详细demo
时间: 2024-10-10 16:14:32 浏览: 78
在Android上同时打开前后摄像头并进行视频录制或预览,你可以使用`CameraManager`和`SurfaceView`来实现。这里提供一个简单的示例,假设你想开启相机预览:
```java
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.Surface;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
// ...其他必要的权限请求和设置
public class MainActivity extends AppCompatActivity implements CameraManager.OnCamera开放许可回调, CameraDevice.StateCallback {
private static final int REQUEST_CAMERA_PERMISSION = 100;
private CameraManager cameraManager;
private String[] cameraIdList;
private CameraDevice frontCamera, backCamera;
private SurfaceView surfaceViewFront, surfaceViewBack;
private boolean isUsingBackCamera = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 请求相机权限
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
}
// 初始化SurfaceView用于显示预览
surfaceViewFront = findViewById(R.id.surface_view_front);
surfaceViewBack = findViewById(R.id.surface_view_back);
Button switchCameraButton = findViewById(R.id.switch_camera_button);
switchCameraButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isUsingBackCamera) {
openFrontCamera();
} else {
openBackCamera();
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
if (requestCode == REQUEST_CAMERA_PERMISSION && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限已授予权限,可以继续初始化相机
initCameras();
} else {
Toast.makeText(this, "相机权限拒绝", Toast.LENGTH_SHORT).show();
}
}
private void initCameras() {
try {
cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
cameraIdList = cameraManager.getCameraIdList();
for (String id : cameraIdList) {
if (cameraManager.getCameraCharacteristics(id).get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_BACK) {
backCamera = cameraManager.openCamera(id, this, null);
} else if (cameraManager.getCameraCharacteristics(id).get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT) {
frontCamera = cameraManager.openCamera(id, this, null);
isUsingBackCamera = false; // 初始默认前摄像头
break; // 只需要找到第一个前置摄像头即可
}
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onOpened(CameraDevice camera) {
if (camera == frontCamera) {
setupFrontCamera(camera);
} else if (camera == backCamera) {
setupBackCamera(camera);
}
}
private void setupFrontCamera(CameraDevice camera) {
// 创建SurfaceHolder并将其关联到SurfaceView
Surface holder = surfaceViewFront.getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera.createCaptureSession(Arrays.asList(holder), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
try {
// 开始预览
MediaRecorder mediaRecorder = new MediaRecorder();
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mediaRecorder.setOutputFile("/sdcard/test.mp4");
mediaRecorder.setPreviewDisplay(holder.getSurface());
mediaRecorder.prepare();
mediaRecorder.start();
} catch (Exception e) {
e.printStackTrace();
}
}
// ...其他回调...
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
});
}
private void setupBackCamera(CameraDevice camera) {
// ...类似前端摄像头的设置,只是将SurfaceView换成后置的那一个...
}
// ...其他关闭、错误处理等回调...
private void openFrontCamera() {
if (frontCamera != null && frontCamera.isOpen()) {
closeCamera(frontCamera);
}
frontCamera = cameraManager.openCamera(cameraIdList[0], this, null);
isUsingBackCamera = false;
}
private void openBackCamera() {
if (backCamera != null && backCamera.isOpen()) {
closeCamera(backCamera);
}
backCamera = cameraManager.openCamera(cameraIdList[1], this, null);
isUsingBackCamera = true;
}
private void closeCamera(CameraDevice camera) {
if (camera != null) {
try {
camera.close();
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}
}