Ses girişi paylaşılıyor

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 yapıyor 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, bir uygulamanın kayıt yapıp yapmadığından veya yalnızca dinleyip dinlemediğinden bağımsız olarak "yakalama" terimini kullanırız.

İ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 kaydediyor 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 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ündeki bir ses kaynağı kullanmasıydı. Bu durumda başka bir uygulama kayıt başlatabilir. 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" ş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, yeni bir uygulama ses girişini alırsa daha önce kayıt yapan uygulama çalışmaya devam eder ancak ses almaz. 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.
  • Gizliliğe duyarlı bir kaynaktan ses yakalayan uygulamaların önceliği, bu tür bir kaynaktan ses yakalamayan uygulamalara göre daha yüksektir.
  • İki normal uygulama hiçbir zaman 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ışırken her ikisi de giriş sinyalini alabilir veya bunlardan biri sessiz kalabilir.

Dört temel senaryo vardır:

  • Asistan + normal 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 gizlilik açısından hassas bir ses kaynağından kayıt yapmadığında ses aldığını unutmayın.

Erişilebilirlik hizmeti + normal uygulama

AccessibilityService için katı bir beyan gereklidir.

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 kayıt yaptığında yalnızca bir uygulama ses alır, diğeri ise sessiz olur.

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

  • Hiçbir uygulama gizlilik açısından hassas değilse üstte 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. Üstünde kullanıcı arayüzü olsa veya daha yeni kayıt yapmaya başlamış olsa bile diğer uygulama sessiz kalır.
  • Her iki uygulama da gizlilik açısından hassassa 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 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ı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:

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 ise sessizdir (ses almaz). Etkin uygulamalar değiştiğinde ses çerçevesi, ses yollarını aşağıdaki kurallara göre yeniden yapılandırabilir:

  • Etkin olan her uygulamanın ses giriş cihazı değişebilir (örneğin, yerleşik mikrofon yerine bağlı bir Bluetooth kulaklık).
  • En yüksek öncelikli etkin uygulamayla ilişkili ö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 efektin, 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() kodunu arayarak cihazdaki tüm etkin kayıtların genel görünümünü alabilirsiniz.