اخبار محصول

فراتر از ویژگی‌های تکی: تضمین ترکیب ویژگی‌ها با CameraX 1.5

مطالعه ۶ دقیقه‌ای
Tahsin Masrur
مهندس نرم‌افزار

اپلیکیشن‌های دوربین مدرن با ویژگی‌های قدرتمند و همپوشانی تعریف می‌شوند. کاربران انتظار دارند که ویدیو را با HDR خیره‌کننده ضبط کنند، حرکات روان را با سرعت 60 فریم در ثانیه ثبت کنند و با استفاده از Preview Stabilization (لرزش‌گیر پیش‌نمایش) فیلم‌هایی بسیار روان و بدون لرزش بگیرند - که اغلب همه این‌ها به طور همزمان انجام می‌شود.

به عنوان توسعه‌دهندگان، می‌دانیم که واقعیت پیچیده‌تر است. چگونه می‌توانید تضمین کنید که یک دستگاه خاص واقعاً از یک ترکیب مشخص پشتیبانی می‌کند؟ تاکنون، فعال کردن چندین ویژگی اغلب یک قمار بود. شما می‌توانستید پشتیبانی از ویژگی‌های تکی را بررسی کنید، اما ترکیب آنها می‌توانست منجر به رفتار نامشخص یا بدتر از آن، یک جلسه دوربین ناموفق شود. این عدم قطعیت، توسعه‌دهندگان را مجبور به محافظه‌کاری می‌کند، که مانع از دسترسی کاربران به بهترین تجربه ممکن در دستگاه‌های دارای این قابلیت می‌شود.

برای مثال، تعداد بسیار کمی از دستگاه‌های رده بالا به طور قابل اعتمادی از HDR و ویدیوی 60 فریم بر ثانیه به طور همزمان پشتیبانی می‌کنند. در نتیجه، اکثر برنامه‌ها از فعال کردن همزمان هر دو خودداری می‌کنند تا از تجربه کاربری ضعیف در اکثر تلفن‌ها جلوگیری کنند.

برای حل این مشکل، ما در CameraX گروه ویژگی‌ها را معرفی می‌کنیم - یک API جدید که برای از بین بردن این حدس و گمان طراحی شده است. اکنون می‌توانید قبل از پیکربندی دوربین، استعلام کنید که آیا ترکیب خاصی از ویژگی‌ها پشتیبانی می‌شود یا خیر، یا به سادگی اولویت‌های خود را به CameraX بگویید و اجازه دهید بهترین ترکیب پشتیبانی شده را برای شما فعال کند.

برای کسانی که تازه با CameraX آشنا شده‌اند

قبل از اینکه به API جدید Feature Group بپردازیم، بیایید به سرعت خلاصه‌ای از CameraX ارائه دهیم. CameraX یک کتابخانه پشتیبانی Jetpack است که برای کمک به شما در آسان‌تر کردن توسعه برنامه دوربین ساخته شده است. این کتابخانه یک سطح API سازگار و آسان برای استفاده ارائه می‌دهد که در اکثر دستگاه‌های اندروید کار می‌کند و با اندروید ۶.۰ (سطح API ۲۳) نیز سازگار است. اگر در CameraX تازه‌کار هستید، توصیه می‌کنیم مستندات رسمی را بررسی کنید و برای شروع، Codelab را امتحان کنید.

آنچه می‌توانید با API گروه ویژگی‌ها بسازید

دیگر نیازی نیست روی ترکیب ویژگی‌ها قمار کنید و می‌توانید با اطمینان بهترین تجربه‌های ممکن دوربین - مانند HDR همزمان و فیلمبرداری 60 فریم بر ثانیه را روی سخت‌افزار توانمند (مثلاً Pixel 10 Pro) - ارائه دهید، در حالی که به طرز زیبایی از خطاها در دستگاه‌هایی که نمی‌توانند از این ترکیب پشتیبانی کنند، جلوگیری می‌کنید.

بی نام.png

