الكاميرا

يمكنك استخدام كاميرا 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 المفتاح. عندما يعود الهدف من التقاط الصورة إلى التحكم في في برامج 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 المفتاح.