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 alınabilir.

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" yapıyor olabilir (ör. basit bir ses kaydedici), bazı uygulamalar ise "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ığına veya yalnızca dinleyip dinlemediğine bakılmaksızın "yakalama" terimini kullanıyoruz.

İki veya daha fazla uygulama aynı anda ses yakalamak isterse aynı kaynaktan gelen ses sinyalini hepsine iletmede sorun yaşanabilir. Bu sayfada, Android sisteminin ses yakalayan 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. Başka bir uygulama zaten ses kaydı yapıyorsa veya ses dinliyorsa uygulamanız AudioRecord nesnesi oluşturabilir ancak AudioRecord.startRecording() çağrıldığında 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 bir erişilebilirlik hizmeti) android.permission.CAPTURE_AUDIO_HOTWORD iznine sahip olması ve HOTWORD türünde bir ses kaynağı kullanmasıydı. Bu durumda başka bir uygulama kayda başlayabilir. Bu durumda ayrıcalıklı uygulama sonlandırıldı ve yeni uygulama girişi yakaladı.

Android 9'da bir değişiklik daha yapıldı: Yalnızca ön planda çalışan uygulamalar (veya ön plan hizmetleri) ses girişini yakalayabiliyordu. Ön plan hizmeti veya ön plan kullanıcı arayüzü bileşeni olmayan bir uygulama ses yakalamaya başladığında, o sırada ses yakalayan tek uygulama olsa bile uygulama çalışmaya devam ediyor ancak sessiz kalıyordu.

Android 10 davranışı

Android 10'dan önceki davranış "önce 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, uygulamalar çalışırken giriş ses akışını uygulamalar arasında değiştirebilen bir öncelik şeması uygular. Çoğu durumda, yeni bir uygulama ses girişini alırsa daha önce ses yakalayan uygulama çalışmaya devam eder ancak sessiz kalır. Bazı durumlarda sistem, her iki uygulamaya da ses iletmeye 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 odağı, odağı kazanmak ve serbest bırakmak için yapılan programatik isteklerle yönetilirken burada açıklanan giriş değiştirme şeması, yeni bir uygulama ses yakalamaya başladığında otomatik olarak uygulanan bir önceliklendirme politikasına dayanır.

Android, ses yakalama amacıyla iki tür uygulama arasında ayrım yapar:

  • "Normal" uygulamalar kullanıcı tarafından yüklenir.
  • "Ayrıcalıklı" uygulamalar cihaza önceden yüklenmiş olarak gelir. Google Asistan ve tüm erişilebilirlik hizmetleri bu kapsamdadır.

Ayrıca, bir uygulama "gizliliğe duyarlı" bir ses kaynağı kullanıyorsa farklı şekilde değerlendirilir: CAMCORDER veya VOICE_COMMUNICATION.

Ses girişini kullanma ve paylaşmaya ilişkin önceliklendirme kuralları şunlardır:

  • 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ına göre daha yüksek önceliğe sahiptir.
  • Gizliliğe duyarlı bir kaynaktan ses yakalayan uygulamalar, bunu yapmayan uygulamalara göre daha yüksek önceliğe sahiptir.
  • İki normal uygulama aynı anda ses yakalayamaz.
  • 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 yakalıyorsa 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 birinde sessizlik oluşabilir.

Dört ana senaryo vardır:

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

Asistan + normal uygulama

Asistan, önceden yüklenmiş olduğu ve RoleManager.ROLE_ASSISTANT rolünü üstlendiği için ayrıcalıklı bir uygulamadır. Bu role sahip diğer tüm önceden yüklenmiş uygulamalar da benzer şekilde ele alınır.

Android, giriş sesini şu kurallara göre paylaşır:

  • Gizliliğe duyarlı bir ses kaynağı kullanan başka bir uygulama zaten kayıt yapmıyorsa Asistan, ses alabilir (ön planda veya arka planda olması fark etmez).

  • 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 kayıt yapmıyorken ses aldığını unutmayın.

Erişilebilirlik hizmeti + normal uygulama

AccessibilityService için katı bir beyan gerekir.

Android, giriş sesini şu kurallara göre paylaşır:

  • Hizmetin kullanıcı arayüzü üstteyse hem hizmet hem de uygulama ses girişi alır. Bu davranış, sesli arama veya video kaydını sesli komutlarla kontrol etme gibi işlevler sunar.

  • Hizmet üstte değilse bu durum, aşağıdaki normal iki uygulamalı durum gibi ele alınır.

İki normal uygulama

İki uygulama aynı anda kayıt yaptığında yalnızca bir uygulama ses alır, diğeri ise sessiz kalır.

Android, giriş sesini şu kurallara göre paylaşır:

  • Her iki uygulama da gizliliğe duyarlı değilse ses, üstte kullanıcı arayüzü olan uygulamaya gönderilir. İki uygulamanın da kullanıcı arayüzü yoksa ses, en son kayda başlayan uygulamaya gönderilir.
  • Uygulamalardan biri gizliliğe duyarlıysa ses alır, diğer uygulama ise üstte bir kullanıcı arayüzü olsa veya daha yakın zamanda kayıt başlatmış olsa bile sessiz kalır.
  • Her iki uygulama da gizlilik açısından hassassa en son ses yakalamaya başlayan uygulama sesi alır, diğeri ise sessiz kalır.

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:

Android 11 davranışı

Android 11 (API düzeyi 30), yukarıda açıklanan Android 10 öncelik şemasını kullanır. Ayrıca, seçilen kullanım alanından bağımsız olarak sesin eşzamanlı yakalanmasını sağlayan ve devre dışı bırakan AudioRecord, MediaRecorder ve AAudioStream'da yeni yöntemler sunar.

Yeni yöntemler şunlardır:

setPrivacySensitive() true olduğunda yakalama kullanım alanı özeldir ve ayrıcalıklı bir Asistan bile aynı anda 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

Aynı anda birden fazla uygulama ses kaydettiğinde bunlardan yalnızca biri veya ikisi "etkin" (ses alıyor) olur, diğerleri ise sessize alınır (sessizlik alıyor). Etkin uygulamalar değiştiğinde ses çerçevesi, ses yollarını aşağıdaki kurallara göre yeniden yapılandırabilir:

  • Her etkin uygulamanın ses girişi cihazı değişebilir (örneğin, yerleşik mikrofondan bağlı bir Bluetooth kulaklığa geçiş).
  • En yüksek önceliğe sahip etkin uygulamayla ilişkili ön işleme etkinleştirilir. Diğer tüm ön işleme adımları 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 nesnesinde AudioManager.AudioRecordingCallback kaydedebilirsiniz. Olası değişiklikler şunlar olabilir:

  • Sessiz veya sessiz olmayan yakalama
  • Cihaz değiştirildi
  • Ön işleme değiştirildi
  • Akış özellikleri değiştirildi (örnekleme hızı, kanal maskesi, örnek biçimi)

Çekim başlatılmadan önce AudioRecord.registerAudioRecordingCallback() numaralı telefonu aramanız gerekir. Geri çağırma yalnızca uygulama ses alırken 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, yakalama politikası nedeniyle şu anda sessize alınmışsa 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 uygun olduğ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üştürme işlemlerini 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ü elde edebilirsiniz.