Streaming de radio en Android

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:

Ejemplo de streaming de radio con Android

Ejemplo de streaming de radio con Android

Bueno, hemos llegado al final de este tutorial como ya saben ante cualquier problema no duden en dejar un comentario.

Compartilo en
Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPin on PinterestEmail this to someone

AboutJosé Di Meglio

Apasionado de la tecnología y programación. Aportando información gratuita sobre el mundo de la informática.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *