Cómo crear una aplicación para escuchar radio por internet en Android Studio con ExoPlayer

Asteroide con antena de radio

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

https://exoplayer.dev/hello-world.html

Dejar un comentario