Ses girişi paylaşılıyor

Ses girişi genellikle dahili mikrofondan, harici bir 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 uygulamanın her ikisi de aynı ses girişini "yakalamak" isteyebilir. Farklı görevler gerçekleştiriyor olabilirler. Örneğin, ses alan bazı uygulamalar, basit bir ses kaydedici gibi "kaydediyor", diğer uygulamalar ise (ör. Google Asistan veya sesli komutlara yanıt veren bir erişilebilirlik hizmeti) "dinliyor" olabilir.

Her iki durumda da, bu uygulamalar ses girişi almak ister. Bu sayfada, bir uygulamanın kaydetmesine veya sadece dinlemesine bakmaksızın "yakalama" terimini kullanırız.

İki veya daha fazla uygulama aynı anda ses yakalamak isterse ses sinyalinin hepsine aynı kaynaktan ses sinyali iletilmesinde sorun olabilir. Bu sayfada, Android sisteminin ses kaydeden birden fazla uygulama arasında ses girişini nasıl paylaştığı açıklanmaktadır.

Android 10 öncesi davranışı

Android 10'dan önce, giriş ses akışı aynı anda yalnızca bir uygulama tarafından yakalanabiliyordu. Bazı uygulamalar zaten ses kaydediyor veya ses dinliyorsa uygulamanız bir AudioRecord nesnesi oluşturabilir, ancak AudioRecord.startRecording() ifadesini aradığınızda ve kayıt başlamadığında bir hata döndürülür.

Bu kuralın bir istisnası, ayrıcalıklı bir uygulamanın (Google Asistan veya erişilebilirlik hizmeti gibi) android.permission.CAPTURE_AUDIO_HOTWORD iznine sahip olması ve HOTWORD türünde bir ses kaynağı kullanmasıdır. Bu durumda, başka bir uygulama kaydetmeye başlayabilir. Bu olduğunda, ayrıcalıklı uygulama sonlandırıldı ve yeni uygulama girdiyi yakaladı.

Android 9'da bir değişiklik daha eklendi: Ses girişini yalnızca ön planda (veya bir ön plan hizmeti) çalışan uygulamalar yakalayabiliyordu. Ön plan hizmeti veya ön plan kullanıcı arayüzü bileşeni olmayan bir uygulama çalışmaya devam etti ancak o sırada ses yakalayan tek uygulama olsa bile sessizlik almaya devam etti.

Android 10 davranışı

Android 10'dan önceki davranış, "ilk gelen alır" şeklindedir. Bir uygulama ses yakalamaya başladığında, sesi yakalayan uygulama durana kadar diğer uygulamalar ses girişine erişemez.

Android 10, çalışırken uygulamalar arasında giriş ses akışını değiştirebilen bir öncelik şeması uygular. Çoğu durumda, yeni bir uygulama ses girişini alırsa önceden yakalanan uygulama çalışmaya devam eder ancak sessizlik alır. Bazı durumlarda sistem, her iki uygulamaya da ses göndermeye devam edebilir. Çeşitli paylaşım senaryoları aşağıda açıklanmıştır.

Bu şema, ses odağının, ses çıkışı kullanımı için rekabet eden birden fazla uygulamayı işleme şekline benzer. Bununla birlikte, ses odağı, odağı kazanmak ve serbest bırakmak için programatik istekler tarafından yönetilir. Burada açıklanan giriş geçiş şeması, yeni bir uygulama ses yakalamaya başladığında otomatik olarak uygulanan bir öncelik belirleme politikasına dayanır.

Android, ses kaydı için iki tür uygulamayı birbirinden ayırır:

  • "Normal" uygulamalar kullanıcı tarafından yüklenir.
  • "Özel" uygulamalar cihazda önceden yüklenmiş olarak gelir. Bu hizmetler arasında Google Asistan ve tüm erişilebilirlik hizmetleri bulunur.

Ayrıca, "gizliliğe duyarlı" bir ses kaynağı kullanan uygulamalar farklı şekilde ele alınır: CAMCORDER veya VOICE_COMMUNICATION.

Ses girişini kullanmak ve paylaşmak için önceliklendirme kuralları şu şekildedir:

  • Ayrıcalıklı uygulamalar sıradan uygulamalara göre daha yüksek önceliğe sahiptir.
  • Ön planda görünür kullanıcı arayüzlerine sahip uygulamalar, arka plan uygulamalardan daha yüksek önceliğe sahiptir.
  • Gizlilik açısından hassas bir kaynaktan ses yakalayan uygulamalar, bu tür kaynaklarda olmayanlardan daha yüksek önceliğe sahiptir.
  • İki normal uygulama hiçbir zaman aynı anda ses kaydedemez.
  • Bazı durumlarda özel bir uygulama, ses girişini başka bir uygulamayla paylaşabilir.
  • Aynı önceliğe sahip iki arka plan uygulaması ses yakalıyorsa başlatılan son uygulama daha yüksek önceliğe sahip olur.

Paylaşım senaryoları

