¿Cómo administrar el enfoque de audio en Android?

El enfoque de audio en Android debe administrarse y es uno de los importantes para manejar las interrupciones de audio. En Android, muchas aplicaciones reproducen medios simultáneamente y, para aumentar la experiencia del usuario, se manejan las interrupciones de audio. Por ejemplo, si la aplicación está reproduciendo audio, de repente hay una llamada entrante, entonces el archivo de audio debe detenerse y, una vez finalizada la llamada, el audio debe continuar reproduciéndose desde donde se detuvo. En este artículo, se ha discutido cómo manejar las interrupciones de audio o cómo implementar Audio Focus en Android. Eche un vistazo a la siguiente imagen para tener una idea de qué cosas se van a discutir.

Audio Focus in Android

Pasos para implementar el enfoque de audio o manejar las interrupciones de audio

Paso 1: crear un proyecto de actividad vacío

Paso 2: trabajar con el archivo activity_main.xml

  • El diseño principal de este proyecto incluye solo tres botones que se utilizan para reproducir, pausar y detener la reproducción del archivo de audio en la aplicación.
  • Invoque el siguiente código para implementar la interfaz de usuario.

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    tools:ignore="HardcodedText">
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginStart="16dp"
        android:layout_marginTop="32dp"
        android:layout_marginEnd="16dp"
        android:text="Manage Audio Focus (Handling Audio interruptions in Android"
        android:textSize="18sp"
        android:textStyle="bold" />
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:gravity="center_horizontal"
        android:orientation="horizontal">
 
        <Button
            android:id="@+id/stopButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="32dp"
            android:backgroundTint="@color/colorPrimary"
            android:drawableStart="@drawable/ic_stop"
            android:text="STOP"
            android:textColor="@android:color/white" />
 
        <Button
            android:id="@+id/playButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="32dp"
            android:backgroundTint="@color/colorPrimary"
            android:drawableStart="@drawable/ic_play"
            android:text="PLAY"
            android:textColor="@android:color/white" />
 
        <Button
            android:id="@+id/pasueButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:backgroundTint="@color/colorPrimary"
            android:drawableStart="@drawable/ic_pause"
            android:text="PAUSE"
            android:textColor="@android:color/white" />
 
    </LinearLayout>
 
</RelativeLayout>

Interfaz de usuario de salida:

Audio Focus in Android

Paso 3: trabajar con el archivo MainActivity.java

  • La devolución de llamada principal debe implementarse cuando hay un cambio en el enfoque de audio. Lo que significa que el sistema ha transferido el foco de audio a otro servicio que utiliza la aplicación, en este caso, la aplicación Teléfono que toma el foco de audio de la aplicación actual que está reproduciendo el audio.

AudioManager.OnAudioFocusChangeListener audioFocusChangeListener -> Esto maneja si hay un cambio en el enfoque de audio que la devolución de llamada debe implementar de acuerdo con el cambio de enfoque de la gestión de audio.

  • Cuando se cuelga la llamada, el foco cambia a la aplicación actual y se reanuda MediaPlayer.
  • El resultado de la solicitud de enfoque que devuelve el sistema Android se compara con las siguientes constantes.
  1. AUDIOFOCUS_GAIN: si el sistema otorga la ganancia de enfoque de audio, entonces la reproducción puede continuar después de la pérdida temporal del enfoque de audio.
  2. AUDIOFOCUS_LOSS_TRANSIENT: si hay una pérdida temporal del foco de audio, la reproducción del audio debe pausarse.
  3. AUDIOFOCUS_LOSS: si hay una pérdida permanente del audio, el reproductor multimedia debe liberarse (totalmente detenido).
  • Para implementar el enfoque de audio en la aplicación, tal como se mencionó anteriormente, invoque el siguiente código en el archivo MainActivity.java . Se agregan comentarios para una mejor comprensión.

Java

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.media.AudioAttributes;
import android.media.AudioFocusRequest;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.io.IOException;
 
@RequiresApi(api = Build.VERSION_CODES.O)
public class MainActivity extends AppCompatActivity {
 
    // media player instance to playback
      // the media file from the raw folder
    MediaPlayer mediaPlayer;
 
    // Audio manager instance to manage or
      // handle the audio interruptions
    AudioManager audioManager;
 
    // Audio attributes instance to set the playback
      // attributes for the media player instance
    // these attributes specify what type of media is
      // to be played and used to callback the audioFocusChangeListener
    AudioAttributes playbackAttributes;
 
    // media player is handled according to the
      // change in the focus which Android system grants for
    AudioManager.OnAudioFocusChangeListener audioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
        @Override
        public void onAudioFocusChange(int focusChange) {
            if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
                mediaPlayer.start();
            } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
                mediaPlayer.pause();
                mediaPlayer.seekTo(0);
            } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
                mediaPlayer.release();
            }
        }
    };
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // get the audio system service for
          // the audioManger instance
        audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
 
        // initiate the audio playback attributes
        playbackAttributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_GAME)
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .build();
 
        // set the playback attributes for the focus requester
        AudioFocusRequest focusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
                .setAudioAttributes(playbackAttributes)
                .setAcceptsDelayedFocusGain(true)
                .setOnAudioFocusChangeListener(audioFocusChangeListener)
                .build();
 
        // request the audio focus and
          // store it in the int variable
        final int audioFocusRequest = audioManager.requestAudioFocus(focusRequest);
 
        // register all three buttons
        Button bPlay = findViewById(R.id.playButton);
        Button bPause = findViewById(R.id.pasueButton);
        Button bStop = findViewById(R.id.stopButton);
 
        // initiate the media player instance with
          // the media file from the raw folder
        mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.music);
 
        // handle the PLAY button to play the audio
        bPlay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // request the audio focus by the Android system
                  // if the system grants the permission
                // then start playing the audio file
                if (audioFocusRequest == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
                    mediaPlayer.start();
                }
            }
        });
 
        // handle the PAUSE button to pause the media player
        bPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.pause();
            }
        });
 
        // handle the STOP button to stop the media player
        bStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.stop();
 
                try {
                    // if the mediaplayer is stopped then
                      // it should be again prepared for
                    // next instance of play
                    mediaPlayer.prepare();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
 
    }
}

Nota: Cuando no hay un requisito de enfoque de audio, se debe llamar al método abandonAudioFocusRequest con la instancia de AudioManager y requiere el parámetro AudioFocusRequest focusRequest que se debe pasar.

Salida: ejecutar en el emulador

Publicación traducida automáticamente

Artículo escrito por adityamshidlyali y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *