相機

您可以使用 Glass 相機來拍攝圖片和影片,以及顯示各種不同用途的相機預覽串流。

總覽

擷取圖片或影片的方法有兩種:

  • 使用 startActivityForResult() 呼叫內建攝影機活動。請盡可能使用這個選項。
  • 使用 Android Camera API 建構自己的邏輯。如果使用這個方法,請遵守以下規範:

    • 只要像使用 Glass 一樣,按下相機按鈕並長按就能拍攝影片。
    • 告知使用者是否已拍照或錄影。
    • 在拍攝期間讓螢幕保持開啟。

使用 Glass 系統分享相機

如果您的 Glassware 使用 Android API 存取相機,當使用者按下硬體相機按鈕時,請暫時釋出相機。

  1. 覆寫活動中的 onKeyDown() 方法並攔截 KEYCODE_CAMERA 來處理相機按鈕的按下動作。

  2. 啟動相機並傳回 false,表示您未取用事件,因此內建 Glass 相機會啟動。

  1. 圖片或影片拍攝完成後,G 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.
    }
    

擷取圖片或影片

圖片

如何使用內建的 Camera Glassware 拍攝圖片:

  1. 呼叫 startActivityForResult(Intent, int),並將動作設為 ACTION_IMAGE_CAPTURE
  2. onActivityResult(int, int, android.content.Intent) 中:
    1. 確認 requestCode 與啟動圖片擷取意圖時使用的要求代碼相符。
    2. 確認 resultCodeRESULT_OK 相符。
    3. 如有需要,可以使用 Intent 額外金鑰 EXTRA_THUMBNAIL_FILE_PATH 取得圖片縮圖的路徑。
    4. 完整映像檔的路徑可透過 Intent 的額外項目使用 EXTRA_PICTURE_FILE_PATH 鍵取得。當圖片擷取意圖將控制項傳回 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();
    }
}

影片

如何使用內建的 Camera Glassware 拍攝影片:

  1. 呼叫 startActivityForResult(Intent, int),並將動作設為 ACTION_VIDEO_CAPTURE
  2. onActivityResult(int, int, android.content.Intent) 中:
    1. 確認 requestCode 與啟動影片擷取意圖時使用的要求代碼相符。
    2. 確認 resultCodeRESULT_OK 相符。
    3. Intent 的額外項目取得 EXTRA_THUMBNAIL_FILE_PATH 鍵的影片縮圖路徑,以顯示預覽。
    4. 您可以從 EXTRA_VIDEO_FILE_PATHIntent 額外項目中取得錄製影片的路徑。