我知道我可以设置boolean flag while opening front Camera
。如果flag为true,则表示前置摄像头已开启。
但是有没有办法使用Android API来了解哪个相机现在正在打开?正面或背面。
public int getFrontCameraId() {
CameraInfo ci = new CameraInfo();
for (int i = 0 ; i < Camera.getNumberOfCameras(); i++) {
Camera.getCameraInfo(i, ci);
if (ci.facing == CameraInfo.CAMERA_FACING_FRONT) return i;
}
return -1; // No front-facing camera found
}
当我打开前置摄像头时,摄像头预览正在反转(上行侧视)。所以我必须添加一个检查相机是否打开if FrontCamera is opened then matrix = 270. otherwise matrix =90.
onPreviewFrame(字节abyte0 [],相机相机)
int[] rgbData = YuvUtils.decodeGreyscale(abyte0, mWidth,mHeight);
editedBitmap.setPixels(rgbData, 0, widthPreview, 0, 0, widthPreview, heightPreview);
finalBitmap = Bitmap.createBitmap(editedBitmap, 0, 0, widthPreview, heightPreview, matrix, true);
答案 0 :(得分:1)
private boolean safeCameraOpen(int id) {
boolean qOpened = false;
try {
releaseCameraAndPreview();
mCamera = Camera.open(id);
qOpened = (mCamera != null);
} catch (Exception e) {
Log.e(getString(R.string.app_name), "failed to open Camera");
e.printStackTrace();
}
return qOpened;
}
private void releaseCameraAndPreview() {
mPreview.setCamera(null);
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
从API级别9开始,相机框架支持多个摄像头。
如果您使用旧版API并在没有参数的情况下调用open(),您将获得第一个后置摄像头。
Android设备可以有多个摄像头,例如后置摄像头用于摄影和用于视频通话的前置摄像头。
Android 2.3(API Level 9)及更高版本允许您使用Camera.getNumberOfCameras()
方法检查设备上可用的摄像机数量。
要访问主摄像头,请使用Camera.open()
方法,并确保捕获任何异常,如下面的代码所示:
/** A safe way to get an instance of the Camera object. */
public static Camera getCameraInstance(){
Camera c = null;
try {
c = Camera.open(); // attempt to get a Camera instance
}
catch (Exception e){
// Camera is not available (in use or does not exist)
}
return c; // returns null if camera is unavailable
}
在运行Android 2.3(API级别9)或更高版本的设备上,您可以使用Camera.open(int)访问特定的摄像头。
上面的示例代码将访问设备上的第一个后置摄像头不止一台相机。
答案 1 :(得分:1)
在新的android.hardware.camera2
包中,您可以查询CameraCharacteristics.LENS_FACING
媒体资源,每个CameraDevice
发布id
CameraDevice.getId()
,little snippet很容易获得特色。
在较旧的相机API中,我认为唯一的方法是跟踪您打开它的索引。
private int cameraId;
public void openFrontCamera(){
cameraId = getFrontCameraId();
if (cameraId != -1)
camera = Camera.open(cameraId); //try catch omitted for brevity
}
然后使用cameraId
,这{{3}}可能是实现您的目标的更好方式:
public void onOrientationChanged(int orientation) {
if (orientation == ORIENTATION_UNKNOWN) return;
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
orientation = (orientation + 45) / 90 * 90;
int rotation = 0;
if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
rotation = (info.orientation - orientation + 360) % 360;
} else { // back-facing camera
rotation = (info.orientation + orientation) % 360;
}
mParameters.setRotation(rotation);
}
答案 2 :(得分:0)
如果您有自定义的“相机活动”,则可以尝试此方法。
boolean inPreview;
在SurfaceView集的on surfaceChanged方法中
inPreview = True;
在Camera.CallbackListener变量集中
inPreview = false;