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