Ses girişi paylaşılıyor

Ses girişi genellikle yerleşik mikrofondan, harici bir mikrofondan veya ses arayüzüyle çalışır. Ses girişi şuradan da gelebilir: telefon görüşmesi arasında bir sohbettir.

Bazen iki veya daha fazla uygulama, fotoğrafı "yakalamak" isteyebilir olması gerekir. Farklı görevler gerçekleştiriyor olabilirler. Örneğin, ses alan bazı uygulamalar "kayıt", gibi basit bir ses kaydedicisinden diğer uygulamalar "dinleme" aşamasında olabilir. Google Asistan veya erişilebilirlik hizmeti gibi sesli komutlara yanıt verebilir.

Her iki durumda da, bu uygulamalar ses girişi almak ister. Bu sayfanın tamamında "yakalama" terimini kullanıyoruz. ister en iyi uygulamaları bir şeyler kaydediyor veya sadece dinliyor.

İki veya daha fazla uygulama aynı anda ses kaydı yapmak istiyorsa bir sorun olabilir hepsine aynı kaynaktan ses sinyalini iletebilmesidir. Bu sayfada aşağıdakiler açıklanmaktadır: Android sisteminin ses girişini kaydeden birden fazla uygulama arasında nasıl paylaştığı.

Android 10 öncesi davranış

Android 10'dan önce giriş ses akışı, tek seferde yalnızca bir uygulama tarafından yakalanabiliyordu. gerekir. Bazı uygulamalar zaten ses kaydediyor veya dinliyorsa şunları yapabilirdi: AudioRecord nesnesi oluşturun, ancak şunu çağırdığınızda hata döndürülür: AudioRecord.startRecording() ve kayıt başlamıyor.

Bu kuralın tek istisnası, ayrıcalıklı bir uygulama (ör. Google Asistan veya erişilebilirlik hizmeti) için gerekli android.permission.CAPTURE_AUDIO_HOTWORD ve şu türde bir ses kaynağı kullandı: HOTWORD. Bu durumda başka bir uygulama kaydetmeye başlayabilir. Bu olduğunda Ayrıcalıklı uygulama sonlandırıldı ve yeni uygulama girişi yakaladı.

Android 9'da bir değişiklik daha eklendi: yalnızca ön planda çalışan uygulamalar (veya ön plan hizmeti) ses girişini yakalayabilir. Ücretsiz bir uygulama veya ön plan kullanıcı arayüzü bileşeni yakalamaya başladığında, uygulama çalışmaya devam etti ancak görüntü kaydeden tek uygulama olsa bile sessize alındı olmasını sağlar.

Android 10 davranışı

Android 10'dan önceki davranış "ilk gelen alır, ilk hizmet alır" şeklindedir. Bir uygulama ses yakalamaya başladığında diğer uygulamalar ses kaydına erişemez ses girişi yapana kadar, ses girişi yapana kadar.

Android 10, giriş ses akışını değiştirebilen bir öncelik şeması uygular uygulamalar arasında geçiş yapar. Çoğu durumda, ses girişini yeni bir uygulama ediniyorsa önceden yakalanan uygulama çalışmaya devam eder, ancak sessizlik alır. Bazılarında bu durum, sistemin her iki uygulamaya da ses sunmaya devam edebilmesini sağlar. Çeşitli paylaşım senaryoları aşağıda açıklanmıştır.

Bu şema, ses odağının birden fazla uygulamayı işleme şekline benzer itiraz eden içerikler üretiyor. Ancak ses odağı şu cihaz tarafından yönetilir: giriş değiştirme sırasında odaklanmak ve serbest bırakmak için programatik istekler Burada açıklanan şema, şu anda uygulanan bir önceliklendirme politikasına yeni bir uygulama ses yakalamaya başladığında otomatik olarak oluşturulur.

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

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

Ayrıca, bir uygulama farklı şekilde ele alınıyor "gizlilik açısından hassas" bir bağlantı kullanıyorsa ses kaynağı: CAMCORDER veya VOICE_COMMUNICATION.

Ses girişini kullanmak ve paylaşmak için önceliklendirme kuralları aşağıdaki gibidir:

  • Ayrıcalıklı uygulamalar sıradan uygulamalara göre daha yüksek önceliğe sahiptir.
  • Kullanıcı arayüzü görünür durumda olan uygulamalar, arka plan uygulamalarına göre 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 son başlatılan uygulama daha yüksek önceliğe sahip olur.

Paylaşım senaryoları

