Bir uygulama, başka bir uygulamadan oynatılan videoyu veya sesi kaydedebilir. Bu tür uygulamaların MediaProjection jetonunu doğru şekilde işlemesi gerekir. Bu sayfada bunun nasıl yapılacağı açıklanmaktadır. Ayrıca, cihaz yöneticisinin ekran görüntüsü alma özelliğini nasıl devre dışı bırakabileceğini ve bir ses uygulamasının, oynattığı içeriğin diğer uygulamalar tarafından kaydedilmesini nasıl engelleyebileceğini gösterir.
MediaProjection jetonunu işleme
MediaProjection API'si, uygulamaların ekran içeriğini veya sesi kaydetmek için tek seferlik erişim sağlayan bir MediaProjection jetonu almasına olanak tanır. Android OS, uygulamanıza jeton vermeden önce kullanıcıdan izin ister.
İşletim sistemi, etkin MediaProjection jetonlarını Hızlı Ayarlar kullanıcı arayüzünde gösterir ve kullanıcıların istedikleri zaman bir jetona erişimi iptal etmelerine olanak tanır. Bu 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 başlıklı makaleyi inceleyin.
Video çek
Ekran kaydını önlemek için DevicePolicyManager kullanabilirsiniz. Kurumsal hesaplarda (Android for Work), yönetici setScreenCaptureDisabled yöntemini kullanarak iş profili için asistan verilerinin toplanmasını devre dışı bırakabilir.
Uygulama Olmadan Android Cihazları Yönetme başlıklı codelab'de ekran görüntülerinin nasıl yasaklanacağı gösterilmektedir.
Ses oynatmayı kaydetme
AudioPlaybackCapture API, Android 10'da kullanıma sunulmuştur. Bu API, uygulamalara diğer uygulamalar tarafından çalınan sesleri kopyalama olanağı verir. Bu özellik, ekran görüntüsü alma özelliğinin ses için olan karşılığıdır. Birincil kullanım alanı, oyunlar tarafından çalınan sesi yakalamak isteyen yayın uygulamalarıdır.
AudioPlaybackCapture API'nin, sesi yakalanan uygulamanın gecikme süresini etkilemediğini unutmayın.
Yakalama uygulaması oluşturma
Güvenlik ve gizlilik nedeniyle Playback kaydı bazı sınırlamalara tabidir. Bir uygulamanın ses yakalayabilmesi için aşağıdaki şartları karşılaması gerekir:
- Uygulamanın
RECORD_AUDIOizni olmalıdır. - Uygulama,
MediaProjectionManager.createScreenCaptureIntent()tarafından gösterilen istemi açmalı ve kullanıcı bu istemi onaylamalıdır. - 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 oluşturması ve buna bir AudioPlaybackCaptureConfiguration eklemesi gerekir. Şu adımları uygulayın:
AudioPlaybackCaptureConfigurationoluşturmak içinAudioPlaybackCaptureConfiguration.Builder.build()yöntemini çağırın.setAudioPlaybackCaptureConfigyöntemini çağırarak yapılandırmayıAudioRecordnesnesine iletin.
Ses kaydını kontrol etme
Uygulamanız, kaydedebileceği içerik türlerini ve kendi oynatmasını kaydedebilecek diğer uygulama türlerini kontrol edebilir.
Ses içeriğine göre yakalamayı kısıtlama
Uygulamalar, aşağıdaki yöntemleri kullanarak yakalayabileceği sesleri sınırlayabilir:
- Belirli bir kullanımın yakalanmasına izin vermek için AudioPlaybackCaptureConfiguration.Builder.addMatchingUsage() yöntemine bir
AUDIO_USAGEiletin. Birden fazla kullanım belirtmek için yöntemi birden çok kez çağırın. - Bu kullanımın yakalanmasını yasaklamak için AudioPlaybackCaptureConfiguration.excludeUsage() yöntemine bir
AUDIO_USAGEiletin. 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() yöntemine bir UID iletin. Birden fazla UID belirtmek için yöntemi birden çok kez çağırın.
- Bir UID'nin yakalanmasını yasaklamak için UID'yi AudioPlaybackCaptureConfiguration.excludeUid() yöntemine 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() aynı anda kullanılamaz.
Diğer uygulamaların ekran görüntüsü almasını kısıtlama
Bir uygulamayı, diğer uygulamaların sesini kaydetmesini engelleyecek şekilde yapılandırabilirsiniz. Bir uygulamadan gelen ses, yalnızca uygulama aşağıdaki koşulları karşılıyorsa kaydedilebilir:
Kullanım
Sesi üreten oynatıcı, kullanımı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ç farklı şekilde yapabilirsiniz:
- Tüm oyuncular için yakalamayı etkinleştirmek istiyorsanız uygulamanın
manifest.xmldosyasınaandroid:allowAudioPlaybackCapture="true"öğesini ekleyin. AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)yöntemini çağırarak tüm oynatıcılarda yakalamayı etkinleştirebilirsiniz.- Politikayı,
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)kullanarak oluşturduğunuzda ayrı bir oynatıcıda ayarlayabilirsiniz. (AAudiokullanıyorsanızAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL)çağrısı yapın.)
Bu ön koşullar karşılanırsa oynatıcı tarafından üretilen tüm sesler kaydedilebilir.
Sistem kaydı devre dışı bırakılıyor
Yukarıda açıklanan ve yakalamaya izin veren korumalar yalnızca uygulamalar için geçerlidir. Android sistem bileşenleri, oynatmayı varsayılan olarak kaydedebilir.
Bu bileşenlerin çoğu Android tedarikçileri tarafından özelleştirilir ve erişilebilirlik ile altyazı gibi özellikleri destekler. Bu nedenle, uygulamaların sistemin oynatmayı yakalamasına izin vermesi önerilir. Sistemin uygulamanızın ses çıkışını yakalamasını istemediğiniz nadir durumlarda yakalama politikasını ALLOW_CAPTURE_BY_NONE olarak ayarlayın.
Çalışma zamanında politika ayarlama
Uygulama çalışırken yakalama politikasını değiştirmek için AudioManager.setAllowedCapturePolicy() yöntemini çağırabilirsiniz. Yöntemi çağırdığınızda bir MediaPlayer veya AudioTrack oynatılıyorsa ses etkilenmez. Politika değişikliğinin geçerli olması için oynatıcıyı veya parçayı kapatıp yeniden açmanız gerekir.
Politika = manifest + AudioManager + AudioAttributes
Yakalama politikası birkaç yerde belirtilebildiğinden, geçerli 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" bulunan bir uygulama, AudioManager#setAllowedCapturePolicy değeri ALLOW_CAPTURE_BY_ALL olarak ayarlanmış olsa bile sistem dışı uygulamaların sesini kaydetmesine hiçbir zaman izin vermez. Benzer şekilde, AudioManager#setAllowedCapturePolicy ALLOW_CAPTURE_BY_ALL olarak ayarlanırsa ve manifest setAllowedCapturePolicy="true" olarak ayarlanırsa ancak medya oynatıcının AudioAttributes öğesi AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM) ile oluşturulursa bu medya oynatıcı, sistem dışı uygulamalar tarafından yakalanamaz.
Aşağıdaki tabloda, manifest özelliğinin ve geçerli politikanın etkisi özetlenmektedir:
| allowAudioPlaybackCapture | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
|---|---|---|---|
| doğru | herhangi bir uygulama | yalnızca sistem | yakalama yok |
| yanlış | yalnızca sistem | yalnızca sistem | yakalama yok |