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.
Anula el
onKeyDown()
en tu actividad e interceptarKEYCODE_CAMERA
para controlar las pulsaciones de los botones de la cámara.Suelta la cámara y muestra
false
para indicar que no consumiste el para que se inicie la cámara de Glass integrada.
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:
- Llamada
startActivityForResult(Intent, int)
con la acción establecida comoACTION_IMAGE_CAPTURE
- En
onActivityResult(int, int, android.content.Intent)
:- 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. - Asegúrate de que
resultCode
coincida conRESULT_OK
. - Obtén la ruta de acceso a la miniatura de la imagen desde la
De
Intent
adicional con elEXTRA_THUMBNAIL_FILE_PATH
clave, si es necesario. - La ruta a la imagen completa se encuentra disponible en
De
Intent
adicional con elEXTRA_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 unaFileObserver
para supervisar su directorio principal. Cuando la imagen completa es disponible, carga el archivo y úsalo en Glassware.
- Asegúrate de que
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:
- Llamada
startActivityForResult(Intent, int)
con la acción establecida comoACTION_VIDEO_CAPTURE
- En
onActivityResult(int, int, android.content.Intent)
:- Asegúrate de que
requestCode
coincida con el código de solicitud que se usa cuando iniciar la intención de captura de video. - Asegúrate de que
resultCode
coincida conRESULT_OK
. - Obtén la ruta de acceso a la miniatura del video desde la
De
Intent
adicional con elEXTRA_THUMBNAIL_FILE_PATH
para mostrar una vista previa si es necesario. - La ruta de acceso al video grabado está disponible en el
De
Intent
adicional con elEXTRA_VIDEO_FILE_PATH
.
- Asegúrate de que