
ExoPlayer es una herramienta que nos permite crear aplicaciones de streaming de forma relativamente sencilla
Vamos a crear un proyecto nuevo en Android Studio y en la sección de teléfono y tablet seleccionamos “Actividad vacía”

Le ponemos un nombre a la app, un nombre de paquete (este debe ser único), seleccionamos nuestro lenguaje de programación principal (para este tutorial usaremos Java) y el SDK mínimo (elegí API 21 para Android 5.0)

Nos vamos a la carpeta “res” del proyecto en la parte izquierda del la interfaz. Buscamos la subcarpeta mipmap y borramos los archivos .webp que comienzan con ic_launcher

Hacemos clic derecho sobre la carpeta “res”, nos vamos al menú “nuevo” y elegimos “recurso imagen”

Seleccionamos la imagen que queremos como ícono de notificación y una vez establecido repetimos los pasos para el ícono del lanzador
Nos vamos al archivo build.gradle correspondiente al modulo de la app y agregamos los siguiente dentro del partado de las dependencias
implementation 'com.google.android.exoplayer:exoplayer:2.16.1'Abrimos el archivo MainActivity.java y agregamos las siguientes líneas de código
        ExoPlayer player = new ExoPlayer.Builder(this).build();
        // Build the media item.
        MediaItem mediaItem = MediaItem.fromUri(<radio-url>);
        // Set the media item to be played.
        player.setMediaItem(mediaItem);
        // Prepare the player.
        player.prepare();
        // Start the playback.
        player.play();Realizamos las importaciones necesarias y nos quedaría algo parecido a esto
package asgardius.page.r3player;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.MediaItem;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ExoPlayer player = new ExoPlayer.Builder(this).build();
        // Build the media item.
        MediaItem mediaItem = MediaItem.fromUri(<radio-url>);
        // Set the media item to be played.
        player.setMediaItem(mediaItem);
        // Prepare the player.
        player.prepare();
        // Start the playback.
        player.play();
    }
}Editamos nuestro AndroidManfest para darle permisos de acceso a internet y agregamos lo siguiente entre <manifest> y <aplication>
<uses-permission android:name="android.permission.INTERNET" />En caso de utilizar una fuente http sin SSL necesitamos agregar lo siguiente dentro de application para evitar problemas con Android 9 y versiones posteriores
android:usesCleartextTraffic="true"Para evitar que la pantalla cambie a modo horizontal podemos agregar lo siguiente dentro de <activity>
android:screenOrientation="portrait"Nos quedaría algo parecido a esto
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="asgardius.page.r3player">
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/Theme.TheRedRobotRadio">
        <activity
            android:name=".MainActivity"
            android:screenOrientation="portrait"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>La depuramos en un emulador o un dispositivo físico y debería conectarse a la emisora seleccionada despues de abrirse. Para detener la reproducción es necesario retirar la app del panel de apps recientes
Agregaremos una imagen a la actividad principal para que no se vea vacía. Para ello elegimos una imagen y la arrastramos a la carpeta “drawable” dentro de “res”. Yo elegí uno de los fondos utilizados en otro proyecto donde estoy trabajando. Ahora agregamos la imagen en la interfaz de la actividad principal (“activity_main.xml” dentro de la carpeta “layout” ubicada en “res”)
Reemplazamos el contenido por lo siguiente
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:theme="@style/Theme.AppCompat"
    tools:context=".MainActivity">
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="250dp"
        android:background="@drawable/galaxy"
        android:contentDescription="@string/galaxy"
        tools:ignore="MissingConstraints" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_margin="20dp"
        android:orientation="horizontal"
        android:padding="10dp">
        <Button
            android:id="@+id/start"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="Play" />
        <Button
            android:id="@+id/stop"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="Stop" />
    </LinearLayout>
<!--
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
-->
</LinearLayout>Reemplazando “galaxy” por el nombre de nuestra imagen y ajustando la altura para que coincida con las proporciones de esta.
Agregaremos la función correspondiente a los botones recién agregados
Buscamos las siguientes líneas en el archivo “MainActivity.java”
                MediaItem mediaItem = MediaItem.fromUri("<radio-url>");
                player.setMediaItem(mediaItem);
                // click handling code
                // Prepare the player.
                player.prepare();
                // Start the playback.
                player.play();Las reemplazamos por lo siguiente
        Button startplayer = (Button)findViewById(R.id.start);
        startplayer.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                MediaItem mediaItem = MediaItem.fromUri((<radio-url>);
                player.setMediaItem(mediaItem);
                // click handling code
                // Prepare the player.
                player.prepare();
                // Start the playback.
                player.play();
            }
        });
        Button stopplayer = (Button)findViewById(R.id.stop);
        stopplayer.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                // click handling code
                player.stop();
            }
        });El archivo quedará parecido a este
package asgardius.page.r3player;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.MediaItem;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ExoPlayer player = new ExoPlayer.Builder(this).build();
        // Build the media item.
        Button startplayer = (Button)findViewById(R.id.start);
        startplayer.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                MediaItem mediaItem = MediaItem.fromUri((<radio-url>);
                player.setMediaItem(mediaItem);
                // click handling code
                // Prepare the player.
                player.prepare();
                // Start the playback.
                player.play();
            }
        });
        Button stopplayer = (Button)findViewById(R.id.stop);
        stopplayer.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                // click handling code
                player.stop();
            }
        });
    }
}Ahora tenemos una app sencilla con la cual poder escuchar nuestra emisora de radio favorita

Referencias