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.
Pasos para implementar el enfoque de audio o manejar las interrupciones de audio
Paso 1: crear un proyecto de actividad vacío
- Cree un proyecto de Android Studio de actividad vacío. Y seleccione Java como lenguaje de programación.
- Para saber cómo crear un proyecto de Android Studio de actividad vacía, consulte Android | ¿Cómo crear/comenzar un nuevo proyecto en Android Studio?
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:
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.
- 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.
- AUDIOFOCUS_LOSS_TRANSIENT: si hay una pérdida temporal del foco de audio, la reproducción del audio debe pausarse.
- 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