İki uygulama ses yakalamaya çalışırken her ikisi de giriş sinyalini alabilir veya içlerinden biri sessize alınabilir.

Dört ana senaryo vardır:

  • Asistan + normal uygulama
  • Erişilebilirlik hizmeti + normal uygulama
  • İki sıradan uygulama
  • Sesli arama + normal uygulama

Asistan + normal uygulama

Asistan, önceden yüklenmiş olduğundan ve RoleManager.ROLE_ASSISTANT rolünü barındırdığından ayrıcalıklı bir uygulamadır. Bu role sahip olan önceden yüklenmiş tüm uygulamalar 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 halihazırda ses kaydı yapmıyorsa Asistan, sesleri (ön planda veya arka planda olması fark etmeksizin) 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 ses aldığını, diğer uygulamanın da gizliliğe önem veren bir ses kaynağından ses kaydetmediğini 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ü en üstte yer alıyorsa hem hizmet hem de uygulama ses girişi alır. Bu davranış, sesli komutlarla sesli aramayı veya video çekimini kontrol etme gibi işlevler sunar.

  • Hizmet en üstte değilse bu durum, aşağıdaki normal iki uygulama örneği gibi ele alınır.

İki sıradan uygulama

İki uygulama aynı anda çekim yaparken yalnızca bir uygulama ses alır, diğeri ise sessizdir.

Android, giriş sesini aşağıdaki kurallara göre paylaşır:

  • İki uygulama da gizlilik açısından hassas değilse üst tarafında kullanıcı arayüzü olan uygulama ses alır. İki uygulamanın da kullanıcı arayüzü yoksa başlatılan kullanıcı en son sesi kaydeder.
  • Uygulamalardan biri gizlilik açısından hassassa ses alır ve diğer uygulama, üst tarafında bir kullanıcı arayüzü olsa veya daha yakın bir zamanda görüntü yakalamaya başlamış olsa bile sessize gelir.
  • Her iki uygulama da gizlilik açısından hassassa kısa süre önce ses yakalamaya başlayan uygulama, sesi kaydetmeye başlayan uygulama sessiz olur.

Sesli arama + normal uygulama

AudioManager.getMode() tarafından döndürülen ses modu MODE_IN_CALL veya MODE_IN_COMMUNICATION olduğunda sesli arama etkindir.

Android, giriş sesini aşağıdaki kurallara göre paylaşır:

Android 11 davranışı

Android 11 (API düzeyi 30), yukarıda açıklanan Android 10 öncelik şemasına uyar. Ayrıca AudioRecord, MediaRecorder ve AAudioStream için seçilen kullanım alanından bağımsız olarak, eşzamanlı olarak ses yakalama özelliğini etkinleştirip devre dışı bırakan yeni yöntemler sunar.

Yeni yöntemler şunlardır:

setPrivacySensitive(), true olduğunda yakalama kullanım alanı gizlidir ve ayrıcalıklı bir Asistan aynı anda görüntü yakalayamaz. 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 değildir.

Yapılandırma değişiklikleri

Birkaç uygulama aynı anda ses kaydederken yalnızca bir veya ikisi "etkin" olur (ses alır), diğerlerinin sesi kapatılır (sessizlik alır). Etkin uygulamalar değiştiğinde, ses çerçevesi, ses yollarını şu kurallara göre yeniden yapılandırabilir:

  • Her etkin uygulamanın ses giriş cihazı değişebilir (örneğin, yerleşik mikrofondan takılı bir Bluetooth kulaklığa geçiş).
  • En yüksek öncelikli etkin uygulamayla ilişkili ön işleme etkinleştirildi. Diğer tüm ön işlemeler yoksayılır.

Daha yüksek öncelikli bir uygulama etkin hale geldiğinde etkin bir uygulamanın sesi kapatılabileceğinden, yapılandırma değiştiğinde bildirim almak için AudioRecord veya MediaRecorder nesnesine bir AudioManager.AudioRecordingCallback kaydedebilirsiniz. Olası değişiklikler şunlar olabilir:

  • Ses kapalıyken veya açılmamış şekilde çekim yapın
  • Cihaz değiştirildi
  • Ön işleme değiştirildi
  • Yayın özellikleri değişti (örnekleme hızı, kanal maskesi, örnek biçim)

Yakalama işlemine başlamadan önce AudioRecord.registerAudioRecordingCallback() çağrısı yapmanız gerekir. Geri çağırma yalnızca uygulama ses aldığında ve bir değişiklik meydana geldiğinde yürütülür.

onRecordingConfigChanged() yöntemi, geçerli ses yakalama durumunu içeren bir AudioRecordingConfiguration döndürür. Bu değişiklik hakkında bilgi edinmek için aşağıdaki yöntemleri kullanın:

isClientSilenced()
İstemciye döndürülen ses, yakalama politikası nedeniyle sesi kapatılıyorsa 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ülenlerle 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() numarasını arayarak cihazdaki tüm etkin kayıtların genel görünümünü görebilirsiniz.