Ses girişi genellikle yerleşik mikrofondan, harici mikrofondan veya cihaza bağlı bir ses arayüzünden gelir. Ses girişi telefon görüşmesinden de gelebilir.
Bazen iki veya daha fazla uygulama aynı ses girişini "yakalamak" isteyebilir. Farklı görevler gerçekleştiriyor olabilirler. Örneğin, ses alan bazı uygulamalar "kayıt alıyor" olabilir (ör. basit bir ses kaydedici) ve diğer uygulamalar "dinliyor" olabilir (ör. Google Asistan veya sesli komutlara yanıt veren bir erişilebilirlik hizmeti).
Her iki durumda da bu uygulamalar ses girişi almak ister. Bu sayfada, uygulamanın kayıt veya yalnızca dinleme yapıp yapmadığına bakmadan "yakalama" terimini kullanıyoruz.
İki veya daha fazla uygulama aynı anda ses yakalamak isterse aynı kaynaktan gelen ses sinyalinin tümüne iletilmesiyle ilgili bir sorun oluşabilir. Bu sayfada, Android sisteminin ses girişini ses yakalayan birden fazla uygulama arasında nasıl paylaştığı açıklanmaktadır.
Android 10 öncesi davranış
Android 10'dan önce giriş ses akışı yalnızca tek bir uygulama tarafından aynı anda yakalanabiliyordu. Bir uygulama zaten ses kaydediyorsa veya dinliyorsa uygulamanız bir AudioRecord
nesnesi oluşturabilir ancak AudioRecord.startRecording()
çağrıldığında bir hata döndürülür ve kayıt başlatılmaz.
Bu kuralın tek istisnası, ayrıcalıklı bir uygulamanın (ör. Google Asistan veya erişilebilirlik hizmeti) android.permission.CAPTURE_AUDIO_HOTWORD
izni olması ve HOTWORD
türünde bir ses kaynağı kullanmasıdır. Bu durumda başka bir uygulama kaydetmeye başlayabilir. Bu durumda ayrıcalıklı uygulama sonlandırıldı ve yeni uygulama girişi yakaladı.
Android 9'a bir değişiklik daha eklendi: Yalnızca ön planda çalışan uygulamalar (veya ön plan hizmetleri) ses girişini yakalayabilir. Ön plan hizmeti veya ön plan kullanıcı arayüzü bileşeni olmayan bir uygulama kayıt yapmaya başladığında, uygulama çalışmaya devam ediyordu ancak o sırada ses kaydeden tek uygulama olsa bile sessiz kalıyordu.
Android 10 davranışı
Android 10'dan önceki davranış "ilk gelen alır, ilk hizmet alır" şeklindedir. Bir uygulama ses yakalamaya başladığında, ses yakalayan uygulama durana kadar başka hiçbir uygulama ses girişine erişemez.
Android 10, çalışan uygulamalar arasında giriş ses akışını değiştirebilen bir öncelik şeması uygular. Çoğu durumda, ses girişini yeni bir uygulama edinirse önceden yakalanan uygulama çalışmaya devam eder, ancak sessiz olur. Bazı durumlarda sistem, sesi her iki uygulamaya da vermeye devam edebilir. Çeşitli paylaşım senaryoları aşağıda açıklanmıştır.
Bu şema, ses çıkışının kullanımı için yarışan birden fazla uygulamayı ses odağının ele alma şekline benzer. Ancak ses odak noktası, odak kazanma ve bırakma için programatik istekler tarafından yönetilir. Burada açıklanan giriş anahtarlama şeması ise yeni bir uygulama ses almaya başladığında otomatik olarak uygulanan bir önceliklendirme politikasına dayanır.
Android, ses kaydı yapmak için iki tür uygulamayı ayırt eder:
- "Normal" uygulamalar kullanıcı tarafından yüklenir.
- "Özellikli" uygulamalar cihaza önceden yüklenmiş olarak gelir. Google Asistan ve tüm erişilebilirlik hizmetleri buna dahildir.
Ayrıca, "gizliliğe duyarlı" bir ses kaynağı kullanan uygulamalar farklı şekilde ele alınır:
CAMCORDER
veya VOICE_COMMUNICATION
.
Ses girişini kullanma ve paylaşma ile ilgili önceliklendirme kuralları aşağıdaki gibidir:
- Ayrıcalıklı uygulamalar, normal uygulamalara göre daha yüksek önceliğe sahiptir.
- Görünür ön plan kullanıcı arayüzlerine sahip uygulamalar, arka plan uygulamalarından daha yüksek önceliğe sahiptir.
- Gizlilik açısından hassas bir kaynaktan ses kaydeden uygulamalar, hassas olmayan uygulamalardan daha yüksek önceliğe sahiptir.
- İki sıradan uygulama aynı anda ses kaydedemez.
- Bazı durumlarda ayrıcalıklı bir uygulama, ses girişini başka bir uygulamayla paylaşabilir.
- Aynı önceliğe sahip iki arka plan uygulaması ses kaydediyorsa en son başlatılan uygulama daha yüksek önceliğe sahiptir.
Paylaşım senaryoları
İki uygulama ses yakalamaya çalıştığında her ikisi de giriş sinyalini alabilir veya bunlardan biri sessize alınabilir.
Dört temel senaryo vardır:
- Asistan + sıradan uygulama
- Erişilebilirlik hizmeti + normal uygulama
- İki normal uygulama
- Sesli arama + normal uygulama
Asistan + sıradan uygulama
Asistan, önceden yüklenmiş olduğu ve RoleManager.ROLE_ASSISTANT
rolüne sahip olduğu için ayrıcalıklı bir uygulamadır.
Bu role sahip diğer önceden yüklenmiş uygulamalar da benzer şekilde ele alınır.
Android, giriş sesini aşağıdaki kurallara göre paylaşır:
Gizliliğe duyarlı bir ses kaynağı kullanan başka bir uygulama zaten kayıt yapmadığı sürece Asistan, ön planda veya arka planda olsun ses alabilir.
Asistan'ın ekranın üst kısmında görünür bir kullanıcı arayüzü bileşeni yoksa uygulama ses alır.
Her iki uygulamanın da yalnızca Asistan arka plandayken ve diğer uygulama gizliliğe duyarlı bir ses kaynağından ses kaydı yapmadığında ses aldığını unutmayın.
Erişilebilirlik hizmeti + normal uygulama
AccessibilityService
için katı bir beyan gerekir.
Android, giriş sesini aşağıdaki kurallara göre paylaşır:
Hizmetin kullanıcı arayüzü üstteyse hem hizmet hem de uygulama ses girişi alır. Bu davranış, sesli aramaları veya video çekimlerini sesli komutlarla kontrol etme gibi işlevler sunar.
Hizmet üstte değilse bu durum aşağıdaki sıradan iki uygulamalı durum gibi değerlendirilir.
İki normal uygulama
İki uygulama aynı anda görüntü kaydı yaptığında yalnızca bir uygulama ses alır, diğer uygulamanın sesi kapatılır.
Android, giriş sesini şu kurallara göre paylaşır:
- Hiçbir uygulama da gizliliğe duyarlı değilse en üstünde kullanıcı arayüzü olan uygulama ses alır. Her iki uygulamada da kullanıcı arayüzü yoksa en son kaydı başlatan uygulama ses alır.
- Uygulamalardan biri gizlilik açısından hassassa ses alır ve en üstünde kullanıcı arayüzü olsa veya daha yakın zamanda görüntü yakalamaya başlamış olsa bile diğer uygulama sessize alınır.
- Her iki uygulama da gizliliğe duyarlıysa en son kayıt yapmaya başlayan uygulama ses alır, diğeri ise sessiz olur.
Sesli arama + normal uygulama
AudioManager.getMode()
tarafından döndürülen ses modu MODE_IN_CALL
veya MODE_IN_COMMUNICATION
ise sesli arama etkindir.
Android, giriş sesini şu kurallara göre paylaşır:
- Aramada her zaman ses alınır.
- Uygulama bir erişilebilirlik hizmeti ise sesi yakalayabilir.
Uygulama,
CAPTURE_AUDIO_OUTPUT
iznine sahip ayrıcalıklı (önceden yüklenmiş) bir uygulamaysa sesli görüşmeyi kaydedebilir.Sesli aramanın uplink'ini (TX), downlink'ini (RX) veya her ikisini de yakalamak için uygulamanın ses kaynaklarını
MediaRecorder.AudioSource.VOICE_UPLINK
veyaMediaRecorder.AudioSource.VOICE_DOWNLINK
ve/veya cihazıAudioDeviceInfo.TYPE_TELEPHONY
belirtmesi gerekir.
Android 11 davranışı
Android 11 (API düzeyi 30), yukarıda açıklanan Android 10 öncelik şemasını kullanır. Ayrıca, AudioRecord
, MediaRecorder
ve AAudioStream
'de, seçilen kullanım alanından bağımsız olarak ses kaydı yapma özelliğini etkinleştiren ve devre dışı bırakan yeni yöntemler sağlar.
Yeni yöntemler şunlardır:
AudioRecord.Builder.setPrivacySensitive()
AudioRecord.isPrivacySensitive()
MediaRecorder.setPrivacySensitive()
MediaRecorder.isPrivacySensitive()
AAudioStreamBuilder_setPrivacySensitive()
AAudioStream_isPrivacySensitive()
setPrivacySensitive()
true
olduğunda, yakalama kullanım alanı gizlidir ve ayrıcalıklı bir Asistan bile eşzamanlı olarak yakalama yapamaz. Bu ayar, ses kaynağına bağlı olan varsayılan davranışı geçersiz kılar. Örneğin, VOICE_COMMUNICATION
varsayılan olarak gizlidir ancak UNPROCESSED
gizli değildir.
Yapılandırma değişiklikleri
Birkaç uygulama aynı anda ses kaydederken bunlardan yalnızca biri veya ikisi "etkin" (ses alır) olur, diğerleri sessizdir (ses almaz). Etkin uygulamalar değiştiğinde ses çerçevesi, ses yollarını şu kurallara göre yeniden yapılandırabilir:
- Etkin olan her uygulamanın ses giriş cihazı değişebilir (örneğin, yerleşik mikrofondan bağlı bir Bluetooth kulaklığa).
- En yüksek öncelikli etkin uygulamayla ilişkilendirilmiş ön işleme etkinleştirilir. Diğer tüm ön işlemler yoksayılır.
Daha yüksek öncelikli bir uygulama etkin olduğunda etkin bir uygulama sessize alınabileceğinden, yapılandırma değiştiğinde bilgilendirilmek için AudioRecord
veya MediaRecorder
nesnesine bir AudioManager.AudioRecordingCallback kaydedebilirsiniz.
Olası değişiklikler şunlar olabilir:
- Sessiz veya sesli çekim yapma
- Cihaz değiştirildi
- Ön işleme değiştirildi
- Akış özellikleri değişti (örnekleme hızı, kanal maskesi, örnek biçimi)
Kayıt başlamadan önce AudioRecord.registerAudioRecordingCallback()
işlevini çağırmanız gerekir.
Geri çağırma işlevi yalnızca uygulama ses aldığında ve bir değişiklik olduğunda yürütülür.
onRecordingConfigChanged()
yöntemi, mevcut ses yakalama durumunu içeren bir AudioRecordingConfiguration
döndürür. Değişiklik hakkında bilgi edinmek için aşağıdaki yöntemleri kullanın:
isClientSilenced()
- İstemciye döndürülen ses şu anda yakalama politikası nedeniyle susturuluyorsa true değerini döndürür.
getAudioDevice()
- Etkin ses cihazını döndürür.
getEffects()
- Etkin ön işleme efektini döndürür. İstemci en yüksek öncelikli etkin uygulama değilse etkin etkinin,
getClientEffects()
tarafından döndürülen etkiyle aynı olmayabileceğini unutmayın. getFormat()
- Akış özelliklerini döndürür. İstemci tarafından alınan gerçek ses verilerinin her zaman
getClientFormat()
tarafından döndürülen gerekli biçime uyduğunu unutmayın. Çerçeve, donanım arayüzünde kullanılan biçimden istemci tarafından belirtilen biçime gerekli yeniden örnekleme, kanal ve biçim dönüşümünü otomatik olarak gerçekleştirir. AudioRecord.getActiveRecordingConfiguration()
.- Etkin kayıt yapılandırmasını döndürür.
AudioManager.getActiveRecordingConfigurations()
kodunu arayarak cihazdaki tüm etkin kayıtların genel görünümünü alabilirsiniz.