پیکسل ۱۰ پرو همزمان HDR و ۶۰ فریم بر ثانیه را فعال می‌کند

بی نام (1).png

در دستگاه‌های قدیمی‌تر که HDR و 60 فریم بر ثانیه نمی‌توانند همزمان اجرا شوند، فقط HDR فعال است و گزینه 60 فریم بر ثانیه غیرفعال است.

با استفاده از API گروه ویژگی‌ها، می‌توانید:

  • رابط‌های کاربری پویا و هوشمندتری بسازید: تنظیمات رابط کاربری خود را بر اساس پشتیبانی سخت‌افزاری بلادرنگ، هوشمندانه فعال یا غیرفعال کنید. برای مثال، اگر کاربری HDR را فعال کند، می‌توانید فوراً گزینه ۶۰ فریم بر ثانیه را در صورتی که این ترکیب در آن دستگاه پشتیبانی نمی‌شود، غیرفعال کنید.
ویژگی‌های پشتیبانی نشده-غیرفعال.gif
  • ارائه حالت "کیفیت بالا" قابل اعتماد: دوربین را با فهرستی اولویت‌بندی‌شده از ویژگی‌های مورد نظر پیکربندی کنید. CameraX به‌طور خودکار بهترین ترکیب پشتیبانی‌شده را برای هر دستگاه مشخص پیدا و فعال می‌کند و نتیجه‌ای عالی را بدون منطق پیچیده و مختص دستگاه تضمین می‌کند.
  • جلوگیری از خرابی‌های جلسه دوربین: با تأیید پشتیبانی از قبل، از تلاش دوربین برای پیکربندی یک ترکیب پشتیبانی نشده جلوگیری می‌کنید، منبع مشترک خرابی‌ها را از بین می‌برید و یک تجربه کاربری روان ارائه می‌دهید.

نحوه کار: اجزای اصلی

این API جدید حول محور ویژگی‌های کلیدی اضافه شده به SessionConfig و CameraInfo متمرکز شده است.

  1. GroupableFeature : این API مجموعه‌ای از ویژگی‌های از پیش تعریف‌شده‌ی قابل گروه‌بندی مانند HDR_HLG10 ، FPS_60 ، PREVIEW_STABILIZATION و IMAGE_ULTRA_HDR را معرفی می‌کند. با توجه به محدودیت‌های محاسباتی، فقط مجموعه‌ای خاص از ویژگی‌ها را می‌توان با درجه‌ی بالایی از قابلیت اطمینان که این API ارائه می‌دهد، گروه‌بندی کرد. ما به طور فعال در تلاشیم تا این لیست را گسترش دهیم و در نسخه‌های آینده پشتیبانی از ویژگی‌های بیشتری را ارائه خواهیم داد.
  2. پارامترهای جدید SessionConfig : این کلاس که برای شروع یک جلسه دوربین استفاده می‌شود، اکنون دو پارامتر جدید را می‌پذیرد:
    • requiredFeatureGroup : از این برای ویژگی‌هایی استفاده کنید که برای موفقیت پیکربندی باید پشتیبانی شوند - ایده‌آل برای ویژگی‌هایی که کاربر صریحاً فعال می‌کند، مانند فعال/غیرفعال کردن سوئیچ 'HDR'. برای اطمینان از یک تجربه قطعی و سازگار، فراخوانی bindToLifecycle در صورت عدم پشتیبانی از ترکیب درخواستی، به جای نادیده گرفتن بی‌سروصدای یک درخواست ویژگی، یک IllegalArgumentException صادر می‌کند. API CameraInfo#isFeatureGroupSupported (جزئیات در زیر) باید از قبل برای پرس‌وجوی این نتیجه استفاده شود.
    • preferredFeatureGroup : از این برای ویژگی‌هایی که مطلوب اما اختیاری هستند استفاده کنید، به عنوان مثال وقتی می‌خواهید حالت پیش‌فرض "کیفیت بالا" را پیاده‌سازی کنید. شما لیستی از ویژگی‌های مورد نظر خود را که بر اساس اولویت‌هایتان مرتب شده‌اند ، ارائه می‌دهید و CameraX به طور خودکار ترکیب با بالاترین اولویتی را که دستگاه پشتیبانی می‌کند، فعال می‌کند.
  3. CameraInfo#isFeatureGroupSupported() : این روش پرس‌وجوی اصلی برای بررسی صریح پشتیبانی از یک گروه ویژگی است و برای ارائه فقط گزینه‌های ویژگی پشتیبانی‌شده به کاربران در رابط کاربری برنامه شما بسیار مناسب است. شما یک SessionConfig به آن ارسال می‌کنید و این یک مقدار بولی برمی‌گرداند که نشان می‌دهد آیا این ترکیب پشتیبانی می‌شود یا خیر. اگر قصد دارید یک SessionConfig با ویژگی‌های مورد نیاز متصل کنید، ابتدا باید از این API استفاده کنید تا مطمئن شوید که پشتیبانی می‌شود.

