studio google gms camerasource android camera google-play-services google-vision android-vision

android - gms - Muestras de API de Google Vision: haga que CameraSource se enfoque



camerasource android (3)

He descargado las últimas API de Google Vision desde aquí:

https://github.com/googlesamples/android-vision

Y lo estoy ejecutando en un dispositivo LG G2 con KitKat. El único cambio que he hecho es a minSdkVerion en el archivo Gradle:

... defaultConfig { applicationId "com.google.android.gms.samples.vision.face.multitracker" minSdkVersion 19 ...

Sin embargo, no se enfoca. ¿Cómo lo hago enfocar?


Modifiqué el constructor de CameraSourcePreview (....) para que sea el siguiente:

public CameraSourcePreview(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; mStartRequested = false; mSurfaceAvailable = false; mSurfaceView = new SurfaceView(context); mSurfaceView.getHolder().addCallback(new SurfaceCallback()); addView(mSurfaceView); mSurfaceView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { cameraFocus(mCameraSource, Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); } }); } private static boolean cameraFocus(@NonNull CameraSource cameraSource, @NonNull String focusMode) { 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) { Camera.Parameters params = camera.getParameters(); params.setFocusMode(focusMode); camera.setParameters(params); return true; } return false; } catch (IllegalAccessException e) { e.printStackTrace(); } break; } } return false; }

El consejo fue dado aquí: https://github.com/googlesamples/android-vision/issues/2

y la referencia del código estaba aquí: https://gist.github.com/Gericop/7de0b9fdd7a444e53b5a

También tuve que modificar el método de dibujar FaceTrackerFactory (Canvas ...):

@Override public void draw(Canvas canvas) { Face face = mFace; if (face == null) { return; } // Draws a circle at the position of the detected face, with the face''s track id below. float cx = translateX(face.getPosition().x + face.getWidth() / 2); float cy = translateY(face.getPosition().y + face.getHeight() / 2); canvas.drawCircle(cx, cy, FACE_POSITION_RADIUS, mFacePositionPaint); canvas.drawText("id: " + getId(), cx + ID_X_OFFSET, cy + ID_Y_OFFSET, mIdPaint); // Draws an oval around the face. float xOffset = scaleX(face.getWidth() / 2.0f); float yOffset = scaleY(face.getHeight() / 2.0f); float left = cx - xOffset; float top = cy - yOffset; float right = cx + xOffset; float bottom = cy + yOffset; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { canvas.drawOval(left, top, right, bottom, mBoxPaint); } else { canvas.drawCircle(cx, cy, Math.max(xOffset, yOffset), mBoxPaint); } }


Una opción de enfoque automático ya está disponible en la API oficial. Vea el método setAutoFocusEnabled aquí:

https://developers.google.com/android/reference/com/google/android/gms/vision/CameraSource.Builder.html#setAutoFocusEnabled(boolean)

Además, abrimos la clase CameraSource, que también tiene un método de enfoque automático. Este le permite establecer un modo de enfoque específico en comparación con el modo de "video continuo" que la API oficial establece de forma predeterminada:

https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/camera/ CameraSource.java


Esto funcionó para mí Usar Google Play Services 8.4: ''com.google.android.gms: play-services: 8.4.0''

cameraSource = new CameraSource.Builder (este, detector) .setRequestedPreviewSize (640, 480) .setAutoFocusEnabled (true) .build ();