يشرح هذا القسم طريقة فصل تطبيق مشغّل وسائط في وحدة تحكّم في الوسائط (لواجهة المستخدم) وجلسة وسائط (للمشغّل الفعلي). فهو يصف بنيتين لتطبيقات الوسائط: تصميم العميل/الخادم الذي يعمل بشكل جيد لتطبيقات الصوت وتصميم أحادي النشاط لمشغّلات الفيديو. وتوضّح أيضًا كيفية جعل تطبيقات الوسائط تستجيب لعناصر التحكّم في الأجهزة والتعاون مع التطبيقات الأخرى التي تستخدم بث إخراج الصوت.
المشغّل وواجهة المستخدم
عادةً ما يكون لتطبيق الوسائط المتعددة الذي يشغِّل الصوت أو الفيديو جزأين:
- يشير هذا المصطلح إلى مشغِّل يستقبل الوسائط الرقمية ويعرضها على شكل فيديو و/أو صوت.
- واجهة مستخدم تشتمِل على عناصر تحكُّم في النقل لتشغيل المشغّل وعرض حالة اللاعب
في Android، يمكنك إنشاء مشغّل خاص بك من الصفر أو يمكنك الاختيار من بين هذه الخيارات:
- توفر فئة MediaPlayer الوظائف الأساسية للمشغل البسيط الذي يتوافق مع تنسيقات الصوت/الفيديو ومصادر البيانات الأكثر شيوعًا.
- ExoPlayer
هي مكتبة مفتوحة المصدر تستند إلى مكوّنات إطار عمل الوسائط ذات المستوى الأدنى
مثل
MediaCodec
وAudioTrack
. يدعم ExoPlayer ميزات عالية الأداء مثل DASH، والتي لا تتوفّر فيMediaPlayer
. يمكنك تخصيص رمز ExoPlayer، مما يسهل إضافة مكونات جديدة. لا يمكن استخدام ExoPlayer إلا مع الإصدار 4.1 من Android والإصدارات الأحدث.
وحدة تحكّم الوسائط وجلسة الوسائط
وعلى الرغم من أنّ واجهات برمجة التطبيقات لواجهة المستخدم والمشغّل يمكن أن تكون عشوائية، فإن طبيعة التفاعل بين الجزأين تكون متماثلة في الأساس لجميع تطبيقات مشغّل الوسائط. يعرّف إطار عمل Android فئتين، هما جلسة وسائط ووحدة تحكّم في الوسائط، توضع بنية محدّدة جيدًا لإنشاء تطبيق مشغّل وسائط.
تتواصل جلسة الوسائط ووحدة التحكّم في الوسائط معًا باستخدام استدعاءات محدَّدة مسبقًا تتوافق مع إجراءات المشغّل العادية (التشغيل والإيقاف المؤقت والإيقاف وما إلى ذلك)، بالإضافة إلى المكالمات المخصّصة القابلة للامتداد التي تستخدمها لتحديد سلوكيات خاصة فريدة لتطبيقك.
جلسة وسائط
وتكون جلسة تشغيل الوسائط مسؤولة عن جميع الاتصالات مع المشغّل. وهو يخفي واجهة برمجة تطبيقات المشغّل عن باقي تطبيقك. ويتم استدعاء المشغّل فقط من جلسة تشغيل الوسائط التي تتحكّم فيه.
تحتفظ الجلسة بحالة اللاعب (تشغيل/إيقاف مؤقت)
ومعلومات حول ما يتم تشغيله. يمكن أن تتلقّى الجلسة طلبات استدعاء من وحدة تحكّم واحدة أو أكثر في الوسائط. يتيح ذلك للمشغّل التحكم من خلال واجهة مستخدم التطبيق
والأجهزة المصاحبة التي تعمل بنظام التشغيل Wear OS
وAndroid Auto. يجب أن يكون المنطق الذي يستجيب لمعاودة الاتصال متسقًا. يجب أن تكون الاستجابة إلى طلب معاودة الاتصال MediaSession
هي نفسها بغض النظر عن تطبيق العميل الذي بدأ الاتصال.
وحدة التحكّم في الوسائط
وحدة التحكّم في الوسائط تعزل واجهة المستخدم لا يتصل رمز واجهة المستخدم إلا بوحدة التحكم في الوسائط، وليس بالمشغل نفسه. تترجم وحدة التحكم في الوسائط إجراءات التحكم في النقل إلى استدعاءات لجلسة الوسائط. ويتلقى أيضًا استدعاءات من جلسة الوسائط كلما تغيرت حالة الجلسة. يوفر ذلك آلية لتحديث واجهة المستخدم المرتبطة تلقائيًا. ولا يمكن لوحدة التحكم في الوسائط الاتصال إلا بجلسة وسائط واحدة في كل مرة.
عند استخدام وحدة تحكم في الوسائط وجلسة وسائط، يمكنك نشر واجهات و/أو مشغّلات مختلفة أثناء وقت التشغيل. يمكنك تغيير مظهر التطبيق و/أو أدائه بشكل مستقل بناءً على إمكانات الجهاز الذي يتم تشغيله.
تطبيقات الفيديو مقابل تطبيقات الصوت
أثناء تشغيل فيديو، تتفاعل عيناك وأذنيك. عند تشغيل الصوت، فأنت تستمع، ولكن يمكنك أيضًا العمل مع تطبيق مختلف في نفس الوقت. هناك تصميم مختلف لكل حالة استخدام.
تطبيق فيديو
يحتاج تطبيق الفيديو إلى نافذة لعرض المحتوى. لهذا السبب، يتم تنفيذ تطبيق الفيديو عادةً كنشاط واحد على Android. الشاشة التي يظهر عليها الفيديو هي جزء من النشاط.
تطبيق صوتي
لا يحتاج مشغّل الصوت دائمًا إلى أن تكون واجهة المستخدم مرئية. وبمجرد بدء تشغيل الصوت، يمكن تشغيل المشغل كمهمة في الخلفية. يمكن للمستخدم التبديل إلى تطبيق آخر والعمل مع الاستمرار في الاستماع.
لتطبيق هذا التصميم في نظام Android، يمكنك إنشاء تطبيق صوتي باستخدام مكوِّنين: نشاط لواجهة المستخدم وخدمة للمشغل. إذا انتقل المستخدم إلى تطبيق آخر، يمكن أن تعمل الخدمة في الخلفية. من خلال تحليل جزأين من تطبيق الصوت في مكونين منفصلين، يمكن تشغيل كل منهما بكفاءة أكثر من تلقاء نفسه. عادةً ما تكون واجهة المستخدم قصيرة الأجل مقارنةً باللاعب، والتي قد تعمل لفترة طويلة بدون واجهة مستخدم.
توفّر مكتبة الدعم فئتين لتنفيذ نهج العميل/الخادم هذا: MediaBrowserService
وMediaBrowser
. ويتم تنفيذ مكوّن الخدمة كفئة فرعية من MediaBrowserService
تحتوي على جلسة تشغيل الوسائط ومشغّلها. يجب أن يتضمّن النشاط الذي يتم إجراؤه على واجهة المستخدم ووحدة التحكّم في الوسائط عنصر MediaBrowser
يتصل بـ MediaBrowserService
.
يُسهّل استخدام MediaBrowserService
على الأجهزة المرتبطة (مثل Android Auto وWear) اكتشاف تطبيقك والاتصال به وتصفّح المحتوى والتحكّم فيه
بدون الحاجة إلى الوصول إلى نشاط واجهة المستخدم الخاصة بالتطبيق على الإطلاق. في الواقع، يمكن أن تكون هناك عدة تطبيقات مرتبطة بـ MediaBrowserService
نفسه في الوقت نفسه لكل تطبيق MediaController
. ويجب أن يتمكن التطبيق الذي يوفر MediaBrowserService
من معالجة عمليات الربط
المتزامنة المتعددة.
تطبيقات الوسائط والبنية الأساسية للصوت لنظام Android
يجب أن يعمل تطبيق الوسائط المصمم بشكل جيد مع التطبيقات الأخرى التي تشغّل الصوت. يجب أن يكون مستعدًا لمشاركة الهاتف والتعاون مع التطبيقات الأخرى على جهازك التي تستخدم الصوت. كما يجب أن يستجيب لعناصر التحكم في الجهاز.
يمكنك الاطّلاع على جميع هذه الإجراءات في قسم التحكّم في إخراج الصوت.
المكتبة المتوافقة مع الوسائط
تحتوي مكتبة media-compat على صفوف مفيدة لإنشاء تطبيقات تشغّل الصوت والفيديو. هذه الصفوف متوافقة مع أجهزة Android 2.3 (المستوى 9 لواجهة برمجة التطبيقات) والإصدارات الأحدث. وتعمل أيضًا مع ميزات Android أخرى لتقديم تجربة Android مريحة ومألوفة.
التنفيذ المقترَح لجلسات الوسائط ووحدات التحكّم في الوسائط هو الفئتان MediaSessionCompat
وMediaControllerCompat
اللتان تم تحديدهما في مكتبة دعم الوسائط. وتحلّ محلّ الإصدارات السابقة من الصفَّين MediaSession
وMediaController
اللتين تم تقديمهما في Android 5.0 (المستوى 21 من واجهة برمجة التطبيقات). توفر الفئات المتوافقة الوظيفة نفسها ولكن تجعل تطوير تطبيقك أسهل لأنك تحتاج فقط
إلى الكتابة إلى واجهة برمجة تطبيقات واحدة. وتعتني المكتبة بالتوافق مع الأنظمة القديمة من خلال ترجمة طرق جلسات الوسائط إلى الطرق المكافئة لها في إصدارات الأنظمة الأساسية القديمة عند توفّرها.
إذا كان لديك تطبيق حالي يستخدم الفئات القديمة، ننصحك
بالتحديث إلى الفئات المتوافقة. عند استخدام الإصدارات المتوافقة، يمكنك إزالة
جميع الطلبات المرسَلة إلى registerMediaButtonReceiver()
وأي طرق أخرى من RemoteControlClient
.
قياس الأداء
في الإصدار Android 8.0 (المستوى 26 لواجهة برمجة التطبيقات) والإصدارات الأحدث، تتوفّر طريقة getMetrics()
لبعض صفوف الوسائط. وتعرض كائن PersistableBundle
يحتوي على معلومات الإعداد والأداء، ويتم التعبير عنها في شكل خريطة للسمات والقيم.
يتم تحديد طريقة getMetrics()
للفئات الإعلامية التالية:
MediaPlayer.getMetrics()
MediaRecorder.getMetrics()
MediaCodec.getMetrics()
MediaExtractor.getMetrics()
يتم جمع المقاييس بشكل منفصل لكل مثيل وتظل سارية طوال عمر المثيل. إذا لم تتوفر أي مقاييس، تعرض الطريقة قيمة فارغة. وتعتمد المقاييس الفعلية المعروضة على الفئة.