برنامه میتواند ویدیو یا صدایی را که از برنامه دیگری درحال پخش است ضبط کند. چنین برنامههایی باید
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 |
|---|---|---|---|
| درست | هر برنامهای | فقط سیستم | بدون ضبط |
| نادرست | فقط سیستم | فقط سیستم | بدون ضبط |