تسجيل تشغيل الفيديو والصوت

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

كيفية التعامل مع رمز مميّز لـ MediaProjection

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

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

لمعالجة فقدان أحد الرموز المميزة، سجِّل معاودة الاتصال على النسخة الافتراضية MediaProjection باستخدام طريقة registerCallback وإيقاف التسجيل عند استدعاء الإجراء onStop.

لمزيد من المعلومات، يمكنك الاطّلاع على عرض الوسائط.

التقاط فيديو

يمكنك الاطّلاع على نموذج تطبيق ScreenCapture للتعرّف على طريقة استخدام واجهة برمجة تطبيقات Media Projection API لالتقاط شاشة جهاز في الوقت الفعلي وعرضها على SurfaceView.

يمكنك استخدام DevicePolicyManager لمنع تسجيل الشاشة. بالنسبة إلى حسابات المؤسسات (Android for Work)، يمكن للمشرف إيقاف جمع بيانات المساعد للملف الشخصي للعمل باستخدام طريقة setScreenCaptureDisabled.

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

تسجيل تشغيل الصوت

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

تجدر الإشارة إلى أنّ واجهة برمجة التطبيقات AudioPlaybackCapture لا تؤثر في وقت استجابة التطبيق الذي يتم تسجيل الصوت فيه.

إنشاء تطبيق التقاط

لأغراض الأمان والخصوصية، تفرض عملية التقاط الصور بعض القيود. لتسجيل صوت، يجب أن يستوفي التطبيق المتطلبات التالية:

  • يجب أن يحصل التطبيق على إذن RECORD_AUDIO.
  • يجب أن يعرض التطبيق رسالة الطلب التي يعرضها MediaProjectionManager.createScreenCaptureIntent()، ويجب أن يوافق عليها المستخدم.
  • يجب أن تكون تطبيقات الالتقاط والتشغيل في الملف الشخصي نفسه للمستخدم.

لتسجيل صوت من تطبيق آخر، يجب أن ينشئ تطبيقك عنصر AudioRecord ويضيف AudioPlaybackCaptureConfiguration إليه. اتّبِع الخطوات التالية:

  1. يمكنك الاتصال بـ AudioPlaybackCaptureConfiguration.Builder.build() لإنشاء AudioPlaybackCaptureConfiguration.
  2. اضبط الإعدادات على AudioRecord من خلال طلب الرقم setAudioPlaybackCaptureConfig.

التحكم في التقاط الصوت

يمكن لتطبيقك التحكم في أنواع المحتوى الذي يمكنه تسجيله والأنواع الأخرى من التطبيق التي يمكنها تسجيل التشغيل الخاص به.

تقييد التقاط المحتوى بواسطة المحتوى الصوتي

يمكن للتطبيق تقييد الصوت الذي يمكنه تسجيله باستخدام الطرق التالية:

  • مرِّر AUDIO_USAGE إلى AudioPlaybackCaptureConfiguration.addMatchingUsage() للسماح بالتقاط عملية استخدام معيّنة. يمكنك استدعاء الطريقة عدة مرات لتحديد أكثر من استخدام واحد.
  • مرِّر AUDIO_USAGE إلى AudioPlaybackCaptureConfiguration.restrictUsage() لحظر التقاط هذا الاستخدام. يمكنك استدعاء الطريقة عدة مرات لتحديد أكثر من استخدام واحد.
  • أدخِل معرّفًا فريدًا (UID) إلى AudioPlaybackCaptureConfiguration.addMatchingUid() لالتقاط التطبيقات باستخدام معرِّف فريد فقط. يمكنك استدعاء الطريقة عدة مرات لتحديد أكثر من معرّف فريد.
  • مرِّر معرّفًا فريدًا (UID) إلى AudioPlaybackCaptureConfiguration.exitUid() لمنع التقاط هذا المعرّف الفريد. يمكنك استدعاء الطريقة عدة مرات لتحديد أكثر من معرّف فريد.

تجدر الإشارة إلى أنّه لا يمكنك استخدام طريقتَي addMatchingUsage() وexcludeUsage() معًا. يجب عليك اختيار أحدهما أو الآخر. وبالمثل، لا يمكنك استخدام addMatchingUid() وexcludeUid() في الوقت نفسه.

تقييد الالتقاط باستخدام تطبيقات أخرى

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

الاستخدام

يجب أن يضبط المشغّل الذي يُنتج المقطع الصوتي طريقة استخدامه على USAGE_MEDIA أو USAGE_GAME أو USAGE_UNKNOWN.

سياسة الالتقاط

يجب أن تكون سياسة الالتقاط في المشغّل هي AudioAttributes.ALLOW_CAPTURE_BY_ALL، ما يسمح للتطبيقات الأخرى بتسجيل التشغيل. ويمكن إجراء ذلك بعدة طرق:

في حال استيفاء هذه المتطلبات الأساسية، يمكن تسجيل أي محتوى صوتي يصدره المشغّل.

إيقاف التقاط محتوى النظام

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

ضبط السياسة في وقت التشغيل

يمكنك الاتصال بـ AudioManager.setAllowedCapturePolicy() لتغيير سياسة الالتقاط أثناء تشغيل أحد التطبيقات. في حال تشغيل MediaPlayer أو AudioTrack عند استدعاء الطريقة، لن يتأثر الصوت. يجب إغلاق المشغّل أو التتبّع وإعادة فتحه حتى يصبح تغيير السياسة ساريًا.

السياسة = البيان + مدير الصوت + AudioAttributes

بما أنّه يمكن تحديد سياسة الالتقاط في أماكن متعدّدة، من المهم فهم كيفية تحديد السياسة الفعّالة. يتم دائمًا تطبيق سياسة الالتقاط الأكثر تقييدًا. على سبيل المثال، لن يسمح التطبيق الذي يتضمّن بيانه setAllowedCapturePolicy="false" مطلقًا للتطبيقات غير النظامية بالتقاط الصوت، حتى إذا تم ضبط AudioManager#setAllowedCapturePolicy على ALLOW_CAPTURE_BY_ALL. وبالمثل، في حال ضبط AudioManager#setAllowedCapturePolicy على ALLOW_CAPTURE_BY_ALL وضبط البيان setAllowedCapturePolicy="true"، في حين أنّ مشغّل الوسائط AudioAttributes تم تصميمه باستخدام AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)، لن تتمكّن التطبيقات غير النظامية من الوصول إلى مشغّل الوسائط هذا.

يلخّص الجدول التالي تأثير سمة البيان والسياسة الفعالة:

السماح بتشغيل ميزة "التقاط الصوت" ALLOW_CAPTURE_BY_ALL ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
true أي تطبيق النظام فقط عدم التقاط أي محتوى
خطأ النظام فقط النظام فقط عدم التقاط أي محتوى