مدونة مطوري Android: تقديم محدد منظر الكاميرا


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

بصفتك مطورًا ، فأنت تريد الاستفادة من إمكانات الكاميرا في تطبيقك ، لذلك قررت اعتماد Android Digital camera Framework. أول حالة استخدام تريد تنفيذها هي ملف معاينة حالة الاستخدام ، والتي تعرض إخراج مستشعر الكاميرا على الشاشة.

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

ولكن ماذا يحدث عند تغيير حجم النافذة أو فتح جهازك أو تغيير العرض أو الاتجاه؟ حسنًا ، في معظم الحالات ، قد تظهر المعاينة ممتدة أو مقلوبة أو تم تدويرها بشكل غير صحيح. وإذا كنت في بيئة متعددة النوافذ ، فقد يتعطل تطبيقك.

لماذا يحدث هذا؟ بسبب الافتراضات الضمنية التي قمت بها أثناء إنشاء ملف CaptureSession.

تاريخيًا ، يمكن أن يعيش تطبيقك في نفس النافذة طوال دورة حياته بالكامل ، ولكن مع توفر عوامل الشكل الجديدة مثل الأجهزة القابلة للطي ، وأنماط العرض الجديدة مثل النوافذ المتعددة والشاشات المتعددة ، لا يمكنك افتراض ذلك. كن صحيحًا بعد الآن.

على وجه الخصوص ، دعنا نرى بعض أهم الاعتبارات عند تطوير تطبيق يستهدف عوامل الشكل المختلفة:

دعنا نفحص بعض المخاطر الشائعة التي يجب تجنبها عند تطوير تطبيق يستهدف عوامل الشكل المختلفة:

  • لا تفترض أن تطبيقك سيعيش في نافذة على شكل صورة. لا يزال طلب اتجاه ثابت مدعومًا في Android 13 ، ولكن الآن قد يكون لدى الشركات المصنعة للأجهزة خيار تجاوز طلب التطبيق للحصول على اتجاه مفضل.
  • لا تفترض أي بُعد ثابت أو نسبة عرض إلى ارتفاع لتطبيقك. حتى لو قمت بتعيين resizableActivity = “خطأ”، لا يزال من الممكن استخدام تطبيقك في وضع النوافذ المتعددة على الشاشات الكبيرة (> = 600dp).
  • لا تفترض وجود علاقة ثابتة بين اتجاه الشاشة والكاميرا. ال مستند تعريف توافق Android يحدد أن مستشعر صورة الكاميرا “يجب أن يكون موجهًا بحيث يتماشى البعد الطويل للكاميرا مع البعد الطويل للشاشة.” بدءًا من مستوى API 32 ، يمكن لعملاء الكاميرا الذين يستعلمون عن الاتجاه على الأجهزة القابلة للطي تلقي قيمة تتغير ديناميكيًا اعتمادًا على حالة الجهاز / الطي.
  • لا تفترض أن حجم الإطار الداخلي لا يمكن أن يتغير. يتم إبلاغ التطبيقات بشريط المهام الجديد كإطار داخلي ، وعند استخدامه مع التنقل بالإيماءات ، يمكن إخفاء شريط المهام وعرضه ديناميكيًا.
  • لا تفترض أن التطبيق الخاص بك لديه وصول حصري إلى الكاميرا. عندما يكون تطبيقك في حالة تعدد النوافذ ، يمكن للتطبيقات الأخرى الوصول إلى الموارد المشتركة مثل الكاميرا والميكروفون.

بينما يتعامل CameraX بالفعل مع معظم الحالات المذكورة أعلاه ، فإن تنفيذ معاينة تعمل في سيناريوهات مختلفة باستخدام واجهات برمجة تطبيقات Camera2 يمكن أن يكون معقدًا ، كما وصفنا في دعم الأسطح التي يمكن تغيير حجمها في تطبيق الكاميرا Codelab.

ألن يكون رائعًا أن يكون لديك مكون بسيط يعتني بهذه التفاصيل ويسمح لك بالتركيز على منطق تطبيقك المحدد؟

قل لا زيادة…

مقدمة CameraViewfinder

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

دعونا نرى كيفية استخدامه.

أولاً ، أضف التبعية في مستوى التطبيق الخاص بك بناء ملف:

تطبيقandroidx.كاميرا: محدد منظر الكاميرا: 1.3.0-alpha01 “

مزامنة مشروعك. الآن يجب أن تكون قادرًا على استخدام ملف CameraViewfinder كأي دولة أخرى رأي. على سبيل المثال ، يمكنك إضافته إلى ملف التخطيط الخاص بك:


ذكري المظهر:هوية شخصية=“@ + معرف / view_finder”
تطبيق:نوع المقياس=“fitCenter”
تطبيق:طريقة التنفيذ=“أداء”
ذكري المظهر:عرض_التخطيط=“اهل مشتركين”
ذكري المظهر:تخطيط_ارتفاع=“اهل مشتركين”/>

كما ترون، CameraViewfinder لديه نفس الضوابط المتاحة على معاينة، لذلك يمكنك اختيار مختلف طرق التنفيذ و أنواع التحجيم.

الآن بعد أن أصبح المكون جزءًا من التخطيط ، لا يزال بإمكانك إنشاء ملف CameraCaptureSession، ولكن بدلاً من تقديم ملف TextureView أو SurfaceView كسطوح مستهدفة ، استخدم النتيجة طلب SurfaceAsync ().

مرح بدء الكاميرا() {
معاينة فال الدقة = الحجم (العرض ، الارتفاع)
val viewfinderSurfaceRequest =
ViewfinderSurfaceRequest (معاينة الدقة ، الخصائص)
Val SurfaceListenableFuture =
cameraViewfinder.requestSurfaceAsync (محدد المنظر وطلب السطح)

Futures.addCallback (SurfaceListenableFuture، object: FutureCallback {
تجاوز المرح على النجاح(سطح – المظهر الخارجي: سطح) {
// إنشاء CaptureSession باستخدام هذا السطح كالمعتاد
}
تجاوز المرح عند الفشل(ر: رمي) { /* هناك خطأ ما */}
} ، ContextCompat.getMainExecutor (سياق))
}

المكافأة: تخطيطات محسّنة للأجهزة القابلة للطي

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

ولكن إذا كنت ترغب في تنفيذ تخطيطات محسّنة للأجهزة القابلة للطي وشاشة مزدوجة ، فيمكنك الدمج CameraViewFinder مع ال Jetpack WindowManager مكتبة لتقديم تجارب فريدة للمستخدمين.

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

تم تحسين نموذج التطبيق بالفعل للأجهزة القابلة للطي ويمكنك العثور على الكود للتعامل مع تغييرات الموقف هنا. الق نظرة!

The Information Weblog The place You Get The Information First
Android Builders Weblog

brain2gain