Máy ảnh

Bạn có thể sử dụng máy ảnh của Glass để chụp ảnh và quay video, cũng như hiển thị luồng xem trước của máy ảnh cho nhiều trường hợp sử dụng khác nhau.

Tổng quan

Bạn có hai tùy chọn để chụp ảnh hoặc quay video:

  • Gọi hoạt động của máy ảnh tích hợp bằng startActivityForResult(). Hãy sử dụng tuỳ chọn này khi có thể.
  • Tạo logic của riêng bạn bằng API Android Camera. Hãy làm theo các nguyên tắc sau nếu bạn đang sử dụng phương pháp này:

    • Chụp ảnh khi nhấp vào nút máy ảnh và video khi nhấp lâu, giống như Glass.
    • Cho người dùng biết liệu họ đã chụp ảnh hoặc quay video.
    • Luôn bật màn hình trong khi chụp.

Chia sẻ máy ảnh với hệ thống Glass

Nếu Glassware sử dụng API của Android để truy cập máy ảnh, hãy tạm thời huỷ máy ảnh khi có thể nếu người dùng nhấn nút máy ảnh phần cứng.

  1. Ghi đè phương thức onKeyDown() trong hoạt động của bạn và chặn KEYCODE_CAMERA để xử lý các thao tác nhấn nút máy ảnh.

  2. Giải phóng máy ảnh và trả về false để cho biết rằng bạn không sử dụng sự kiện này để máy ảnh Glass tích hợp khởi động.

  1. Sau khi quá trình chụp ảnh hoặc quay video diễn ra, Glass quay lại hoạt động của bạn, tại đây bạn có thể lấy lại máy ảnh trong 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.
    }
    

Chụp ảnh hoặc quay video

Hình ảnh

Để chụp ảnh bằng Dụng cụ kính máy ảnh tích hợp sẵn:

  1. Gọi startActivityForResult(Intent, int) với thao tác được đặt là ACTION_IMAGE_CAPTURE.
  2. Trong onActivityResult(int, int, android.content.Intent):
    1. Đảm bảo rằng requestCode khớp với mã yêu cầu được dùng khi bắt đầu ý định chụp ảnh.
    2. Đảm bảo rằng resultCode khớp với RESULT_OK.
    3. Lấy đường dẫn đến hình thu nhỏ của hình ảnh từ phần bổ sung của Intent bằng khoá EXTRA_THUMBNAIL_FILE_PATH nếu cần.
    4. Đường dẫn đến hình ảnh đầy đủ có sẵn từ phần bổ sung của Intent với khoá EXTRA_PICTURE_FILE_PATH. Khi ý định chụp ảnh trả về quyền kiểm soát cho Glass của bạn, hình ảnh có thể không được ghi đầy đủ vào tệp. Xác minh rằng tệp hình ảnh tồn tại hoặc sử dụng FileObserver để theo dõi thư mục mẹ của tệp hình ảnh đó. Khi hình ảnh đầy đủ có sẵn, hãy tải tệp và sử dụng tệp đó trong 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

Cách quay video bằng dụng cụ Glass Camera tích hợp:

  1. Gọi startActivityForResult(Intent, int) với thao tác được đặt là ACTION_VIDEO_CAPTURE.
  2. Trong onActivityResult(int, int, android.content.Intent):
    1. Đảm bảo rằng requestCode khớp với mã yêu cầu được dùng khi bắt đầu ý định quay video.
    2. Đảm bảo rằng resultCode khớp với RESULT_OK.
    3. Lấy đường dẫn đến hình thu nhỏ của video từ phần bổ sung của Intent bằng khoá EXTRA_THUMBNAIL_FILE_PATH để hiển thị bản xem trước nếu cần.
    4. Đường dẫn đến video đã ghi có sẵn từ phần bổ sung của Intent bằng khoá EXTRA_VIDEO_FILE_PATH.