【发布时间】:2016-03-05 07:31:48
【问题描述】:
我在这里玩的是条形码扫描仪的原始示例:
他们可以像这样在相机工厂内启动 AutoFocus/Flash:
// Creates and starts the camera. Note that this uses a higher resolution in comparison
// to other detection examples to enable the barcode detector to detect small barcodes
// at long distances.
CameraSource.Builder builder = new CameraSource.Builder(getApplicationContext(), barcodeDetector)
.setFacing(CameraSource.CAMERA_FACING_BACK)
.setRequestedPreviewSize(1600, 1024)
.setRequestedFps(15.0f);
// make sure that auto focus is an available option
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
builder = builder.setFocusMode(
autoFocus ? Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE : null);
}
mCameraSource = builder
.setFlashMode(useFlash ? Camera.Parameters.FLASH_MODE_TORCH : null)
.build();
但是cameraSource builder上的这个方法在当前版本中已经消失了,所以这个设置不能被访问。另外我需要在使用过程中更改 FlashMode,所以这也不是办法。我发现了这个访问相机的丑陋解决方案:
public static Camera getCamera(@NonNull 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;
}
虽然有效,但无济于事:调用 getParameters().setFocusMode() 时出现此异常:
Attempt to invoke virtual method 'android.hardware.Camera$Parameters android.hardware.Camera.getParameters()' on a null object reference
显然我正在做的不是正确的方法,但似乎没有关于它的文档。
感谢您的提示。
【问题讨论】:
-
您可以使用来自mobile-vision codelabs 的自定义
CameraSource,它包含一个setFlashMode()
标签: android android-camera barcode-scanner camera-flash