Kamera

Camları kullanarak fotoğraf ve video çekebilir, ayrıca kameranın önizleme akışını farklı kullanım alanlarında görüntüleyebilirsiniz.

Genel bakış

Resim veya video çekmek için iki seçeneğiniz vardır:

  • startActivityForResult() ile yerleşik kamera etkinliğine çağrı yapılıyor. Mümkün olduğunda bu seçeneği kullanın.
  • Android Camera API ile kendi mantığınızı oluşturma. Bu yöntemi kullanıyorsanız aşağıdaki yönergeleri izleyin:

    • Tıpkı Glass'ın yaptığı gibi kamera düğmesi tıklamasında ve uzun tıklamada fotoğraf çekin.
    • Kullanıcıya bir resmin çekilip çekilmediğini veya videonun kaydedilip kaydedilmediğini belirtin.
    • Yakalama sırasında ekranı açık tutun.

Kamerayı Glass sistemiyle paylaşma

Glassware, kameraya erişmek için Android API'lerini kullanıyorsa kullanıcılar donanım kamera düğmesine bastığında mümkün olduğunda kamerayı geçici olarak bırakın.

  1. Etkinliğinizde onKeyDown() yöntemini geçersiz kılın ve kamera düğmesine basmak için KEYCODE_CAMERA aracına müdahale edin.

  2. Kamerayı bırakın ve yerleşik Glass kameranın başlaması için etkinliği kullanmadığınızı belirtmek üzere false işlevini döndürün.

  1. Resim veya video çekimi tamamlandıktan sonra Glass, etkinliğinize geri döner. Burada onResume() uygulamasında kamerayı geri alabilirsiniz.

    @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.
    }
    

Resim veya video yakalama

Görseller

Yerleşik Kamera Glassware'i kullanarak resim çekmek için:

  1. startActivityForResult(Intent, int) numaralı telefonu işlem olarak ACTION_IMAGE_CAPTURE olarak ayarlayın.
  2. onActivityResult(int, int, android.content.Intent)'te:
    1. requestCode öğesinin, resim yakalama amacı başlatılırken kullanılan istek koduyla eşleştiğinden emin olun.
    2. resultCode öğesinin RESULT_OK ile eşleştiğinden emin olun.
    3. Gerekirse Intent'in ekstra bölümünden EXTRA_THUMBNAIL_FILE_PATH tuşunu kullanarak resmin küçük resminin yolunu bulun.
    4. Tam resme giden yol, EXTRA_PICTURE_FILE_PATH anahtarıyla Intent ekstrasından kullanılabilir. Görüntü yakalama amacı Glasssware'inize denetim verdiğinde, görüntüye tam olarak yazılmamış olabilir. Resim dosyasının var olduğunu doğrulayın veya üst dizinini izlemek için FileObserver kullanın. Tam resim hazır olduğunda dosyayı yükleyin ve Glassware'de kullanı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();
    }
}

Videolar

Yerleşik Kamera Glassware'i kullanarak video çekmek için:

  1. startActivityForResult(Intent, int) numaralı telefonu işlem olarak ACTION_VIDEO_CAPTURE olarak ayarlayın.
  2. onActivityResult(int, int, android.content.Intent)'te:
    1. requestCode, video yakalama amacını başlatırken kullanılan istek koduyla eşleştiğinden emin olun.
    2. resultCode öğesinin RESULT_OK ile eşleştiğinden emin olun.
    3. Gerekirse bir önizleme görüntülemek için EXTRA_THUMBNAIL_FILE_PATH tuşunu kullanarak Intent ekstrasından videonun küçük resminin yolunu bulun.
    4. Kaydedilen videonun yolu, Intent'un EXTRA_VIDEO_FILE_PATH anahtarıyla kullanılabilir.