Я пытаюсь заново реализовать сканер штрих-кода Redlaser с помощью сервисов Google Play. И лицом к лицу проблема с фонариком. Объект Android hardware.Camera не может использоваться совместно с CameraSource из gms.vision. Есть ли возможность работать с фонариком и сканером штрих-кода Google?
Как включить фонарик с помощью функции обнаружения штрих-кода в сервисах Google Play?
Ответы (4)
Не уверен, что я полностью понимаю то, о чем вы спрашиваете, но мой подход к этому заключался в использовании уже созданного объекта 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
CameraSource
не имеет метода setFlashMode
- person Konstantin Konopko; 15.06.2017
Проблема заключалась в том, что 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 (); ДЛЯ setFlash ();
BY
import java.lang.reflect.Field;
import android.hardware.Camera;
Не забудьте AndroidManifest:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<permission android:name="android.permission.FLASHLIGHT"
android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
android:protectionLevel="normal"/>
Затем ДОБАВЬТЕ эти методы
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();
}
}