Bir uygulama, başka bir uygulamadan oynatılan videoyu veya sesi kaydedebilir. Bu tür uygulamalar, MediaProjection
jetonunu doğru şekilde işlemelidir. Bu sayfada bunun nasıl yapılacağı açıklanmaktadır. Ayrıca cihaz yöneticisinin ekran görüntüsü kaydetme özelliğini nasıl devre dışı bırakabileceği ve bir ses uygulamasının çaldığı içeriği kaydetmesini diğer uygulamaların nasıl engelleyebileceği de gösterilmektedir.
MediaProjection
jetonu nasıl kullanılır?
MediaProjection
API, uygulamaların bir MediaProjection
jetonu almasına izin verir. Bu jeton, ekran içeriklerini veya sesleri yakalamak için tek seferlik erişim sağlar. Android OS, uygulamanıza jeton vermeden önce kullanıcıdan
izin ister.
İşletim sistemi, Hızlı Ayarlar kullanıcı arayüzünde etkin MediaProjection
jetonlarını gösterir ve kullanıcıların bir jetona erişimi istedikleri zaman geri çekmelerine olanak tanır. Böyle bir durumda, oturumla ilişkili sanal ekranlar veya ses akışları medya akışlarını almayı durdurur. Uygulamanız uygun şekilde yanıt vermelidir. Aksi takdirde, sessiz ses veya siyah video akışı kaydetmeye devam eder.
Jeton kaybını yönetmek için registerCallback
yöntemini kullanarak MediaProjection
örneğinde bir geri çağırma kaydedin ve onStop
yöntemi çağrıldığında kaydı durdurun.
Daha fazla bilgi için Medya projeksiyonu bölümüne bakın.
Video çek
Bir cihazın ekranını gerçek zamanlı olarak yakalamak ve bir SurfaceView'da göstermek üzere Media Projection API'yi nasıl kullanacağınızı öğrenmek için ScreenCapture örnek uygulamasına bakın.
Ekran kaydını engellemek için DevicePolicyManager
öğesini kullanabilirsiniz. Kurumsal hesaplarda (Android for Work) yönetici, setScreenCaptureDisabled yöntemini kullanarak iş profili için asistan verilerinin toplanmasını devre dışı bırakabilir.
Uygulamasız Android Cihazları Yönetme codelab'inde, ekran görüntülerinin nasıl yasaklanacağı gösterilmektedir.
Ses çalma
AudioPlaybackCapture API, Android 10'da kullanıma sunulmuştur. Bu API, uygulamaların diğer uygulamalar tarafından çalan sesi kopyalamasına olanak tanır. Bu özellik, ekran görüntüsüne benzer, ancak sesli olarak kullanılabilir. Birincil kullanım alanı, oyunların çaldığı sesi yakalamak isteyen yayın uygulamaları içindir.
AudioPlaybackCapture API'nin, sesi kaydedilen uygulamanın gecikme süresini etkilemediğini unutmayın.
Yakalama uygulaması oluşturma
Oynatma yakalama, güvenlik ve gizlilik açısından bazı sınırlamalar uygular. Uygulamaların ses kaydedebilmesi için aşağıdaki gereksinimleri karşılaması gerekir:
- Uygulamanın
RECORD_AUDIO
iznine sahip olması gerekir. - Uygulama,
MediaProjectionManager.createScreenCaptureIntent()
tarafından görüntülenen istemi getirmeli ve kullanıcının bunu onaylaması gerekir. - Yakalama ve oynatma uygulamaları aynı kullanıcı profilinde olmalıdır.
Başka bir uygulamadan ses yakalamak için uygulamanızın bir AudioRecord
nesnesi derlemesi ve bu nesneye AudioPlaybackCaptureConfiguration
eklemesi gerekir. Şu adımları uygulayın:
AudioPlaybackCaptureConfiguration
oluşturmak içinAudioPlaybackCaptureConfiguration.Builder.build()
numaralı telefonu arayın.setAudioPlaybackCaptureConfig
yöntemini çağırarak yapılandırmayıAudioRecord
hizmetine iletin.
Ses yakalamayı kontrol etme
Uygulamanız ne tür içerikler kaydedebileceğini ve diğer hangi uygulama türlerinin kendi oynatmalarını kaydedebileceğini kontrol edebilir.
Ses içeriği yakalamayı kısıtlama
Bir uygulama aşağıdaki yöntemleri kullanarak yakalayabileceği sesi sınırlayabilir:
- Belirli bir kullanımı yakalamaya izin vermek için AudioPlaybackCaptureConfiguration.addMatchingUsage() öğesine
AUDIO_USAGE
iletin. Birden fazla kullanım belirtmek için yöntemi birden çok kez çağırın. - Bu kullanımı yakalamayı yasaklamak için AudioPlaybackCaptureConfiguration.excludedUsage() öğesine bir
AUDIO_USAGE
iletin. Birden fazla kullanım belirtmek için yöntemi birden çok kez çağırın. - Yalnızca belirli bir UID'ye sahip uygulamaları yakalamak için AudioPlaybackCaptureConfiguration.addMatchingUid() öğesine bir UID iletin. Birden fazla UID belirtmek için yöntemi birden çok kez çağırın.
- Bu UID'yi yakalamayı yasaklamak için AudioPlaybackCaptureConfiguration.excludedUid() öğesine bir UID iletin. Birden fazla UID belirtmek için yöntemi birden çok kez çağırın.
addMatchingUsage()
ve excludeUsage()
yöntemlerini birlikte kullanamayacağınızı unutmayın. İkisinden birini seçmeniz gerekir. Benzer şekilde, addMatchingUid()
ve excludeUid()
öğelerini aynı anda kullanamazsınız.
Diğer uygulamalar tarafından yakalama işlemi kısıtlanıyor
Bir uygulamayı, diğer uygulamaların o uygulamanın sesini yakalamasını önleyecek şekilde yapılandırabilirsiniz. Bir uygulamadan gelen ses, yalnızca uygulamanın aşağıdaki şartları karşılaması durumunda yakalanabilir:
Kullanım
Sesi üreten oynatıcı, kullanım alanını USAGE_MEDIA
, USAGE_GAME
veya USAGE_UNKNOWN
olarak ayarlamalıdır.
Yakalama politikası
Oynatıcının yakalama politikası, diğer uygulamaların oynatmayı yakalamasına izin veren AudioAttributes.ALLOW_CAPTURE_BY_ALL
olmalıdır. Bunu birkaç şekilde yapabilirsiniz:
- Yakalamayı tüm oynatıcılarda etkinleştirmek için uygulamanın
manifest.xml
dosyasınaandroid:allowAudioPlaybackCapture="true"
ekleyin. - Ayrıca
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
kodunu çağırarak yakalamayı tüm oynatıcılar için etkinleştirebilirsiniz. AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
ile oluşturduğunuz her oynatıcı için politikayı belirleyebilirsiniz. (AAudio
kullanıyorsanızAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL)
numaralı telefonu arayın.)
Bu ön koşullar karşılanırsa oynatıcı tarafından üretilen tüm sesler yakalanabilir.
Sistem yakalamayı devre dışı bırakma
Yukarıda açıklanan yakalamaya izin veren korumalar yalnızca uygulamalar için geçerlidir. Android sistem bileşenleri, varsayılan olarak oynatmayı yakalayabilir.
Bu bileşenlerin çoğu, Android satıcıları tarafından özelleştirilmiş olup erişilebilirlik ve altyazı gibi özellikleri destekler. Bu nedenle uygulamaların, sistem tarafından oynatılan
ekranları kaydetmesine izin vermesi önerilir. Nadiren de olsa sistemin, uygulamanızın oynatmasını yakalamasını istemediğiniz durumlarda yakalama politikasını ALLOW_CAPTURE_BY_NONE
olarak ayarlayın.
Çalışma zamanında politika ayarlama
Bir uygulama çalışırken yakalama politikasını
değiştirmek için AudioManager.setAllowedCapturePolicy()
çağırabilirsiniz. Yöntemi çağırdığınızda MediaPlayer veya AudioTrack çalıyorsa ses bundan etkilenmez. Politika değişikliğinin geçerli olması için oynatıcıyı veya kanalı kapatıp yeniden açmanız gerekir.
Politika = manifest + AudioManager + AudioAttributes
Yakalama politikası çeşitli yerlerde belirtilebildiğinden etkili politikanın nasıl belirlendiğini anlamak önemlidir.
Her zaman en kısıtlayıcı yakalama politikası uygulanır. Örneğin, manifest dosyasında setAllowedCapturePolicy="false"
içeren bir uygulama, AudioManager#setAllowedCapturePolicy
ALLOW_CAPTURE_BY_ALL
olarak ayarlanmış olsa bile sistem dışı uygulamaların ses kaydını yakalamasına hiçbir zaman izin vermez. Benzer şekilde, AudioManager#setAllowedCapturePolicy
ALLOW_CAPTURE_BY_ALL
olarak ayarlandıysa ve manifest dosyası setAllowedCapturePolicy="true"
öğesini ayarlarsa ancak medya oynatıcının AudioAttributes
değeri AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
ile oluşturulmuşsa bu medya oynatıcı, sistem dışı uygulamalar tarafından görüntülenemez.
Aşağıdaki tabloda, manifest özelliğinin ve geçerli politikanın etkisi özetlenmiştir:
allowSesÇalmaYatırma | TÜMÜNE_İZİN_VEREN_YAZI | SİSTEM_TARAFINDAN_İZİN_VERİLEN_ALTYAZI | YOK_ALTYAZI_YAZI |
---|---|---|---|
true | herhangi bir uygulama | yalnızca sistem | yakalama yok |
false | yalnızca sistem | yalnızca sistem | yakalama yok |