Cámara

Puedes utilizar 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 para una variedad de casos de uso diferentes.

Descripción general

Tienes dos opciones para capturar imágenes o video:

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

    • Al igual que con Glass, puedes tomar una foto con un clic en el botón de la cámara y grabar un video con un clic largo.
    • Indica al usuario si se tomó una foto o se grabó un video.
    • Mantén la pantalla encendida durante la captura.

Cómo compartir la cámara con el sistema Glass

Si tu Glassware utiliza las API de Android para acceder a la cámara, liberar temporalmente la cámara, cuando sea posible, si los usuarios presionan botón de la cámara.

  1. Anula el onKeyDown() en tu actividad e interceptar KEYCODE_CAMERA para controlar las pulsaciones de los botones de la cámara.

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

  1. Después de que se realiza la captura de imagen o video, Glass vuelve a tu en la que puedes recuperar 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.
    }
    

Capturar imágenes o videos

Imágenes

Para capturar una imagen con la cámara integrada de Glassware, haz lo siguiente:

  1. Llamada startActivityForResult(Intent, int) con la acción establecida 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 usa cuando para iniciar 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 la De Intent adicional con el EXTRA_THUMBNAIL_FILE_PATH clave, si es necesario.
    4. La ruta a la imagen completa se encuentra disponible en De Intent adicional con el EXTRA_PICTURE_FILE_PATH . Cuando el intent de captura de imágenes devuelve el control a tu Cristalería, es posible que la imagen no esté completamente escrita en el archivo. Verificar que el archivo de imagen existe o usar una FileObserver para supervisar su directorio principal. Cuando la imagen completa es disponible, carga el archivo y úsalo en 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 el cristal integrado de la cámara, haz lo siguiente:

  1. Llamada startActivityForResult(Intent, int) con la acción establecida 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 usa cuando iniciar la intención 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 la De Intent adicional con el EXTRA_THUMBNAIL_FILE_PATH para mostrar una vista previa si es necesario.
    4. La ruta de acceso al video grabado está disponible en el De Intent adicional con el EXTRA_VIDEO_FILE_PATH .