Android

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

مقدّمة

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

 

الطريقة الأولى هي من خلال واجهة برمجة الكاميرا (Camera API)؛ حيث توفِّر هذه الطريقة إمكانيّة برمجة الكاميرا والتحكُّم بها بأسلوب منخفض المستوى (Low-level)، بالإضافة إلى التحكُّم بجميع خواصّ الكاميرا من إضاءة، وألوان، وغير ذلك. الطريقة الثانية تكمن في استخدام تطبيق الكاميرا (Camera app) الموجود في أغلب (إن لم يكن كُل) أجهزة الآندرويد التي تحتوي على كاميرا، بحيث يتمّ إرسال طلب إلى هذا التطبيق واسترجاع الصورة (أو مقطع الفيديو) التي تمَّ تصويرها من خلاله واستخدامها في التطبيق بما هو مطلوب، وهذه الطريقة التي سنقوم بتغطيتها في هذا المقال، ومن الواضح بأنّها أبسط من الأولى.

 

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

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

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

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

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

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

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

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

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

التهيئة

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

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

التقاط صورة وإظهارها

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

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

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

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

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

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

سيحتوي المعامل “data” على بيانات الصورة التي تمَّ التقاطها، ويمكننا استرجاعها من خلال دالّة ()getExtras ووضعها في كائن من نوع Bitmap كالآتي:

أخيراً، نقوم بإظهار الصورة على الImageView الموجودة في الواجهة:

 

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

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

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