Appareil photo

Vous pouvez utiliser l'appareil photo Glass pour enregistrer des images et des vidéos, ainsi que pour afficher le flux d'aperçu de l'appareil photo dans différents cas d'utilisation.

Présentation

Vous disposez de deux options pour enregistrer des images ou des vidéos:

  • Appeler l'activité de la caméra intégrée avec startActivityForResult() Utilisez cette option lorsque cela est possible.
  • Créer votre propre logique avec l'API Android Camera Suivez ces consignes si vous utilisez cette méthode:

    • Prenez une photo lors d'un clic sur le bouton de l'appareil photo et une vidéo lors d'un clic prolongé, comme le fait Glass.
    • Indiquer à l'utilisateur si une photo a été prise ou si une vidéo a été enregistrée.
    • Garder l'écran allumé pendant la capture.

Partager la caméra avec le système Glass

Si votre Glassware utilise les API Android pour accéder à l'appareil photo, relâchez temporairement l'appareil photo lorsque cela est possible si les utilisateurs appuient sur le bouton de l'appareil photo matériel.

  1. Remplacez la méthode onKeyDown() dans votre activité et interceptez KEYCODE_CAMERA pour gérer les pressions sur le bouton de l'appareil photo.

  2. Relâchez la caméra, puis renvoyez false pour indiquer que vous n'avez pas consommé l'événement et démarrer la caméra Glass intégrée.

  1. Une fois l'image ou la capture vidéo effectuée, Glass revient à votre activité, où vous pouvez récupérer l'appareil photo dans 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.
    }
    

Capturer des images ou des vidéos

Images

Pour prendre une photo avec la fonctionnalité Glassware intégrée à l'appareil photo:

  1. Appelez startActivityForResult(Intent, int) avec l'action définie sur ACTION_IMAGE_CAPTURE.
  2. Dans onActivityResult(int, int, android.content.Intent) :
    1. Assurez-vous que requestCode correspond au code de requête utilisé lors du démarrage de l'intent de capture d'image.
    2. Assurez-vous que resultCode correspond à RESULT_OK.
    3. Obtenez le chemin d'accès à la vignette de l'image à partir des données supplémentaires de Intent à l'aide de la clé EXTRA_THUMBNAIL_FILE_PATH, si nécessaire.
    4. Le chemin d'accès à l'image complète est disponible à partir des informations supplémentaires de Intent avec la clé EXTRA_PICTURE_FILE_PATH. Lorsque l'intent de capture d'image rend le contrôle à votre Glass, l'image peut ne pas être entièrement écrite dans le fichier. Vérifiez que le fichier image existe ou utilisez un fichier FileObserver pour surveiller son répertoire parent. Une fois l'image complète disponible, chargez le fichier et utilisez-le dans votre 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();
    }
}

Vidéos

Pour enregistrer une vidéo à l'aide du Glass Camera intégré:

  1. Appelez startActivityForResult(Intent, int) avec l'action définie sur ACTION_VIDEO_CAPTURE.
  2. Dans onActivityResult(int, int, android.content.Intent) :
    1. Assurez-vous que requestCode correspond au code de requête utilisé au démarrage de l'intent de capture vidéo.
    2. Assurez-vous que resultCode correspond à RESULT_OK.
    3. Obtenez le chemin d'accès à la miniature de la vidéo à partir des Intent supplémentaires à l'aide de la touche EXTRA_THUMBNAIL_FILE_PATH pour afficher un aperçu, si nécessaire.
    4. Le chemin d'accès à la vidéo enregistrée est disponible à partir des informations supplémentaires de Intent avec la clé EXTRA_VIDEO_FILE_PATH.