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.
Anula el método
onKeyDown()
de tu actividad y, luego, interceptaKEYCODE_CAMERA
para controlar cómo se presionan los botones de la cámara.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.
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:
- Llama a
startActivityForResult(Intent, int)
con la acción configurada comoACTION_IMAGE_CAPTURE
. - En
onActivityResult(int, int, android.content.Intent)
:- 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. - Asegúrate de que
resultCode
coincida conRESULT_OK
. - Obtén la ruta de acceso a la miniatura de la imagen desde el extra del
Intent
con la claveEXTRA_THUMBNAIL_FILE_PATH
, si es necesario. - La ruta a la imagen completa está disponible en el extra de
Intent
con la claveEXTRA_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 unFileObserver
para supervisar su directorio superior. Cuando la imagen completa esté disponible, carga el archivo y úsalo en tu 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 la cámara de vidrio integrada:
- Llama a
startActivityForResult(Intent, int)
con la acción configurada comoACTION_VIDEO_CAPTURE
. - En
onActivityResult(int, int, android.content.Intent)
:- Asegúrate de que
requestCode
coincida con el código de solicitud que se usó cuando se inició el intent de captura de video. - Asegúrate de que
resultCode
coincida conRESULT_OK
. - Obtén la ruta de acceso a la miniatura del video desde el extra del
Intent
con la claveEXTRA_THUMBNAIL_FILE_PATH
para mostrar una vista previa si es necesario. - La ruta al video grabado está disponible en el extra de
Intent
con la claveEXTRA_VIDEO_FILE_PATH
.
- Asegúrate de que