یک برنامه میتواند ویدیو یا صدایی را که از برنامه دیگری پخش میشود ضبط کند. چنین برنامههایی باید توکن MediaProjection را به درستی مدیریت کنند. این صفحه نحوه انجام این کار را توضیح میدهد. همچنین نشان میدهد که چگونه یک مدیر دستگاه میتواند قابلیت ضبط هرگونه عکس از صفحه نمایش را غیرفعال کند و چگونه یک برنامه صوتی میتواند از ضبط محتوای پخش شده توسط سایر برنامهها جلوگیری کند.
نحوه مدیریت توکن MediaProjection
رابط برنامهنویسی کاربردی (API) MediaProjection API) به برنامهها اجازه میدهد تا یک توکن MediaProjection token) دریافت کنند که به آنها امکان دسترسی یکباره برای ضبط محتوای صفحه یا صدا را میدهد. سیستمعامل اندروید قبل از اعطای توکن به برنامه، از کاربر اجازه میگیرد.
سیستم عامل، توکنهای فعال MediaProjection را در رابط کاربری تنظیمات سریع نمایش میدهد و به کاربران اجازه میدهد در هر زمان دسترسی به یک توکن را لغو کنند. وقتی این اتفاق میافتد، نمایشگرهای مجازی یا جریانهای صوتی مرتبط با جلسه، دریافت جریانهای رسانهای را متوقف میکنند. برنامه شما باید به طور مناسب پاسخ دهد، در غیر این صورت به ضبط سکوت صوتی یا جریان ویدیویی سیاه ادامه خواهد داد.
برای مدیریت از دست دادن یک توکن، با استفاده از متد registerCallback یک فراخوانی مجدد روی نمونه MediaProjection ثبت کنید و هنگام فراخوانی متد onStop ، ضبط را متوقف کنید.
برای اطلاعات بیشتر، به پیشبینی رسانهای مراجعه کنید.
ضبط ویدیو
برای یادگیری نحوه استفاده از Media Projection API برای ضبط صفحه نمایش دستگاه به صورت بلادرنگ و نمایش آن در SurfaceView، به برنامه نمونه ScreenCapture مراجعه کنید.
شما میتوانید از DevicePolicyManager برای جلوگیری از ضبط صفحه نمایش استفاده کنید. برای حسابهای سازمانی (Android for Work)، مدیر سیستم میتواند با استفاده از متد setScreenCaptureDisabled، جمعآوری دادههای دستیار برای پروفایل کاری را غیرفعال کند.
آزمایشگاه کد «مدیریت دستگاههای اندروید بدون برنامه» نحوهی جلوگیری از گرفتن اسکرینشات را نشان میدهد.
ضبط پخش صدا
رابط برنامهنویسی کاربردی (API) AudioPlaybackCapture در اندروید ۱۰ معرفی شد. این API به برنامهها این امکان را میدهد که صدای پخششده توسط برنامههای دیگر را کپی کنند. این ویژگی مشابه ضبط صفحه نمایش است، اما برای صدا. کاربرد اصلی آن برای برنامههای استریمینگ است که میخواهند صدای پخششده توسط بازیها را ضبط کنند.
توجه داشته باشید که رابط برنامهنویسی کاربردی AudioPlaybackCapture تاثیری بر تأخیر برنامهای که صدای آن ضبط میشود، ندارد.
ساخت یک برنامه ضبط
برای امنیت و حفظ حریم خصوصی، ضبط صدا در حین پخش، محدودیتهایی را اعمال میکند. برای اینکه یک برنامه بتواند صدا را ضبط کند، باید این الزامات را رعایت کند:
- برنامه باید مجوز
RECORD_AUDIOداشته باشد. - برنامه باید اعلان نمایش داده شده توسط
MediaProjectionManager.createScreenCaptureIntent()را نمایش دهد و کاربر باید آن را تأیید کند. - برنامههای ضبط و پخش باید در یک پروفایل کاربری باشند.
برای ضبط صدا از یک برنامه دیگر، برنامه شما باید یک شیء AudioRecord بسازد و یک AudioPlaybackCaptureConfiguration به آن اضافه کند. این مراحل را دنبال کنید:
- برای ساخت یک
AudioPlaybackCaptureConfigurationتابعAudioPlaybackCaptureConfiguration.Builder.build()فراخوانی کنید. - با فراخوانی تابع
setAudioPlaybackCaptureConfig، پیکربندی را بهAudioRecordارسال کنید.
کنترل ضبط صدا
برنامه شما میتواند کنترل کند که چه نوع محتوایی را میتواند ضبط کند و چه برنامههای دیگری میتوانند پخش خود را ضبط کنند.
محدود کردن ضبط بر اساس محتوای صوتی
یک برنامه میتواند با استفاده از این روشها، نوع صدایی که میتواند ضبط کند را محدود کند:
- برای ثبت یک کاربرد خاص، یک
AUDIO_USAGEبه AudioPlaybackCaptureConfiguration.addMatchingUsage() ارسال کنید. برای مشخص کردن بیش از یک کاربرد، این متد را چندین بار فراخوانی کنید. - برای جلوگیری از ضبط آن استفاده، یک
AUDIO_USAGEبه AudioPlaybackCaptureConfiguration.excludeUsage() ارسال کنید. برای مشخص کردن بیش از یک مورد استفاده، چندین بار این متد را فراخوانی کنید. - برای اینکه فقط برنامههایی با یک UID خاص را ضبط کنید، یک UID به AudioPlaybackCaptureConfiguration.addMatchingUid() ارسال کنید. برای تعیین بیش از یک UID، این متد را چندین بار فراخوانی کنید.
- برای جلوگیری از ضبط آن UID، یک UID به AudioPlaybackCaptureConfiguration.excludeUid() ارسال کنید. برای تعیین بیش از یک UID، این متد را چندین بار فراخوانی کنید.
توجه داشته باشید که نمیتوانید از متدهای addMatchingUsage() و excludeUsage() با هم استفاده کنید. باید یکی از آنها را انتخاب کنید. به همین ترتیب، نمیتوانید از addMatchingUid() و excludeUid() به طور همزمان استفاده کنید.
محدود کردن ضبط توسط برنامههای دیگر
شما میتوانید یک برنامه را طوری پیکربندی کنید که از ضبط صدای آن توسط سایر برنامهها جلوگیری کند. صدای یک برنامه فقط در صورتی قابل ضبط است که برنامه این شرایط را داشته باشد:
کاربرد
پخشکنندهای که صدا را تولید میکند باید میزان استفاده از آن را روی USAGE_MEDIA ، USAGE_GAME یا USAGE_UNKNOWN تنظیم کند .
سیاست ضبط
سیاست ضبط پخشکننده باید AudioAttributes.ALLOW_CAPTURE_BY_ALL باشد که به سایر برنامهها اجازه میدهد پخش را ضبط کنند. این کار را میتوان به چند روش انجام داد:
- برای فعال کردن ضبط صدا روی همه پخشکنندهها،
android:allowAudioPlaybackCapture="true"را در فایلmanifest.xmlبرنامه قرار دهید. - همچنین میتوانید با فراخوانی
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)ضبط را برای همه پخشکنندهها فعال کنید. - میتوانید هنگام ساخت یک پخشکننده، با استفاده از
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)این سیاست را روی آن تنظیم کنید. (اگر ازAAudioاستفاده میکنیدAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_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 و سیاست مؤثر را نشان میدهد:
| اجازه پخش صدا و ضبط | اجازه_ضبط_توسط_همه | اجازه دادن_ضبط_توسط_سیستم | اجازه_ضبط_بدون_اجازه |
|---|---|---|---|
| درست | هر برنامهای | فقط سیستم | بدون ضبط |
| نادرست | فقط سیستم | فقط سیستم | بدون ضبط |