پیاده‌سازی در عمل

بیایید نگاهی به نحوه استفاده از این اجزا برای ایجاد یک تجربه بهتر با دوربین بیندازیم.

سناریو ۱: حالت کیفیت بالا با «بهترین تلاش»

اگر می‌خواهید بهترین ویژگی‌های ممکن را به طور پیش‌فرض فعال کنید، می‌توانید یک لیست اولویت‌بندی شده را به preferredFeatureGroup ارائه دهید. در این مثال، ما به CameraX می‌گوییم که HDR، سپس 60 FPS و در نهایت Preview Stabilization را در اولویت قرار دهد. CameraX پیچیدگی بررسی تمام ترکیب‌های ممکن و انتخاب بهترین موردی که دستگاه پشتیبانی می‌کند را مدیریت می‌کند.

برای مثال، اگر دستگاهی بتواند HDR و 60 FPS را با هم مدیریت کند اما نتواند از Preview Stabilization استفاده کند، CameraX دو مورد اول را فعال کرده و مورد سوم را حذف می‌کند. به این ترتیب، بدون نوشتن بررسی‌های پیچیده و مختص دستگاه، بهترین تجربه ممکن را خواهید داشت.

  cameraProvider.bindToLifecycle(

    lifecycleOwner,

    cameraSelector,

    SessionConfig(

        useCases = listOf(preview, videoCapture),

        // The order of features in this list determines their priority. 

        // CameraX will enable the best-supported combination based on these

        // priorities: HDR_HLG10 > FPS_60 > Preview Stabilization.  

        preferredFeatureGroup =

           listOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION),

    ).apply {

        // (Optional) Get a callback with the enabled features

        // to update your UI. 

        setFeatureSelectionListener { selectedFeatures ->

            updateUiIndicators(selectedFeatures)

        }

    }

)

برای این قطعه کد، CameraX تلاش می‌کند تا ترکیب‌های ویژگی را به ترتیب اولویت زیر فعال کند و اولین موردی را که دستگاه به طور کامل پشتیبانی می‌کند، انتخاب می‌کند:

  1. HDR + 60 فریم بر ثانیه + تثبیت‌کننده پیش‌نمایش
  2. HDR + 60 فریم بر ثانیه
  3. HDR + تثبیت‌کننده پیش‌نمایش
  4. اچ‌دی‌آر
  5. ۶۰ فریم بر ثانیه + تثبیت‌کننده پیش‌نمایش
  6. ۶۰ فریم بر ثانیه
  7. پیش‌نمایش تثبیت‌کننده
  8. هیچ یک از ویژگی‌های فوق

سناریو ۲: ساخت یک رابط کاربری واکنش‌گرا

