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