Camera

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

Tổng quan

Bạn có hai lựa chọn để chụp ảnh hoặc quay video:

  • Gọi hoạt động của camera tích hợp sẵn bằng startActivityForResult(). Hãy sử dụng cách này khi có thể.
  • Xây dựng logic của riêng bạn bằng API Máy ảnh Android. 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 bằng một lượt nhấp vào nút camera và quay video sau một cú nhấp chuột, giống như cách Glass đã làm.
    • Cho người dùng biết liệu hình ảnh đã được chụp hay quay video.
    • Luôn bật màn hình trong khi chụp.

Chia sẻ camera với hệ thống Glass

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

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

  2. Thả camera ra rồi trả về false để cho biết rằng bạn không sử dụng để máy ảnh Glass tích hợp sẵn khởi động.

  1. Sau khi quá trình chụp ảnh hoặc quay video diễn ra, Glass sẽ trả về nơi bạn có thể lấy lại máy ảnh 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

Cách chụp ảnh bằng Thuỷ tinh tích hợp sẵn cho máy ảnh:

  1. Gọi điện startActivityForResult(Intent, int) với hành động đượ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ừ Điều khoản dịch vụ và Chính sách quyền riêng tư của Intent với EXTRA_THUMBNAIL_FILE_PATH khoá, nếu cần.
    4. Đường dẫn đến hình ảnh đầy đủ có sẵn từ Điều khoản dịch vụ và Chính sách quyền riêng tư của Intent với EXTRA_PICTURE_FILE_PATH . Khi ý định chụp ảnh trả về quyền kiểm soát cho Bằng thuỷ tinh, hình ảnh có thể không được ghi đầy đủ vào tệp. Xác minh tệp hình ảnh tồn tại hoặc sử dụng FileObserver để giám sát thư mục mẹ của nó. Khi hình ảnh đầy đủ khả dụng, hãy tải tệp và sử dụng tệp đó trong Glassware của bạn.
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 Kính thuỷ tinh tích hợp sẵn:

  1. Gọi điện startActivityForResult(Intent, int) với hành động đượ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ừ Điều khoản dịch vụ và Chính sách quyền riêng tư của Intent với tính năng 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ừ Điều khoản dịch vụ và Chính sách quyền riêng tư của Intent với EXTRA_VIDEO_FILE_PATH .