カメラ

Glass カメラを使用して画像や動画をキャプチャしたり、カメラのプレビュー ストリームをさまざまなユースケースで表示したりできます。

概要

画像または動画を撮影するには、次の 2 つの方法があります。

  • startActivityForResult() を使用して組み込みのカメラ アクティビティを呼び出す。 可能であれば、このオプションを使用してください。
  • Android Camera API で独自のロジックを作成する。この方法を使用する場合は、次のガイドラインに従ってください。

    • Glass と同じように、カメラボタンのクリックで写真を撮影し、長押しで動画を撮影します。
    • 写真が撮影されたか、記録されたかを示します。
    • 撮影中は画面をオンのままにしてください。

Glass システムとカメラを共有する

Glassware が Android API を使用してカメラにアクセスする場合、ユーザーがハードウェアのカメラボタンを押すと、可能であればカメラを一時的に解放します。

  1. アクティビティの onKeyDown() メソッドをオーバーライドし、KEYCODE_CAMERA をインターセプトしてカメラボタンの押下を処理します。

  2. カメラを解放し、false を返します。これは、イベントを消費しなかったことを示すため、内蔵の Glass カメラが起動します。

  1. 画像や動画のキャプチャが完了すると、Glass はアクティビティに戻り、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.
    }
    

画像または動画のキャプチャ

画像

組み込みのカメラ Glassware を使用して画像を撮影するには:

  1. アクションを ACTION_IMAGE_CAPTURE に設定して startActivityForResult(Intent, int) を呼び出します。
  2. onActivityResult(int, int, android.content.Intent) 内:
    1. requestCode が、画像キャプチャ インテントの開始時に使用されたリクエスト コードと一致することを確認します。
    2. resultCodeRESULT_OK と一致することを確認します。
    3. 必要に応じて、EXTRA_THUMBNAIL_FILE_PATH キーで Intent エクストラから画像のサムネイルへのパスを取得します。
    4. 完全なイメージへのパスは、EXTRA_PICTURE_FILE_PATH キーを使用して Intent エクストラから取得できます。画像キャプチャ インテントが Glassware に制御を返したときに、画像が完全にファイルに書き込まれない場合があります。画像ファイルが存在することを確認するか、FileObserver を使用してその親ディレクトリをモニタリングします。完全なイメージが準備できたら、そのファイルを読み込んで 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();
    }
}

動画

組み込みのカメラ Glassware を使用して動画を撮影するには:

  1. アクションを ACTION_VIDEO_CAPTURE に設定して startActivityForResult(Intent, int) を呼び出します。
  2. onActivityResult(int, int, android.content.Intent) 内:
    1. requestCode が、動画キャプチャ インテントの開始時に使用されたリクエスト コードと一致することを確認します。
    2. resultCodeRESULT_OK と一致することを確認します。
    3. EXTRA_THUMBNAIL_FILE_PATH キーで Intent エクストラから動画のサムネイルへのパスを取得し、必要に応じてプレビューを表示します。
    4. 録画された動画へのパスは、EXTRA_VIDEO_FILE_PATH キーを使用して Intent エクストラから取得できます。