Android Camera2 API 切换回 - 前置摄像头
Android Camera2 API switch back - front cameras
我正在创建一个自定义相机,使用新相机 2 API 拍摄视频。
我的代码受到 Google here 提供的代码的强烈启发。我的相机预览有一个按钮,可以从后置摄像头切换到前置摄像头,然后从前置摄像头切换到后置摄像头。
"camera preview" activity默认带后置摄像头
出于某种原因,当我第一次点击 "switch/swap camera" 按钮 时,它会正常显示前置摄像头,但每次我点击同样,switch/swap 不再起作用:预览(在前置摄像头上)稍微变暗,就像发生了什么事一样,但它仍保留在当前选定的(前置)摄像头上。
这是我的代码:
在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;
从 openCamera 方法中删除 cameraId local variable。
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 的回答后,我采用了一种略有不同的方法:
在 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;
}
...
我正在创建一个自定义相机,使用新相机 2 API 拍摄视频。
我的代码受到 Google here 提供的代码的强烈启发。我的相机预览有一个按钮,可以从后置摄像头切换到前置摄像头,然后从前置摄像头切换到后置摄像头。 "camera preview" activity默认带后置摄像头
出于某种原因,当我第一次点击 "switch/swap camera" 按钮 时,它会正常显示前置摄像头,但每次我点击同样,switch/swap 不再起作用:预览(在前置摄像头上)稍微变暗,就像发生了什么事一样,但它仍保留在当前选定的(前置)摄像头上。
这是我的代码:
在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;
从 openCamera 方法中删除 cameraId local variable。
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 的回答后,我采用了一种略有不同的方法:
在 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;
}
...