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

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

نحوه کار با توکن MediaProjection

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

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

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

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

فیلمبرداری کنید

به برنامه نمونه ScreenCapture مراجعه کنید تا یاد بگیرید چگونه از Media Projection API برای گرفتن عکس از صفحه نمایش دستگاه به صورت بلادرنگ و نمایش آن در SurfaceView استفاده کنید.

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

نوار کد مدیریت دستگاه‌های اندروید بدون برنامه نحوه ممنوع کردن اسکرین‌شات‌ها را نشان می‌دهد.

ضبط صدا از پخش

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

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

ساخت اپلیکیشن عکسبرداری

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

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

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

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

کنترل ضبط صدا

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

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

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

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

توجه داشته باشید که نمی توانید از متدهای addMatchingUsage() و excludeUsage() با هم استفاده کنید. شما باید یکی یا دیگری را انتخاب کنید. به همین ترتیب، نمی‌توانید از addMatchingUid() و excludeUid() به طور همزمان استفاده کنید.

ضبط محدود توسط برنامه های دیگر

می‌توانید یک برنامه را طوری پیکربندی کنید که دیگر برنامه‌ها نتوانند صدای آن را ضبط کنند. صدایی که از یک برنامه می‌آید فقط در صورتی می‌تواند ضبط شود که برنامه این شرایط را داشته باشد:

استفاده

پخش کننده ای که صدا را تولید می کند باید میزان استفاده خود را روی USAGE_MEDIA ، USAGE_GAME یا USAGE_UNKNOWN تنظیم کند.

سیاست ضبط

خط‌مشی ضبط پخش‌کننده باید AudioAttributes.ALLOW_CAPTURE_BY_ALL باشد.ALLOW_CAPTURE_BY_ALL، که به سایر برنامه‌ها امکان می‌دهد پخش را ضبط کنند. این را می توان به چند روش انجام داد:

اگر این پیش نیازها برآورده شوند، هر صدای تولید شده توسط پخش کننده را می توان ضبط کرد.

غیرفعال کردن ضبط سیستم

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

جدول زیر تأثیر ویژگی manifest و خط مشی مؤثر را خلاصه می کند:

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

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

نحوه کار با توکن MediaProjection

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

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

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

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

فیلمبرداری کنید

به برنامه نمونه ScreenCapture مراجعه کنید تا یاد بگیرید چگونه از Media Projection API برای گرفتن عکس از صفحه نمایش دستگاه به صورت بلادرنگ و نمایش آن در SurfaceView استفاده کنید.

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

نوار کد مدیریت دستگاه‌های اندروید بدون برنامه نحوه ممنوع کردن اسکرین‌شات‌ها را نشان می‌دهد.

ضبط صدا از پخش

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

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

ساخت اپلیکیشن عکسبرداری

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

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

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

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

کنترل ضبط صدا

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

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

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

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

توجه داشته باشید که نمی توانید از متدهای addMatchingUsage() و excludeUsage() با هم استفاده کنید. شما باید یکی یا دیگری را انتخاب کنید. به همین ترتیب، نمی‌توانید از addMatchingUid() و excludeUid() به طور همزمان استفاده کنید.

ضبط محدود توسط برنامه های دیگر

می‌توانید یک برنامه را طوری پیکربندی کنید که دیگر برنامه‌ها نتوانند صدای آن را ضبط کنند. صدایی که از یک برنامه می‌آید فقط در صورتی می‌تواند ضبط شود که برنامه این شرایط را داشته باشد:

استفاده

پخش کننده ای که صدا را تولید می کند باید میزان استفاده خود را روی USAGE_MEDIA ، USAGE_GAME یا USAGE_UNKNOWN تنظیم کند.

سیاست ضبط

خط‌مشی ضبط پخش‌کننده باید AudioAttributes.ALLOW_CAPTURE_BY_ALL باشد.ALLOW_CAPTURE_BY_ALL، که به سایر برنامه‌ها امکان می‌دهد پخش را ضبط کنند. این را می توان به چند روش انجام داد:

اگر این پیش نیازها برآورده شوند، هر صدای تولید شده توسط پخش کننده را می توان ضبط کرد.

غیرفعال کردن ضبط سیستم

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

جدول زیر تأثیر ویژگی manifest و خط مشی مؤثر را خلاصه می کند:

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