Você pode usar a câmera do Google Glass para capturar imagens e vídeos, além de exibir o stream de visualização da câmera em vários casos de uso diferentes.
Visão geral
Você tem duas opções para capturar imagens ou vídeos:
- Chamar a atividade de câmera integrada com
startActivityForResult()
. Use essa opção quando possível. Criar sua própria lógica com a API Android Camera. Siga estas diretrizes se estiver usando este método:
- Tire uma foto com um clique no botão de câmera e um vídeo com um clique longo, assim como o Google Glass faz.
- Indique ao usuário se uma foto foi tirada ou um vídeo foi gravado.
- Mantenha a tela ligada durante a captura.
Como compartilhar a câmera com o sistema do Google Glass
Se o Glassware usar as APIs do Android para acessar a câmera, libere temporariamente a câmera quando possível, se os usuários pressionarem o botão da câmera.
Substitua o método
onKeyDown()
na atividade e intercepteKEYCODE_CAMERA
para processar o pressionamento de botões da câmera.Solte a câmera e retorne
false
para indicar que você não consumiu o evento para que a câmera de vidro integrada seja iniciada.
Depois que a captura de imagem ou vídeo é realizada, o Google Glass retorna à atividade, onde é possível recuperar a câmera em
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 imagens ou vídeos
Imagens
Para capturar uma imagem usando o Camera Glassware integrado:
- Chame
startActivityForResult(Intent, int)
com a ação definida comoACTION_IMAGE_CAPTURE
. - Em
onActivityResult(int, int, android.content.Intent)
:- Verifique se o
requestCode
corresponde ao código de solicitação usado ao iniciar a intent de captura de imagem. - Confira se o
resultCode
corresponde aRESULT_OK
. - Consiga o caminho para a miniatura da imagem no extra da
Intent
com a chaveEXTRA_THUMBNAIL_FILE_PATH
, se necessário. - O caminho para a imagem completa está disponível no extra do
Intent
com a chaveEXTRA_PICTURE_FILE_PATH
. Quando a intent de captura de imagem retorna controle para o Glassware, a imagem pode não ser totalmente gravada no arquivo. Verifique se o arquivo de imagem existe ou use umFileObserver
para monitorar o diretório pai. Quando a imagem completa estiver disponível, carregue o arquivo e use-o no Glassware.
- Verifique se o
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();
}
}
Vídeos
Para capturar um vídeo usando o Camera Glassware integrado:
- Chame
startActivityForResult(Intent, int)
com a ação definida comoACTION_VIDEO_CAPTURE
. - Em
onActivityResult(int, int, android.content.Intent)
:- Verifique se o
requestCode
corresponde ao código de solicitação usado ao iniciar a intent de captura de vídeo. - Confira se o
resultCode
corresponde aRESULT_OK
. - Veja o caminho para a miniatura do vídeo no extra do
Intent
com a chaveEXTRA_THUMBNAIL_FILE_PATH
para exibir uma visualização, se necessário. - O caminho para o vídeo gravado está disponível no extra do
Intent
com a chaveEXTRA_VIDEO_FILE_PATH
.
- Verifique se o