ضبط بازپخش ویدیو و صدا

برنامه می‌تواند ویدیو یا صدایی را که از برنامه دیگری درحال پخش است ضبط کند. چنین برنامه‌هایی باید MediaProjection را به‌درستی مدیریت کنند. این صفحه نحوه انجام این کار را توضیح می‌دهد. همچنین نشان می‌دهد که چگونه سرپرست دستگاه می‌تواند امکان ضبط عکس‌های آنی صفحه‌نمایش را غیرفعال کند، و چگونه برنامه صوتی می‌تواند مانع از ضبط محتوایی که پخش می‌کند توسط برنامه‌های دیگر شود.

نحوه مدیریت کردن توکن MediaProjection

MediaProjection API به برنامه‌ها اجازه می‌دهد تا یک کد MediaProjection دریافت کنند که به آن‌ها دسترسی یک‌باره می‌دهد تا محتوای صفحه یا صدا را ضبط کنند. سیستم‌عامل Android قبل‌از اعطای توکن به برنامه شما، از کاربر اجازه می‌گیرد.

سیستم‌عامل، کدهای فعال MediaProjection را در میانای کاربر «تنظیمات فوری» نمایش می‌دهد و به کاربران اجازه می‌دهد هروقت خواستند دسترسی به کد را لغو کنند. وقتی این اتفاق می‌افتد، نمایشگرهای مجازی یا جاری‌سازی‌های صوتی مرتبط با جلسه دیگر جاری‌سازی‌های رسانه‌ای را دریافت نمی‌کنند. برنامه شما باید به‌درستی پاسخ دهد، درغیراین‌صورت به ضبط سکوت صوتی یا جاری‌سازی ویدیویی سیاه ادامه خواهد داد.

برای مدیریت ازدست رفتن یک کد، یک فراخوانی برگشتی را در نمونه MediaProjection بااستفاده از روش registerCallback ثبت کنید و وقتی روش onStop فراخوانی شد، ضبط را متوقف کنید.

برای اطلاعات بیشتر، به پخش رسانه مراجعه کنید.

فیلم‌برداری

می‌توانید از DevicePolicyManager برای جلوگیری از ضبط صفحه‌نمایش استفاده کنید. برای حساب‌های سازمانی (Android for Work)، سرپرست می‌تواند بااستفاده از روش setScreenCaptureDisabled جمع‌آوری داده‌های دستیار را برای نمایه کاری غیرفعال کند.

codelab مدیریت کردن دستگاه‌های Android بدون برنامه نشان می‌دهد که چگونه نماگرفت‌ها را ممنوع کنید.

ضبط بازپخش صوتی

AudioPlaybackCapture API در Android 10 معرفی شد. این میانای برنامه‌سازی کاربردی به برنامه‌ها امکان می‌دهد صدای درحال پخش توسط برنامه‌های دیگر را کپی کنند. این ویژگی مشابه ضبط صفحه است، اما برای صدا. مورد استفاده اصلی برای برنامه‌های جاری‌سازی است که می‌خواهند صدای درحال پخش از بازی‌ها را ضبط کنند.

توجه داشته باشید که AudioPlaybackCapture API بر تأخیر برنامه‌ای که صدای آن ضبط می‌شود تأثیری ندارد.

ساختن برنامه ضبط

برای امنیت و حریم خصوصی، ضبط بازپخش محدودیت‌هایی را اعمال می‌کند. برای اینکه برنامه‌ای بتواند صدا ضبط کند، باید این شرایط را داشته باشد:

  • برنامه باید اجازه RECORD_AUDIO را داشته باشد.
  • برنامه باید پیام‌واره نمایش‌داده‌شده توسط MediaProjectionManager.createScreenCaptureIntent() را نشان دهد، و کاربر باید آن را تأیید کند.
  • برنامه‌های ضبط و پخش باید در یک نمایه کاربر باشند.

برای ضبط صدا از برنامه‌ای دیگر، برنامه شما باید یک AudioRecord شیء بسازد و یک AudioPlaybackCaptureConfiguration به آن اضافه کند. این مراحل را دنبال کنید:

  1. برای ساختن AudioPlaybackCaptureConfiguration، با AudioPlaybackCaptureConfiguration.Builder.build() تماس بگیرید.
  2. پیکربندی را با فراخوانی setAudioPlaybackCaptureConfig به AudioRecord منتقل کنید.

کنترل ضبط صدا

برنامه شما می‌تواند کنترل کند که چه نوع محتوایی را می‌تواند ضبط کند و چه نوع برنامه‌های دیگری می‌توانند بازپخش آن را ضبط کنند.

محدود کردن ضبط براساس محتوای صوتی

برنامه می‌تواند بااستفاده از این روش‌ها، صداهایی را که می‌تواند ضبط کند محدود کند:

  • AUDIO_USAGE را به AudioPlaybackCaptureConfiguration.Builder.addMatchingUsage() ارسال کنید تا ضبط کاربرد خاصی مجاز شود. برای مشخص کردن بیش‌از یک مورد استفاده، این روش را چند بار فراخوانی کنید.
  • یک AUDIO_USAGE را به AudioPlaybackCaptureConfiguration.excludeUsage() ارسال کنید تا ضبط آن استفاده را ممنوع کنید. برای مشخص کردن بیش‌از یک مورد استفاده، این روش را چند بار فراخوانی کنید.
  • یک UID را به AudioPlaybackCaptureConfiguration.addMatchingUid() ارسال کنید تا فقط برنامه‌هایی با UID خاص ضبط شوند. برای مشخص کردن بیش‌از یک شناسه کاربری، این روش را چند بار فراخوانی کنید.
  • یک شناسه کاربر را به AudioPlaybackCaptureConfiguration.excludeUid() ارسال کنید تا ضبط آن شناسه کاربر ممنوع شود. برای مشخص کردن بیش‌از یک شناسه کاربری، این روش را چند بار فراخوانی کنید.

توجه داشته باشید که نمی‌توانید از روش‌های 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 درحال پخش باشد وقتی روش را فراخوانی می‌کنید، صدا تحت تأثیر قرار نمی‌گیرد. برای اعمال تغییر خط‌مشی، باید پخش‌کننده یا قطعه را ببندید و دوباره باز کنید.

خط‌مشی = مانیفست + AudioManager + 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) ساخته شده باشد، این پخش‌کننده رسانه توسط برنامه‌های غیرسیستمی قابل‌ضبط نخواهد بود.

جدول زیر تأثیر مشخصه مانیفست و خط‌مشی مؤثر را خلاصه می‌کند:

allowAudioPlaybackCapture ALLOW_CAPTURE_BY_ALL ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
درست هر برنامه‌ای فقط سیستم بدون ضبط
نادرست فقط سیستم فقط سیستم بدون ضبط