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