카메라

Glass 카메라를 사용하여 이미지와 동영상을 캡처하고 다양한 사용 사례에 관한 카메라의 미리보기 스트림을 표시할 수 있습니다.

개요

이미지 또는 동영상을 캡처하는 두 가지 옵션이 있습니다.

  • startActivityForResult()를 사용하여 내장 카메라 활동 호출 가능하면 이 옵션을 사용하세요.
  • Android Camera API를 사용하여 자체 로직 빌드 이 방법을 사용하는 경우 다음 가이드라인을 따르세요.

    • Glass와 마찬가지로 카메라 버튼을 클릭하면 사진을 찍고 길게 클릭하면 동영상을 촬영합니다.
    • 사용자에게 사진이 촬영되었는지 또는 동영상이 녹화되었는지를 표시합니다.
    • 캡처하는 동안 화면을 켜진 상태로 유지합니다.

Glass 시스템과 카메라 공유

Glass 소프트웨어에서 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.
    }
    

이미지 또는 동영상 캡처

이미지

내장된 카메라 글라스웨어를 사용하여 이미지를 캡처하려면 다음 단계를 따르세요.

  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 extras에서 이미지의 썸네일 경로를 가져옵니다.
    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();
    }
}

동영상

내장된 카메라 글라스웨어를 사용하여 동영상을 캡처하려면 다음 단계를 따르세요.

  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 extras에서 동영상 썸네일 경로를 가져와 미리보기를 표시합니다.
    4. 녹화된 동영상의 경로는 EXTRA_VIDEO_FILE_PATH 키와 함께 Intent extras에서 확인할 수 있습니다.