İki uygulama ses yakalamaya çalıştığında her ikisi de giriş sinyalini alabilir veya ikisinden biri de sessizlik.

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 özel bir uygulamadır çünkü önceden yüklü olduğu ve içinde rol RoleManager.ROLE_ASSISTANT. Bu role sahip olan önceden yüklenmiş diğer tüm uygulamalar benzer şekilde ele alınır.

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

  • Asistan, sesi alabilir (ön planda veya arka planda olması fark etmeksizin) Gizlilik açısından hassas bir ses kaynağı kullanan başka bir uygulama zaten ses kaydı yapmıyorsa.

  • Asistan'ın görünür bir kullanıcı arayüzü yoksa uygulama ses alır bileşeninin bazı bölümlerinde yer alır.

Her iki uygulamanın da yalnızca Asistan arka plandayken ses aldığını unutmayın ve diğer uygulama gizliliğe duyarlı bir ses kaynağından görüntü kaydetmiyordur.

Erişilebilirlik hizmeti + normal uygulama

AccessibilityService katı bir beyan gerektirir.

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

  • Hizmetin kullanıcı arayüzü üstteyse hem hizmet hem de uygulama ses girişi. Bu davranış, sesli aramayı veya videoyu kontrol etme gibi işlevler sunar yakalamanız gerekir.

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

İki sıradan 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:

  • İki uygulama da gizliliğe duyarlı değilse üstünde kullanıcı arayüzü olan uygulama ses alır. Hiçbir uygulamanın kullanıcı arayüzü yoksa en son ses kaydını başlatan uygulama sesi alır.
  • Uygulamalardan biri gizlilik açısından hassas olduğunda sesi alır ve diğer uygulama, en üstte kullanıcı arayüzü olsa veya çekime başlasa bile sessize alıyor çok daha yakın zamanda.
  • Her iki uygulama da gizliliğe duyarlıysa en çok yakalamaya başlayan uygulama son zamanlarda ses alır, diğerinin sesi kapatılır.

Sesli arama + normal uygulama

Şu kullanıcı ses moduna döndüğünde sesli arama etkindir: AudioManager.getMode() MODE_IN_CALL veya MODE_IN_COMMUNICATION.

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

Android 11 davranışı

Android 11 (API düzeyi 30), Android 10 öncelik şemasını uygular 'ne başvurun. Ayrıca AudioRecord, MediaRecorder ve Eş zamanlı olarak ses yakalama özelliğini etkinleştiren ve devre dışı bırakan AAudioStream, kullanım alanından bağımsız olarak.

Yeni yöntemler şunlardır:

setPrivacySensitive() true olduğunda, yakalama kullanım alanı gizlidir ve hatta Ayrıcalıklı bir Asistan aynı anda görüntü yakalayamaz. Bu ayar, ses kaynağına bağlı varsayılan davranış. Örneğin, VOICE_COMMUNICATION varsayılan olarak gizlidir ancak UNPROCESSED gizli değildir.

Yapılandırma değişiklikleri

Birden fazla uygulama aynı anda ses kaydı yaptığında, bu uygulamalardan yalnızca biri "etkin" (ses alma); diğerlerinin sesi kapatılır (sessizliği alır). ses çerçevesi, ses yollarını yeniden yapılandırabilir. şu kurallara göre:

  • Her etkin uygulamanın ses giriş cihazı değişebilir (örneğin, dahili mikrofonu, bağlı bir Bluetooth mikrofonlu kulaklığa takın).
  • En yüksek öncelikli etkin uygulamayla ilişkilendirilmiş ön işleme etkinleştirilir. Tümü diğer ön işlemeler yoksayılır.

Daha yüksek öncelikli bir uygulama etkinleştirildiğinde etkin bir uygulamanın sesi kapatılabileceğinden bir kayıt oluşturabilirsiniz: AudioManager.AudioRecordingCallback AudioRecord üzerinde veya MediaRecorder nesne olarak yeniden yapılandırılacak. Olası değişiklikler şunlar olabilir:

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

Aramanız gerekiyor AudioRecord.registerAudioRecordingCallback() dokunun. Geri çağırma yalnızca uygulama ses alırken ve bir değişiklik yapıldığında yürütülür.

onRecordingConfigChanged() yöntemi, mevcut ses yakalama durumunu içeren bir AudioRecordingConfiguration döndürür. Şunları kullanın: yöntemleri ve yöntemleri görürsünüz:

isClientSilenced()
İstemciye döndürülen ses, yakalama politikası nedeniyle o anda sessize alını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ü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üştürme işlemlerini otomatik olarak gerçekleştirir.
AudioRecord.getActiveRecordingConfiguration().
Etkin kayıt yapılandırmasını döndürür.

Şu numarayı arayarak cihazdaki tüm etkin kayıtların genel görünümünü alabilirsiniz: AudioManager.getActiveRecordingConfigurations().