Android

كيفيّة استخدام الكاميرا في تطبيق الآندرويد لتصوير فيديو وعرضه

مقدّمة

لقد ذكرنا في مقال سابق كيفيّة استخدام كاميرا الهاتف في نظام آندرويد من أجل التقاط صورة واستخدامها في تطبيقنا، في هذا المقال، سنغطّي كيفيّة تصوير مقطع فيديو وعرضه في تطبيقنا من خلال عنصر VideoView .

 

تصميم التطبيق

سنحتاج في واجهة تطبيقنا إلى عنصر VideoView، والذي سيتم استخدامه في عرض مقطع الفيديو الذي تمَّ تصويره بواسطة تطبيق الكاميرا الموجود في الجهاز. كما سنحتاج أيضاً إلى زرّ ينقل المُستخدم إلى تطبيق الكاميرا من أجل بدء تصوير الفيديو. بالنسبة لي، فقد قمت بترتيب الواجهة كالآتي:

  • سيتم احتواء جميع عناصر الواجهة في RelativeLayout.
  • سيتم وضع الزرّ في أسفل الواجهة.
  • سيتم وضع عنصر VideoView أعلى الواجهة، فوق زرّ التصوير.

بحيث ستظهر الواجهة كالتالي:

ما يلي كود XML الخاصّ بالواجهة:

برمجة التطبيق

مختصر عمل التطبيق

إنَّ مختصر آليّة عمل التطبيق ستكون كالآتي:

  1. عند ضغط المستخدم على زرّ تصوير فيديو، فسيتم إنشاء Intent جديدة لاستدعاء تطبيق الكاميرا الموجود في الجهاز.
  2. بعد انتهاء المستخدم من التصوير والخروج من تطبيق الكاميرا، سيقوم هذا التطبيق (الكاميرا) بإرجاع نتيجة لتطبيقنا تحتوي مقطع الفيديو الذي تمَّ تصويره، فنقوم باستخدام دالّة ()onActivityResult للحصول على المقطع.
  3. نقوم بتشغيل مقطع الفيديو في عنصر VideoView.

التهيئة

قبل البدء ببرمجة ما هو أساسيٌّ من التطبيق، يجب علينا إضافة سطر معيَّن إلى ملفّ الmanifset لتفعيل خاصيّة استخدام كاميرا الهاتف، كما يجب تفعيل أذونات استخدام الكاميرا والميكروفون، فنقوم بإضافة الأسطر التالية في ترميز <manifest> من ملفّ AndroidManifest.xml:

في حال كنت تستخدم Android Emulator، فيجب عليك تفعيل الأذونات يدويّاً من الإعدادات (Settings) للتطبيق قبل البدء باستخدامه، إذ لن تكون الأذونات مُفعّلة في الوضع الطبيعي، ممّا يتسبَّب في انهيار التطبيق عند استدعاء تطبيق الكاميرا.

تصوير فيديو وتشغيله

سنقوم أوّلاً بوصل زرّ Record Video وعنصر VideoView الموجودان في الواجهة ببرنامجنا من خلال دالّة ()findViewById كالتالي:

بعد ذلك سنقوم بالتحقُّق ممّا إن كان الهاتف يحتوي على كاميرا يمكننا استخدامها، وسنلجأ لدالّة ()hasSystemFeature الموجودة في كلاس PackageManager لنتمكَّن من ذلك، وفي حال عدم وجودها، فسنُظهر له رسالة Toast:

سنقوم بتعريف متغيِّر من نوع boolean لنخزِّن فيه حالة ما إن كان الجهاز يحتوي كاميرا أم لا، وذلك حتّى نمنعه من محاولة فتح تطبيق الكاميرا من الأساس، فسنقوم بتعريف المتغيِّر hasCamera لذلك واستخدامه كما يلي:

الآن يمكننا البدء ببرمجة حالة الضغط على زرّ “تصوير فيديو”، وذلك من خلال ()setOnClickListener. بعد ضغط المستخدم على الزرّ، سنتأكَّد أوّلاً ممّا إن كان الهاتف يحتوي على كاميرا، وفي حال توافر فيه، فسنقوم بإنشاء Intent جديدة لاستدعاء تطبيق الكاميرا، بحيث سنقوم بتمرير القيمة ACTION_VIDEO_CAPTURE كمعامل لدالّة البناء (Constructor). بعد ذلك سنقوم باستدعاء دالّة ()resolveActivity لنرى ما إن تمَّ إنشاء الIntent بدون مشاكل (في حال إرجاع أي قيمة عدا null، فهذا يعني عدم وجود مشاكل):

الآن سنقوم باستخدام دالّة ()startActivityForResult، وسنجعل رمز الطلب (requestCode) هو 1 (يمكن أن يكون أي رقم، ولكن المهم أن تحفظه لأنّنا سنستخدمه لاحقاً عند استلام نتيجة الIntent):

الآن سنقوم بإعادة تعريف (أي Override) دالّة ()onActivityResult، والتي ستستلم النتيجة من تطبيق الكاميرا، بحيث سيتم إرجاع النتيجة باستخدام نفس رمز الطلب الذي أدخلناه في الكود أعلاه، ألا وهو 1، كما سيتم إرجاع ما إن كانت العمليّة قد تمّت بنجاح من خلال المتغيِّر resultCode. فسيكون الكود كالتالي:

سيحتوي المعامل “data” على بيانات المقطع المُصوَّر، ويمكننا استرجاعه من خلال دالّة ()getData، بحيث سيتم إرجاع وصلة من نوع URI تشير إلى مكان تخزين المقطع، وبالتالي يمكننا عرض المقطع في عنصر VideoView كالتالي:

أخيراً، نقوم بتشغيل المقطع باستخدام دالّة ()start الموجودة في VideoView:

الكود النهائي

عند تجربة التطبيق في محاكي آندرويد، يمكنك تصوير مقطع تظهر فيه مُربّعات صغيرة ويتحرَّك أعلاها مُربَّع يتغيَّر لونه كلّ بضع ثوانٍ:

ويمكنك أيضاً تجربة التطبيق على هاتف حقيقي لتصوير مقطع والتأكُّد من أنّه يعمل بالشكل المطلوب.

اترك تعليق