j'utilise ces méthodes pour activer la mise au point sur Touch sur SurFaceViewAndroid: hardware.Camera méthode de mise au point ne fonctionne pas avec certains appareils
private SurfaceView surfaceiew;
private CameraSource camSource;
private Camera camera;
private Camera.Parameters params;
private void initCameraFocusListener() {
surfaceView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
cameraFocus(event, camSource, Camera.Parameters.FOCUS_MODE_AUTO);
return false;
}
});
}
// camera focus method
private boolean cameraFocus(MotionEvent event, @NonNull CameraSource cameraSource, @NonNull String focusMode) {
Field[] declaredFields = CameraSource.class.getDeclaredFields();
int pointerId = event.getPointerId(0);
int pointerIndex = event.findPointerIndex(pointerId);
// Get the pointer's current position
float x = event.getX(pointerIndex);
float y = event.getY(pointerIndex);
float touchMajor = event.getTouchMajor();
float touchMinor = event.getTouchMinor();
Rect touchRect = new Rect((int)(x - touchMajor/2), (int)(y - touchMinor/2), (int)(x + touchMajor/2), (int)(y + touchMinor/2));
Rect focusArea = new Rect();
focusArea.set(touchRect.left * 2000/surfaceView.getWidth() - 1000,
touchRect.top * 2000/surfaceView.getHeight() - 1000,
touchRect.right * 2000/surfaceView.getWidth() - 1000,
touchRect.bottom * 2000/surfaceView.getHeight() - 1000);
// Submit focus area to camera
ArrayList<Camera.Area> focusAreas = new ArrayList<Camera.Area>();
focusAreas.add(new Camera.Area(focusArea, 1000));
for (Field field : declaredFields) {
if (field.getType() == Camera.class) {
field.setAccessible(true);
try {
camera = (Camera) field.get(cameraSource);
if (camera != null) {
params = camera.getParameters();
params.setFocusMode(focusMode);
params.setFocusAreas(focusAreas);
camera.setParameters(params);
// Start the autofocus operation
camera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean b, Camera camera) {
// currently set to auto-focus on single touch
}
});
return true;
}
return false;
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
return false;
}
il fonctionne parfaitement sur la plupart des appareils, mais je l'ai trouvé que cela ne fonctionne pas sur Huawei Honor 5x qui utilise la version Android 5.0. La partie bizarre est la méthode au lieu de faire son travail, cela me prend à la page précédente (activité). Comment faire la mise au point automatique avec CameraSource et SurfaceView correctement?