Kamera

Anda dapat menggunakan kamera Glass untuk mengambil gambar dan video, serta menampilkan streaming pratinjau kamera untuk berbagai kasus penggunaan yang berbeda.

Ringkasan

Anda memiliki dua opsi untuk mengambil gambar atau video:

  • Memanggil aktivitas kamera bawaan dengan startActivityForResult(). Gunakan opsi ini jika memungkinkan.
  • Membuat logika Anda sendiri dengan Android Camera API. Ikuti panduan ini jika Anda menggunakan metode ini:

    • Ambil gambar dengan mengklik tombol kamera dan video dengan klik lama, seperti yang dilakukan Glass.
    • Tunjukkan kepada pengguna apakah gambar telah diambil atau video telah direkam.
    • Buat layar tetap menyala selama pengambilan gambar.

Berbagi kamera dengan sistem Glass

Jika Glassware Anda menggunakan Android API untuk mengakses kamera, rilis kamera untuk sementara jika memungkinkan jika pengguna menekan tombol kamera hardware.

  1. Ganti metode onKeyDown() dalam aktivitas Anda dan cegat KEYCODE_CAMERA untuk menangani penekanan tombol kamera.

  2. Lepaskan kamera dan tampilkan false untuk menunjukkan bahwa Anda tidak menggunakan peristiwa tersebut sehingga kamera Glass bawaan dimulai.

  1. Setelah pengambilan gambar atau video berlangsung, Glass kembali ke aktivitas Anda, tempat Anda dapat mengklaim kembali kamera di 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.
    }
    

Mengambil gambar atau video

Gambar

Untuk mengambil gambar menggunakan Glassware Kamera bawaan:

  1. Panggil startActivityForResult(Intent, int) dengan tindakan yang ditetapkan sebagai ACTION_IMAGE_CAPTURE.
  2. Di onActivityResult(int, int, android.content.Intent):
    1. Pastikan requestCode cocok dengan kode permintaan yang digunakan saat memulai intent pengambilan gambar.
    2. Pastikan resultCode cocok dengan RESULT_OK.
    3. Dapatkan jalur ke thumbnail gambar dari tambahan Intent dengan kunci EXTRA_THUMBNAIL_FILE_PATH, jika diperlukan.
    4. Jalur ke gambar penuh tersedia dari tambahan Intent dengan kunci EXTRA_PICTURE_FILE_PATH. Saat intent pengambilan gambar menampilkan kontrol ke Glassware, gambar mungkin tidak sepenuhnya ditulis ke file. Pastikan bahwa file gambar ada atau gunakan FileObserver untuk memantau direktori induknya. Setelah gambar penuh tersedia, muat file dan gunakan dalam 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

Untuk merekam video menggunakan Glass Glass Kamera bawaan:

  1. Panggil startActivityForResult(Intent, int) dengan tindakan yang ditetapkan sebagai ACTION_VIDEO_CAPTURE.
  2. Di onActivityResult(int, int, android.content.Intent):
    1. Pastikan bahwa requestCode cocok dengan kode permintaan yang digunakan saat memulai intent pengambilan video.
    2. Pastikan resultCode cocok dengan RESULT_OK.
    3. Dapatkan jalur ke thumbnail video dari tambahan Intent dengan kunci EXTRA_THUMBNAIL_FILE_PATH untuk menampilkan pratinjau jika perlu.
    4. Jalur ke video yang direkam tersedia dari tambahan Intent dengan kunci EXTRA_VIDEO_FILE_PATH.