برای ایجاد یک رابط کاربری که به انتخاب‌های کاربر پاسخ می‌دهد و از انتخاب ترکیبی از ویژگی‌های پشتیبانی نشده توسط کاربران جلوگیری می‌کند، می‌توانید مستقیماً درخواست پشتیبانی کنید. تابع زیر بررسی می‌کند که کدام ویژگی‌ها با انتخاب‌های فعلی کاربر ناسازگار هستند و به شما امکان می‌دهد عناصر رابط کاربری مربوطه را غیرفعال کنید.

  /**

 * Returns a list of features that are NOT supported in combination

 * with the currently selected features.

 */

fun getUnsupportedFeatures(

    currentFeatures: Set<GroupableFeature>

): Set<GroupableFeature> {

    val unsupportedFeatures = mutableSetOf<GroupableFeature>()

    val appFeatureOptions = setOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION)


    // Iterate over every available feature option in your app. 

    appFeatureOptions.forEach { featureOption ->

        // Skip features the user has already selected. 

        if (currentFeatures.contains(featureOption)) return@forEach


        // Check if adding this new feature is supported. 

        val isSupported = cameraInfo.isFeatureGroupSupported(

            SessionConfig(

                useCases = useCases,

                // Check the new feature on top of existing ones.

                requiredFeatureGroup = currentFeatures + featureOption

            )

        )


        if (!isSupported) {

            unsupportedFeatures.add(featureOption)

        }

    }


    return unsupportedFeatures

}

سپس می‌توانید این منطق را به ViewModel یا کنترلر UI خود متصل کنید تا به ورودی کاربر واکنش نشان دهد و دوربین را با پیکربندی تضمین‌شده برای کار، دوباره متصل کند.

  // Invoked when user turns some feature on/off.

fun onFeatureChange(currentFeatures: Set<GroupableFeature>) {

    // Identify features that are unsupported with the current selection.

    val unsupportedFeatures = getUnsupportedFeatures(currentFeatures)



    // Update app UI so that users can't enable them.

    updateDisabledFeatures(unsupportedFeatures)



    // Since the UI now only allows selecting supported feature combinations, 

    // `currentFeatures` is always valid. This allows setting

    // `requiredFeatureGroup` directly, without needing to re-check for

    // support or set a feature selection listener.  

    cameraProvider.bindToLifecycle(

        lifecycleOwner,

        cameraSelector,

        SessionConfig(

            useCases = listOf(preview, videoCapture),

            requiredFeatureGroup = currentFeatures,

        )

    )

}

برای مشاهده این مفاهیم در یک برنامه کاربردی، می‌توانید برنامه آزمایشی داخلی ما را بررسی کنید. این برنامه، پیاده‌سازی کاملی از هر دو سناریوی «بهترین تلاش» و «رابط کاربری واکنشی» که در بالا مورد بحث قرار گرفت را ارائه می‌دهد.

لطفاً توجه داشته باشید: این یک برنامه آزمایشی است و یک نمونه پشتیبانی‌شده رسمی نیست. اگرچه مرجع بسیار خوبی برای API گروه ویژگی‌ها است، اما برای استفاده در محیط عملیاتی بهینه‌سازی نشده است.

همین امروز شروع کنید

API گروه ویژگی‌ها ابهام کار با قابلیت‌های پیشرفته دوربین را از بین می‌برد. با ارائه یک روش قطعی برای جستجوی پشتیبانی از ویژگی‌ها، می‌توانید با اطمینان خاطر برنامه‌های دوربین قدرتمندتر و قابل اعتمادتری بسازید.

این API به صورت آزمایشی در CameraX 1.5 موجود است و قرار است در نسخه 1.6 کاملاً پایدار شود و پشتیبانی و بهبودهای بیشتری در راه است.

برای کسب اطلاعات بیشتر، مستندات رسمی را بررسی کنید. ما بی‌صبرانه منتظریم ببینیم شما چه چیزی ایجاد می‌کنید و مشتاقانه منتظر بازخورد شما هستیم. لطفاً نظرات خود را به اشتراک بگذارید و هرگونه مشکل را از طریق کانال‌های زیر گزارش دهید:

    نوشته شده توسط:

    ادامه مطلب