دوربین

می‌توانید از دوربین شیشه‌ای برای ضبط تصاویر و ویدیو و همچنین نمایش جریان پیش‌نمایش دوربین برای موارد مختلف استفاده کنید.

بررسی اجمالی

شما دو گزینه برای گرفتن عکس یا ویدیو دارید:

  • فراخوانی فعالیت داخلی دوربین با startActivityForResult() . در صورت امکان از این گزینه استفاده کنید.
  • ایجاد منطق خود با Android Camera API . اگر از این روش استفاده می کنید این دستورالعمل ها را دنبال کنید:

    • با کلیک روی دکمه دوربین عکس بگیرید و با یک کلیک طولانی یک فیلم بگیرید، درست مانند Glass.
    • به کاربر نشان دهید که عکس گرفته شده است یا فیلمی ضبط شده است.
    • در حین عکسبرداری صفحه نمایش را روشن نگه دارید.

به اشتراک گذاری دوربین با سیستم شیشه ای

اگر Glassware شما از API های Android برای دسترسی به دوربین استفاده می کند، اگر کاربران دکمه دوربین سخت افزاری را فشار دهند، در صورت امکان دوربین را به طور موقت رها کنید.

  1. روش onKeyDown() را در فعالیت خود نادیده بگیرید و KEYCODE_CAMERA برای کنترل فشار دادن دکمه دوربین متوقف کنید.

  2. دوربین را رها کنید و false برگردانید تا نشان دهید که رویداد را مصرف نکرده اید تا دوربین شیشه ای داخلی شروع به کار کند.

  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. startActivityForResult(Intent, int) با مجموعه کنش ACTION_IMAGE_CAPTURE فراخوانی کنید.
  2. در onActivityResult(int, int, android.content.Intent) :
    1. اطمینان حاصل کنید که requestCode با کد درخواستی که هنگام شروع هدف ثبت تصویر استفاده می شود مطابقت دارد.
    2. اطمینان حاصل کنید که resultCode با RESULT_OK مطابقت دارد.
    3. در صورت لزوم با کلید EXTRA_THUMBNAIL_FILE_PATH مسیر تصویر کوچک تصویر را از قسمت اضافی Intent بدست آورید.
    4. مسیر تصویر کامل از قسمت اضافی Intent با کلید EXTRA_PICTURE_FILE_PATH در دسترس است. وقتی هدف ثبت تصویر کنترل را به 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. startActivityForResult(Intent, int) را با مجموعه کنش ACTION_VIDEO_CAPTURE فراخوانی کنید.
  2. در onActivityResult(int, int, android.content.Intent) :
    1. اطمینان حاصل کنید که requestCode با کد درخواستی که هنگام شروع هدف ضبط ویدیو استفاده می شود مطابقت دارد.
    2. اطمینان حاصل کنید که resultCode با RESULT_OK مطابقت دارد.
    3. مسیر تصویر کوچک ویدیو را از قسمت Intent با کلید EXTRA_THUMBNAIL_FILE_PATH دریافت کنید تا در صورت لزوم پیش‌نمایش نمایش داده شود.
    4. مسیر ویدیوی ضبط شده از قسمت اضافی Intent با کلید EXTRA_VIDEO_FILE_PATH در دسترس است.