Ses çıkışındaki değişiklikleri işleme

Kullanıcılar, bir ses uygulamasının ses düzeyini kontrol edebilmeyi bekler. Standart davranış olarak, ses kontrollerini (cihazdaki düğmeler veya düğmeler ya da kullanıcı arayüzündeki kaydırma çubukları) kullanabilme ve kullanım sırasında kulaklık gibi bir çevre biriminin bağlantısı kesilirse aniden yüksek sesle çalınmama gibi özellikler bulunur.

Ses kontrollerini kullanma

Bir kullanıcı bir oyunda veya müzik uygulamasında ses seviyesi tuşuna bastığında, oynatıcı şarkılar arasında duraklatılmış olsa veya o anki oyun konumu için müzik hiç olmasa bile ses seviyesi değişir.

Android müzik çalmak, alarmlar, bildirimler, gelen arama zil sesi, sistem sesleri, çağrı ses düzeyi ve DTMF tonlarını çalmak için ayrı ses akışları kullanır. Bu sayede kullanıcılar, her yayının ses düzeyini bağımsız olarak kontrol edebilir.

Varsayılan olarak, ses denetimine basıldığında etkin ses akışının ses düzeyi değiştirilir. Uygulamanız şu anda hiçbir şey çalmıyorsa ses seviyesi tuşlarına basmak müzik ses düzeyini (veya Android 9'dan önceki zil ses düzeyini) ayarlar.

Uygulamanız çalar saat değilse AudioAttributes.USAGE_MEDIA kullanım oranına göre ses çalmalısınız.

Ses seviyesi kontrollerinin doğru yayını ayarladığından emin olmak için AudioAttributes.getVolumeControlStream'dan alabileceğiniz özelliklerinizle eşleşen akış türünde setVolumeControlStream() öğesini çağırmalısınız.

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

Java

setVolumeControlStream(AudioManager.STREAM_MUSIC);

Bu çağrıyı uygulamanızın yaşam döngüsünde, genellikle medyanızı kontrol eden etkinliğin veya parçanın onResume() yönteminden yapın. Bu, hedef etkinlik veya parça görünür olduğunda ses kontrollerini STREAM_MUSIC öğesine bağlar.

Akış sesini programatik olarak kontrol etme

Nadir durumlarda, ses akışının ses düzeyini programatik olarak ayarlayabilirsiniz. Örneğin, uygulamanız mevcut bir kullanıcı arayüzünün yerini aldığında. Android AudioManager aynı türdeki tüm ses akışlarını birlikte karıştırdığı için bu önerilmez. Bu yöntemler, akışı kullanan her uygulamanın ses düzeyini değiştirir. Aşağıdakileri kullanmaktan kaçının:

Sabit hacimli cihazlarla çalışma

Bazı cihazlarda (ör. Chromebook'lar) ses denetimleri bulunur, ancak uygulamaların ses akışı seviyesini değiştirmek için yukarıda açıklanan AudioManager yöntemlerini kullanmasına izin verilmez. Bunlara sabit hacimli cihazlar denir. Uygulamanızın sabit hacme sahip bir cihazda çalışıp çalışmadığını isVolumeFixed() numaralı telefonu arayarak öğrenebilirsiniz.

Ses uygulamaları, çıkış ses düzeyini aynı akışta çalan diğer uygulamalarla dengeleyebilmelidir. Sabit hacimli cihazlarda, uygulama kendi ses kontrollerini aşağıdaki tabloda uygun setVolume() yöntemine bağlamalıdır:

Oyuncu Yöntem
Ses parçası AudioTrack.setVolume()
Medya Oynatıcı MediaPlayer.setVolume()
ExoPlayer Temel AudioTrack'in ses düzeyini ayarlayan SimpleExoPlayer.setVolume() özelliğini kullanın.

Gürültü yapmayın

Kullanıcıların, Android cihazlarından ses dinlemenin birçok alternatifi vardır. Çoğu cihazda yerleşik hoparlör ve kablolu kulaklıklar için kulaklık jakı bulunur. Cihazların birçoğunda da Bluetooth bağlantısı ve A2DP ses desteği mevcuttur.

Mikrofonlu kulaklıkların fişi çekildiğinde veya Bluetooth cihazın bağlantısı kesildiğinde ses akışı otomatik olarak yerleşik hoparlöre yönlendirilir. Yüksek sesle müzik dinliyorsanız bu pek gürültülü bir sürpriz olabilir.

Bu durumda kullanıcılar genellikle ekranda oynatma kontrolleri olan bir müzik çalar içeren uygulamaların çalmayı duraklatmasını beklerler. Denetim içermeyen oyunlar gibi diğer uygulamalar oynamaya devam etmelidir. Kullanıcı, cihazın donanım kontrolleriyle ses düzeyini ayarlayabilir.

Ses çıkışı tekrar yerleşik hoparlöre geçtiğinde sistem bir ACTION_AUDIO_BECOMING_NOISY niyeti yayınlar. Her ses çaldığınızda bu amacı dinleyen bir BroadcastReceiver oluşturmalısınız. Alıcınız aşağıdaki gibi görünmelidir:

Kotlin

private class BecomingNoisyReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == AudioManager.ACTION_AUDIO_BECOMING_NOISY) {
            // Pause the playback
        }
    }
}

Java

private class BecomingNoisyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
      if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
          // Pause the playback
      }
    }
}

Oynatmaya başladığınızda alıcıyı kaydedin, durdurduğunuzda kaydını iptal edin. Uygulamanızı bu kılavuzda açıkladığımız şekilde tasarlarsanız bu çağrılar onPlay() ve onStop() medya oturumu geri çağırmalarında görünecektir.

Kotlin

private val intentFilter = IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY)
private val myNoisyAudioStreamReceiver = BecomingNoisyReceiver()

private val callback = object : MediaSessionCompat.Callback() {

    override fun onPlay() {
        registerReceiver(myNoisyAudioStreamReceiver, intentFilter)
    }

    override fun onStop() {
        unregisterReceiver(myNoisyAudioStreamReceiver)
    }
}

Java

private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
private BecomingNoisyReceiver myNoisyAudioStreamReceiver = new BecomingNoisyReceiver();

MediaSessionCompat.Callback callback = new
MediaSessionCompat.Callback() {
  @Override
  public void onPlay() {
    registerReceiver(myNoisyAudioStreamReceiver, intentFilter);
  }

  @Override
  public void onStop() {
    unregisterReceiver(myNoisyAudioStreamReceiver);
  }
}