Cámara

Puedes usar la cámara de Glass para capturar imágenes y videos, y también mostrar la transmisión de vista previa de la cámara en una variedad de casos prácticos diferentes.

Descripción general

Tiene dos opciones para capturar imágenes o videos:

  • Llama a la actividad de la cámara integrada con startActivityForResult(). Usa esta opción siempre que sea posible.
  • Cómo crear tu propia lógica con la API de cámara de Android. Sigue estos lineamientos si usas este método:

    • Toma una foto con un clic de un botón de la cámara y un video con un clic largo, como lo hace Glass.
    • Indica al usuario si se tomó una foto o si se grabó un video.
    • Mantén la pantalla encendida durante la captura.

Compartir la cámara con el sistema Glass

Si tu dispositivo Glassware usa las API de Android para acceder a la cámara, libera la cámara temporalmente cuando sea posible si los usuarios presionan el botón de la cámara de hardware.

  1. Anula el método onKeyDown() de tu actividad y, luego, intercepta KEYCODE_CAMERA para controlar cómo se presionan los botones de la cámara.

  2. Libera la cámara y muestra false para indicar que no consumiste el evento a fin de que se inicie la cámara integrada de Glass.

  1. Después de que se realiza la captura de imagen o video, Glass vuelve a tu actividad, en la que puedes reclamar la cámara en onResume().

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_CAMERA) {
            // Stop the preview and release the camera.
            // Execute your logic as quickly as possible
            // so the capture happens quickly.
            return false;
        } else {
            return super.onKeyDown(keyCode, event);
        }
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        // Re-acquire the camera and start the preview.
    }
    

Captura de imágenes o video

Imágenes

Para capturar una imagen con la cámara integrada Glassware:

  1. Llama a startActivityForResult(Intent, int) con la acción configurada como ACTION_IMAGE_CAPTURE.
  2. En onActivityResult(int, int, android.content.Intent):
    1. Asegúrate de que requestCode coincida con el código de solicitud que se usó cuando se inició el intent de captura de imágenes.
    2. Asegúrate de que resultCode coincida con RESULT_OK.
    3. Obtén la ruta de acceso a la miniatura de la imagen desde el extra del Intent con la clave EXTRA_THUMBNAIL_FILE_PATH, si es necesario.
    4. La ruta a la imagen completa está disponible en el extra de Intent con la clave EXTRA_PICTURE_FILE_PATH. Cuando el intent de captura de imagen le devuelve el control a tu Glass, es posible que la imagen no esté completamente escrita en el archivo. Verifica que el archivo de imagen exista o usa un FileObserver para supervisar su directorio superior. Cuando la imagen completa esté disponible, carga el archivo y úsalo en tu Glassware.
private static final int TAKE_PICTURE_REQUEST = 1;

private void takePicture() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent, TAKE_PICTURE_REQUEST);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == TAKE_PICTURE_REQUEST && resultCode == RESULT_OK) {
        String thumbnailPath = data.getStringExtra(Intents.EXTRA_THUMBNAIL_FILE_PATH);
        String picturePath = data.getStringExtra(Intents.EXTRA_PICTURE_FILE_PATH);

        processPictureWhenReady(picturePath);
        // TODO: Show the thumbnail to the user while the full picture is being
        // processed.
    }

    super.onActivityResult(requestCode, resultCode, data);
}

private void processPictureWhenReady(final String picturePath) {
    final File pictureFile = new File(picturePath);

    if (pictureFile.exists()) {
        // The picture is ready; process it.
    } else {
        // The file does not exist yet. Before starting the file observer, you
        // can update your UI to let the user know that the application is
        // waiting for the picture (for example, by displaying the thumbnail
        // image and a progress indicator).

        final File parentDirectory = pictureFile.getParentFile();
        FileObserver observer = new FileObserver(parentDirectory.getPath(),
                FileObserver.CLOSE_WRITE | FileObserver.MOVED_TO) {
            // Protect against additional pending events after CLOSE_WRITE
            // or MOVED_TO is handled.
            private boolean isFileWritten;

            @Override
            public void onEvent(int event, String path) {
                if (!isFileWritten) {
                    // For safety, make sure that the file that was created in
                    // the directory is actually the one that we're expecting.
                    File affectedFile = new File(parentDirectory, path);
                    isFileWritten = affectedFile.equals(pictureFile);

                    if (isFileWritten) {
                        stopWatching();

                        // Now that the file is ready, recursively call
                        // processPictureWhenReady again (on the UI thread).
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                processPictureWhenReady(picturePath);
                            }
                        });
                    }
                }
            }
        };
        observer.startWatching();
    }
}

Videos

Para capturar un video con la cámara de vidrio integrada:

  1. Llama a startActivityForResult(Intent, int) con la acción configurada como ACTION_VIDEO_CAPTURE.
  2. En onActivityResult(int, int, android.content.Intent):
    1. Asegúrate de que requestCode coincida con el código de solicitud que se usó cuando se inició el intent de captura de video.
    2. Asegúrate de que resultCode coincida con RESULT_OK.
    3. Obtén la ruta de acceso a la miniatura del video desde el extra del Intent con la clave EXTRA_THUMBNAIL_FILE_PATH para mostrar una vista previa si es necesario.
    4. La ruta al video grabado está disponible en el extra de Intent con la clave EXTRA_VIDEO_FILE_PATH.