Blog
Streaming de radio con Android usando Java (parte 2)

Este tutorial es la continuación del anterior, en el que aprendimos a crear una streaming de radio muy básico donde al iniciar la aplicación comenzaba automáticamente la radio.
En este vamos a incluirle una simple barra de control para manipular el audio y darle pausa o play.
¿Cómo agregar una barra de control a un streaming de radio con Android usando Java?
Para realizar esto y siguiendo con lo que habíamos hecho en el anterior tutorial vamos a comenzar agregando los componentes en la vista. En nuestro xml (activity_main.xml en mi caso) agregaremos el siguiente código:
<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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.programacionextrema.radio.MainActivity" > <LinearLayout android:id="@+id/controlLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerInParent="true" android:layout_margin="5dp" android:gravity="center_horizontal" > <RelativeLayout android:id="@+id/volumeLayout" android:layout_width="wrap_content" android:layout_height="70dp" android:layout_gravity="center_vertical" android:layout_marginRight="10dp" android:background="@drawable/volume_background" android:gravity="center_vertical" android:padding="3dp" > <ImageView android:id="@+id/volumeImageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/iconVolumeDescription" android:src="@android:drawable/ic_lock_silent_mode_off" /> <SeekBar android:id="@+id/volumeSeekBar" android:layout_width="180dp" android:layout_height="wrap_content" android:layout_marginLeft="36dp" android:indeterminate="false" /> </RelativeLayout> <RelativeLayout android:id="@+id/layoutButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/volume_background" android:padding="3dp" > <ToggleButton android:id="@+id/playPauseButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/start_pause_button_selector" android:contentDescription="@string/clear" android:minHeight="64dp" /> </RelativeLayout> </LinearLayout> </RelativeLayout>
Seguido de esto debemos agregar los siguientes strings en res/values/strings.xml:
<string name="clear"></string> <string name="iconVolumeDescription">Volumen</string>
Luego debemos crear (si no la tenemos) una carpeta llamada drawable dentro del directorio res. Ahí vamos a incluir los siguientes tres archivos que representan el diseño de la barra de control que incluimos en nuestra vista:
media_button_layer.xml
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:dither="true" android:shape="oval" > <size android:height="15dp" android:width="15dp" /> <solid android:color="#000" /> </shape> </item> <item> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:dither="true" android:shape="oval" > <size android:height="13dp" android:width="13dp" /> <gradient android:angle="90" android:endColor="#0099FF" android:startColor="#003399" android:type="linear" /> </shape> </item> <item> <selector> <item android:drawable="@android:drawable/ic_media_pause" android:state_checked="true"/> <item android:drawable="@android:drawable/ic_media_play" android:state_checked="false"/> <item android:drawable="@android:drawable/ic_media_play"/> </selector> </item> </layer-list>
start_pause_button_selector.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@android:drawable/ic_media_pause" android:state_checked="true"/> <item android:drawable="@android:drawable/ic_media_play" android:state_checked="false"/> <item android:drawable="@android:drawable/ic_media_play" /> </selector>
volume_background.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="#000" /> <corners android:radius="5dp" /> </shape>
Una vez que ya terminamos con los pasos anteriores debemos agregar la funcionalidad con Java para que al apretar play o stop realice la acción adecuada y además que se pueda manejar el volumen. Para esto vamos a incluir el siguiente código, el cual es una versión mejorada del tutorial anterior:
package com.programacionextrema.radio; import java.io.IOException; import android.app.Activity; import android.content.Context; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnBufferingUpdateListener; import android.media.MediaPlayer.OnPreparedListener; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.Toast; import android.widget.ToggleButton; public class MainActivity extends Activity { private MediaPlayer player; private String url = "Aquí va la URL"; protected boolean isPlay = false; private ToggleButton buttonStreaming; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Inicializo el objeto MediaPlayer initializeMediaPlayer(); // Inicializando el volumen initializeVolume(); buttonStreaming = (ToggleButton) findViewById(R.id.playPauseButton); buttonStreaming.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { buttonStreaming.setEnabled(false); isPlay = !isPlay; if (isPlay) { startPlaying(); } else { stopPlaying(); } } }); } public void stopPlaying() { if (player.isPlaying()) { player.stop(); player.release(); initializeMediaPlayer(); buttonStreaming.setEnabled(true); } } private void initializeVolume() { try { final SeekBar volumeBar = (SeekBar) findViewById(R.id.volumeSeekBar); final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); volumeBar.setMax(audioManager .getStreamMaxVolume(AudioManager.STREAM_MUSIC)); volumeBar.setProgress(audioManager .getStreamVolume(AudioManager.STREAM_MUSIC)); final OnSeekBarChangeListener eventListener = new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0); } }; volumeBar.setOnSeekBarChangeListener(eventListener); } catch (Exception e) { Log.e("MainActivity", e.getMessage()); } } private void initializeMediaPlayer() { player = new MediaPlayer(); player.setOnBufferingUpdateListener(new OnBufferingUpdateListener() { public void onBufferingUpdate(MediaPlayer mp, int percent) { Log.i("Buffering", "" + percent); } }); } public void startPlaying() { try { Toast.makeText(getApplicationContext(), "Conectando con la radio, espere unos segundos...", Toast.LENGTH_LONG).show(); player.reset(); player.setDataSource(url); player.setAudioStreamType(AudioManager.STREAM_MUSIC); player.setOnPreparedListener(new OnPreparedListener() { public void onPrepared(MediaPlayer mp) { player.start(); buttonStreaming.setEnabled(true); } }); player.prepareAsync(); } catch (IllegalArgumentException | SecurityException | IllegalStateException | IOException e) { Toast.makeText(getApplicationContext(), "Error al conectar con la radio", Toast.LENGTH_LONG).show(); } } }
Para que esta aplicación funcione es importante recordar que hay que agregar el permiso para poder conectarse a internet en el AndroidManifest.xml.
<uses-permission android:name="android.permission.INTERNET" > </uses-permission>
Luego podemos compilar e instalar nuestra aplicación en un dispositivo. El resultado tendría que ser el siguiente:

Bueno, hemos llegado al final de este tutorial como ya saben ante cualquier problema no duden en dejar un comentario.
Hola mi nombre es Jhonny tengo una consulta como puedo mostrar el nombre de la canción que esta sonando y su carátulas, puedo hacer eso por que yo estoy emitiendo radio por internet de mi computadora usando streaming con winamp y icecast.
Buenas amigos, me gustaría saber como hacer para que al momento de realizar una llamada o grabar una nota de voz en whatsapp el audio de la radio se pusiera en 0 o que se ponga luego de terminar la llamada o la grabación se restaurara el sonido de la radio.