Android Camera2 API切换后端摄像头
问题描述:
我正在用新的camera2 API创建一个自定义摄像头捕捉视频。Android Camera2 API切换后端摄像头
我的代码深受Google here提供的代码的启发。我的相机预览有一个按钮,可以从后置摄像头切换到前置摄像头,然后从前置摄像头切换回后置摄像头 默认情况下,“相机预览”活动与后置相机一起启动。
出于某种原因,当我点击了“开关/交换相机”按钮首次上,它带来的是前置摄像头,因为它应该,但每次我再次点击,开关/交换没有按”不再工作:预览(在前置摄像头上)会稍微变淡,就像发生了某种情况一样,但仍保留在当前选定的(前置)摄像头上。
这里是我的代码:
在RecordVideoFragment
,在onViewCreated
:
// Switch camera button
switchCameraButton = (ImageButton) view.findViewById(R.id.button_switch_camera);
// Listener for Switch cameras button
switchCameraButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switchCameras();
}
});
这里是switchCameras()
功能:
private void switchCameras() {
mCameraOpenCloseLock.release();
mCameraDevice.close();
CameraManager mCameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
try {
String mCameraId = mCameraManager.getCameraIdList()[0];
if (mCameraId.equals("0")) { // If currently on FRONT camera (0 = CameraCharacteristics.LENS_FACING_FRONT)
mCameraId = "1"; // switch to BACK camera (1 = CameraCharacteristics.LENS_FACING_BACK)
switchCameraButton.setImageResource(R.drawable.ic_camera_front);
} else { // If currently on BACK camera
mCameraId = "0"; // switch to front camera
switchCameraButton.setImageResource(R.drawable.ic_camera_back);
}
try {
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) {
mCameraManager.openCamera(mCameraId, mStateCallback, null);
} else {
requestVideoPermissions();
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
} catch (CameraAccessException e) {
Toast.makeText(getActivity(), "Cannot access the camera.", Toast.LENGTH_SHORT).show();
getActivity().finish();
}
}
如果你对所发生的事情的任何想法那会救我。几天来我一直在窃听。非常感谢您
答
你需要做的是引入新的变量是什么:
public static final String CAMERA_FRONT = "1";
public static final String CAMERA_BACK = "0";
private String cameraId = CAMERA_BACK;
删除cameraIdlocal variable从openCamera方法。
public void switchCamera() {
if (cameraId.equals(CAMERA_FRONT)) {
cameraId = CAMERA_BACK;
closeCamera();
reopenCamera();
switchCameraButton.setImageResource(R.drawable.ic_camera_front);
} else if (cameraId.equals(CAMERA_BACK)) {
cameraId = CAMERA_FRONT;
closeCamera();
reopenCamera();
switchCameraButton.setImageResource(R.drawable.ic_camera_back);
}
}
public void reopenCamera() {
if (mTextureView.isAvailable()) {
openCamera(mTextureView.getWidth(), mTextureView.getHeight());
} else {
mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
}
}
答
看着MrOnyszko答案i之后跟着一个稍微不同的方法:
在Camera2Basic教程面对方向的透镜被用来设置右照相机,所以我关闭并重新打开之前改变该方向相机。
private void switchCamera() {
if (mCameraLensFacingDirection == CameraCharacteristics.LENS_FACING_BACK) {
mCameraLensFacingDirection = CameraCharacteristics.LENS_FACING_FRONT;
closeCamera();
reopenCamera();
} else if (mCameraLensFacingDirection == CameraCharacteristics.LENS_FACING_FRONT) {
mCameraLensFacingDirection = CameraCharacteristics.LENS_FACING_BACK;
closeCamera();
reopenCamera();
}
}
private void reopenCamera() {
if (mTextureView.isAvailable()) {
openCamera(mTextureView.getWidth(), mTextureView.getHeight());
} else {
mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
}
}
private void setUpCameraOutputs(int width, int height) {
Activity activity = getActivity();
CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
try {
for (String cameraId : manager.getCameraIdList()) {
CameraCharacteristics characteristics
= manager.getCameraCharacteristics(cameraId);
Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING);
if (facing != null && facing != mCameraLensFacingDirection) {
continue;
}
...
当我使用这个预览的大小改变...我怎么能防止这个? – Andrea
检查你的纹理视图是否给出了相同的尺寸,因为在reopenCamera方法中,这是再次设置的。 – MrOnyszko
我跟着你的代码,但它不适合我。我在“setUpCameraOutputs”方法'Integer facing = features.get(CameraCharacteristics.LENS_FACING); if(facing!= null && facing == CameraCharacteristics.LENS_FACING_FRONT){ continue; }' 所以我删除了这个条件,但仍然没有working.i后面[this](https://github.com/googlesamples/android-Camera2Basic) –