Fotocamera

Puoi utilizzare la fotocamera Glass per acquisire immagini e video, nonché per visualizzare lo stream in anteprima della videocamera per una serie di casi d'uso diversi.

Panoramica

Sono disponibili due opzioni per l'acquisizione di immagini o video:

  • Chiamata all'attività della fotocamera integrata con startActivityForResult(). Utilizza questa opzione quando possibile.
  • Creare la propria logica con l'API Android Camera. Se utilizzi questo metodo, segui queste linee guida:

    • Scatta una foto con un clic sul pulsante della fotocamera e un video con un clic lungo, proprio come fa Glass.
    • Indica all'utente se è stata scattata una foto o se è stato registrato un video.
    • Mantieni lo schermo attivo durante l'acquisizione.

Condivisione della videocamera con il sistema Glass

Se Glassware utilizza le API Android per accedere alla fotocamera, rilasciala temporaneamente, se possibile, se gli utenti premeno il pulsante della fotocamera hardware.

  1. Sostituisci il metodo onKeyDown() nella tua attività e intercetta KEYCODE_CAMERA per gestire le pressioni dei pulsanti della fotocamera.

  2. Rilascia la videocamera e restituisci false per indicare che non hai consumato l'evento in modo che si avvii la videocamera Glass integrata.

  1. Dopo l'acquisizione dell'immagine o del video, Glass torna alla tua attività, dove puoi rivendicare di nuovo la fotocamera in 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.
    }
    

Acquisizione di immagini o video

Immagini

Per acquisire un'immagine utilizzando il Glassware integrato nella fotocamera:

  1. Chiama startActivityForResult(Intent, int) con l'azione impostata su ACTION_IMAGE_CAPTURE.
  2. In onActivityResult(int, int, android.content.Intent):
    1. Assicurati che requestCode corrisponda al codice di richiesta utilizzato quando hai avviato l'intent di acquisizione delle immagini.
    2. Assicurati che resultCode corrisponda a RESULT_OK.
    3. Se necessario, ottieni il percorso della miniatura dell'immagine dall'extra di Intent con la chiave EXTRA_THUMBNAIL_FILE_PATH.
    4. Il percorso dell'immagine completa è disponibile dall'extra di Intent con la chiave EXTRA_PICTURE_FILE_PATH. Quando l'intent di acquisizione dell'immagine restituisce il controllo al tuo vetro, l'immagine potrebbe non essere stata scritta completamente. Verifica che il file immagine esista o utilizza un FileObserver per monitorare la directory principale. Quando è disponibile l'immagine completa, carica il file e utilizzalo nel tuo 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();
    }
}

Video

Per registrare un video con il Glassware integrato nella fotocamera:

  1. Chiama startActivityForResult(Intent, int) con l'azione impostata su ACTION_VIDEO_CAPTURE.
  2. In onActivityResult(int, int, android.content.Intent):
    1. Assicurati che requestCode corrisponda al codice di richiesta utilizzato quando hai avviato l'intent di acquisizione video.
    2. Assicurati che resultCode corrisponda a RESULT_OK.
    3. Ottieni il percorso della miniatura del video dall'extra di Intent con il tasto EXTRA_THUMBNAIL_FILE_PATH per visualizzare un'anteprima, se necessario.
    4. Il percorso del video registrato è disponibile nell'extra di Intent con la chiave EXTRA_VIDEO_FILE_PATH.