الكاميرا

يمكنك استخدام كاميرا Glass لالتقاط الصور ومقاطع الفيديو وعرض بث معاينة الكاميرا لمجموعة متنوعة من حالات الاستخدام المختلفة.

نظرة عامة

لديك خياران لالتقاط الصور أو الفيديو:

  • الاتصال بنشاط الكاميرا المضمَّنة باستخدام startActivityForResult() استخدم هذا الخيار عندما يكون ذلك ممكنًا.
  • اعتماد منطق خاص باستخدام واجهة برمجة تطبيقات كاميرا Android اتبع هذه الإرشادات إذا كنت تستخدم هذه الطريقة:

    • يمكنك التقاط صورة بنقرة على زر الكاميرا ومقطع فيديو بنقرة طويلة، كما هو الحال في Glass.
    • وضح للمستخدم ما إذا تم التقاط صورة أو تسجيل فيديو.
    • اترك الشاشة قيد التشغيل أثناء الالتقاط.

مشاركة الكاميرا مع نظام Glass

إذا كانت Glassware تستخدم واجهات برمجة تطبيقات Android للدخول إلى الكاميرا، فحرر الكاميرا مؤقتًا إن أمكن إذا ضغط المستخدمون على زر كاميرا الجهاز.

  1. يمكنك إلغاء طريقة onKeyDown() في نشاطك واعتراض KEYCODE_CAMERA للتعامل مع عمليات الضغط على زر الكاميرا.

  2. حرر الكاميرا وارجع false لتشير إلى أنك لم تحضر الحدث بحيث تبدأ كاميرا Glass المدمجة.

  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. ويمكنك الحصول على المسار إلى الصورة المصغّرة من الإضافة Intent باستخدام مفتاح EXTRA_THUMBNAIL_FILE_PATH إذا لزم الأمر.
    4. مسار الصورة الكاملة متاح من خلال إضافة Intent باستخدام المفتاح EXTRA_PICTURE_FILE_PATH. عندما يعرض هدف التقاط الصورة عنصر التحكم في الزجاج، قد لا تكون الصورة مكتوبة بالكامل في ملف. تحقق من وجود ملف الصورة أو استخدم 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.