我正在尝试使用Google Play服务重新实现Redlaser条码扫描器。并面对手电筒的问题。 Android hardware.Camera对象不能与gms.vision中的CameraSource共同使用。有机会使用手电筒和Google条码扫描器吗?
不确定我是否完全理解您的要求,但是我的解决方法是从那里使用已经创建的mCamerSource对象和setFlashMode(),当我使用按钮切换闪光灯时,这对我有用。
就像在样本中一样,在您的onCreate中添加它或在createCameraSource方法中->
mCameraSource = builder
.setFlashMode(useFlash ? Camera.Parameters.FLASH_MODE_TORCH : null)
.build();
然后创建一种方法来切换闪光灯,希望有帮助。
private void ToggleFlash()
{
fab_flash.startAnimation(spin_it);
if(currentDrawalbe == FLASH_DEFAULT_STATE)
{
fab_flash.setImageResource(FLASH_TOGGLE_STATE);
currentDrawalbe = FLASH_TOGGLE_STATE;
mCameraSource.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
}
else
{
fab_flash.setImageResource(FLASH_DEFAULT_STATE);
currentDrawalbe = FLASH_DEFAULT_STATE;
mCameraSource.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
}
}
[currentDrawable只是闪光灯图标的图像,所以基本上,如果图像是打开的闪光灯,则执行else子句,否则if子句
问题是相机API不支持多次打开相机。打开手电筒和启动CameraSource都需要单独的调用才能打开相机。如果您尝试同时执行这两个操作,则最后一个请求将失败。
好消息是我们最近开源了CameraSource实现。此新版本包括一个用于打开手电筒的选项,该选项可以解决此问题。看到这里:
当前,我正在使用此代码查找相机对象:
private boolean findCameraObject(){
if(mCameraSource == null) {
return false;
}
Field[] declaredFields = null;
try {
declaredFields = CameraSource.class.getDeclaredFields();
} catch (Exception ex) {
ex.printStackTrace();
}
if(declaredFields == null) {
return false;
}
for (Field field : declaredFields) {
if (field.getType() == Camera.class) {
field.setAccessible(true);
try {
Camera camera = (Camera) field.get(this.mCameraSource);
if (camera != null) {
Camera.Parameters params = camera.getParameters();
params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
camera.setParameters(params);
setCamera(camera);
return true;
}
return false;
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
return false;
}
我正在使用此代码,它正在成功运行替换为:cameraSource.start(surfaceView.getHolder());或cameraSource.start(); TO setFlash();并添加此方法通过导入java.lang.reflect.Field;导入android.hardware.Camera;
public static Camera getCamera(CameraSource cameraSource) {
Field[] declaredFields = CameraSource.class.getDeclaredFields();
for (Field field : declaredFields) {
if (field.getType() == Camera.class) {
field.setAccessible(true);
try {
Camera camera = (Camera) field.get(cameraSource);
if (camera != null) {
return camera;
}
return null;
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
return null;
}
public void setFlash () throws IOException {
getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
cameraSource.start(surfaceView.getHolder());
Camera _cam = getCamera (cameraSource);
if (_cam != null) {
Camera.Parameters _pareMeters = _cam.getParameters();
_pareMeters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
_cam.setParameters(_pareMeters);
_cam.startPreview();
}
}