En este momento estás viendo Cómo Crear App De Radio En Android Studio

Cómo Crear App De Radio En Android Studio

En esta oportunidad crearemos una App de Radio.

Primero nos dirigimos al archivo strings.xml, añadimos texto para el botón de twitter y playstore.

<resources>
    <string name="app_name">Radio</string>
    <string name="webcam_text">Watch Live Webcam</string>
    <string name="twitter_share">Share on Twitter</string>
    <string name="appstore_rate">Rate on Play Store</string>
</resources>

Ahora nos vamos al archivo colors.xml y añadimos los colores.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="purple_200">#FFBB86FC</color>
    <color name="purple_500">#FF6200EE</color>
    <color name="purple_700">#FF3700B3</color>
    <color name="teal_200">#FF03DAC5</color>
    <color name="teal_700">#FF018786</color>
    <color name="black">#FF000000</color>
    <color name="white">#FFFFFFFF</color>
    <color name="colorTeban">#FF420042</color>
</resources>

Una vez editado, pasamos al archivo themes.xml y hacemos referencia a los colores que agregamos, procedemos de la misma manera para la versión night.

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.Curso2Radio" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_700</item>

        <item name="colorOnSecondary">@color/colorTeban</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorOnSecondary</item>
        <!-- Customize your theme here. -->
    </style>
</resources>

Ahora nos dirigimos al archivo activity_main.xml, como se puede observar esta listo para trabajarlo

Colocamos margen superior con 0, añadimos el atributo background y colocamos nuestro fondo personalizado.

Creamos un nuevo linearlayout, le colocamos ancho, altura, gravedad, alineación base y orientación

Dentro del linearlayout creamos un imageview para la imagen de la radio.

Posteriormente creamos otro linearlayout, de igual manera colocamos ancho, altura, gravedad, alineación base y orientación.

Dentro del linearlayout, añadimos el botón de sitio web, colocamos un identificador, ancho, altura, margen y fondo.

Luego creamos el botón de teléfono, creamos el botón de email y creamos el botón de mensaje.

Para terminar con los elementos del linearlayout, procedemos a crear la etiqueta de cierre.

Creamos un nuevo linearlayout, dentro del mismo vamos a crear un imageview para insertar publicidad personalizada.

Ahora crearemos un nuevo linearlayout para los controles de reproducción multimedia.

Comenzamos con el botón de play, colocamos un identificador, ancho, altura, gravedad margen inferior e icono.

Luego creamos el botón de pause, con atributos similares, con la diferencia del icono.

<?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:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_marginTop="0dp"
    android:background="@drawable/ab_gradient"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="top|center"
        android:baselineAligned="false"
        android:orientation="horizontal">

        <ImageView
            android:layout_width="280dp"
            android:layout_height="280dp"
            android:background="@drawable/radio" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="100dp"
        android:baselineAligned="false"
        android:gravity="center_horizontal"
        android:orientation="horizontal">

        <Button
            android:id="@+id/websiteBtn"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_margin="5dp"
            android:background="@drawable/website_icon" />

        <Button
            android:id="@+id/phoneBtn"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_margin="5dp"
            android:background="@drawable/phone_icon" />

        <Button
            android:id="@+id/emailBtn"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_margin="5dp"
            android:background="@drawable/email_icon" />

        <Button
            android:id="@+id/txtBtn"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_margin="5dp"
            android:background="@drawable/sms_icon" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/adArea"
        android:layout_width="fill_parent"
        android:layout_height="54dp"
        android:baselineAligned="false"
        android:gravity="center_horizontal"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/display_banner"
            android:layout_width="306dp"
            android:layout_height="54dp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:contentDescription="Play and stop buttons"
        android:gravity="bottom|center"
        android:orientation="horizontal">

        <Button
            android:id="@+id/PlayButton"
            android:layout_width="145dp"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center"
            android:layout_marginBottom="5dp"
            android:background="@drawable/play_icon" />

        <Button
            android:id="@+id/StopButton"
            android:layout_width="145dp"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center"
            android:layout_marginBottom="5dp"
            android:background="@drawable/stop_icon" />
    </LinearLayout>

</LinearLayout>

Ahora cambiamos al modo diseño para poder ver que tal está quedando nuestra app

Posteriormente nos dirigimos a la clase RadioMediaPlayerService.

En primer lugar colocamos las variables para poder controlar la radio

Esta clase tiene el proposito de controlar la radio en segundo plano, creamos el metodo play, donde insertaremos las validaciones correspondientes.

Inicializamos la notificación de la app de radio, para indicar que se está reproduciendo audio, creamos el método ondestroy para detener la reproducción en el caso que cerremos la app.

import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

import java.io.IOException;

public class RadioMediaPlayerService extends Service {

    private boolean isPlaying = false;
    private MediaPlayer radioPlayer;
    private static int classID = 579;
    public static String START_PLAY = "START_PLAY";
    Settings settings = new Settings();

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent.getBooleanExtra(START_PLAY, false)) {
            play();
        }
        return Service.START_STICKY;
    }

    @SuppressLint("NewApi")
    private void play() {

        if (isOnline()) {
            if (!isPlaying) {
                isPlaying = true;
                Intent intent = new Intent(this, MainActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|
                        Intent.FLAG_ACTIVITY_SINGLE_TOP);
                PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
                Notification notification = new Notification.Builder(getApplicationContext())
                        .setContentTitle(settings.getRadioName())
                        .setContentText(settings.getMainNotificationMessage())
                        .setSmallIcon(R.drawable.ic_launcher_foreground)
                        .setContentIntent(pi)
                        .build();

                radioPlayer = new MediaPlayer();
                try {
                    radioPlayer.setDataSource(settings.getRadioStreamURL());
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                if (settings.getAllowConsole()){
                    radioPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {
                        public void onBufferingUpdate(MediaPlayer mp, int percent) {
                            Log.i("Buffering", "" + percent);
                        }
                    });
                }

                radioPlayer.prepareAsync();
                radioPlayer.setOnPreparedListener(new OnPreparedListener() {

                    public void onPrepared(MediaPlayer mp) {
                        radioPlayer.start(); //Start radio stream
                    }
                });

                startForeground(classID, notification);

                Toast.makeText(getApplicationContext(), settings.getPlayNotificationMessage(),
                        Toast.LENGTH_LONG).show();
            }
        }
        else {
            Toast.makeText(getApplicationContext(), "No internet connection",
                    Toast.LENGTH_LONG).show();
        }


    }

    @Override
    public void onDestroy() {
        stop();
    }

    private void stop() {
        if (isPlaying) {
            isPlaying = false;
            if (radioPlayer != null) {
                radioPlayer.release();
                radioPlayer = null;
            }
            stopForeground(true);
        }

        Toast.makeText(getApplicationContext(), "Stream stopped",
                Toast.LENGTH_LONG).show();
    }

    public boolean isOnline() {
        ConnectivityManager cm =
                (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnectedOrConnecting()) {
            return true;
        }
        return false;
    }

}

Una vez terminemos con la clase RadioMediaPlayerService, nos dirigimos a la clase IntentReceiver.java, donde recibiremos los datos de las notificaciones y así poder controlar los botones de las notificaciones.

import android.content.Context;
import android.content.Intent;

public class IntentReceiver extends android.content.BroadcastReceiver {

    public void onReceive(Context ctx, Intent intent) {
        if (intent.getAction().equals(
                android.media.AudioManager.ACTION_AUDIO_BECOMING_NOISY)) {
            Intent myIntent = new Intent(ctx, RadioMediaPlayerService.class);
            ctx.stopService(myIntent);
        }
    }
}

Una vez terminemos, vamos a la clase MainActivity.java, donde colocaremos los atributos para controlar la radio.

Dentro del método oncreate, haremos referencia al método de control de audio, el método para escuchar las acciones de nuestra app y el método para el banner.

Creamos el método onCreateOptionsmenu para incluir nuestro menú personalizado.

Ahora creamos el método onOptionsItemSelected para controlar los botones de nuestro menú personalizado.

Luego creamos el método clicklisteners para controlar los botones de play, pausa, correo, mensaje.

En el caso de play, se inicializara la reproducción de audio, en caso contrario, se detendrá la reproducción.

Si se presiona el botón de correo, se redirigirá a una pantalla para redactar correo electrónico y así compartir nuestra app.

En caso que se presione el botón de teléfono, se dirigirá a la pantalla de skype y así poder compartir la radio mediante esa red.

En caso que sea el botón de web, se mostrará el sitio web de la radio que queremos que aparezca.

en otro caso, si se presiona el boton de mensaje, se enviara un enlace de nuestra app mediante mensaje sms.

Creamos el método adbanner para insertar nuestra publicidad.

Creamos el método launchwebcam para redirigir hacia la pagina web de la radio que hayamos agregado.

Tal vez te preguntes por que volvimos a crear un método para redirigir.

Esto fue creado a modo de ejemplo, para controlar el menú personalizado.

Finalmente creamos el método downloadImageTask para cargar el ícono de nuestra radio en segundo plano.

import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.AudioManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

import java.io.InputStream;

public class MainActivity extends Activity {

    private Button stopButton = null;
    private Button playButton = null;
    Settings settings = new Settings();
    private final String ADURL = settings.getAdBannerURL();
    private final String EMAILADD = settings.getEmailAddress();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setVolumeControlStream(AudioManager.STREAM_MUSIC);

        clickListeners();
        adBanner();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            case R.id.watch_webcam: {
                launchWebcam();
                break;
            }
        }
        return super.onOptionsItemSelected(item);
    }

    private void clickListeners(){
        playButton = (Button)findViewById(R.id.PlayButton);
        playButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Log.d("msg123", "hola1");
                Intent intent = new Intent(getApplicationContext(), RadioMediaPlayerService.class);
                intent.putExtra(RadioMediaPlayerService.START_PLAY, true);
                startService(intent);

            }
        });

        stopButton = (Button)findViewById(R.id.StopButton);
        stopButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(),
                        RadioMediaPlayerService.class);
                stopService(intent);
            }
        });

        final View EmailPress = (Button)this.findViewById(R.id.emailBtn);
        EmailPress.setOnClickListener(new OnClickListener() {
            public void onClick(View view){

                Intent emailIntent = new Intent(Intent.ACTION_SEND);
                emailIntent.setType("message/rfc822");
                emailIntent.putExtra(Intent.EXTRA_EMAIL  , new String[]{EMAILADD});
                try {
                    startActivity(Intent.createChooser(emailIntent, "Send email..."));
                } catch (android.content.ActivityNotFoundException ex) {
                    Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
                }

            }
        });

        final View PhonePress = (Button)this.findViewById(R.id.phoneBtn);
        PhonePress.setOnClickListener(new OnClickListener() {
            public void onClick(View view){
                String phoneNum = settings.getPhoneNumber();
                Intent phoneIntent = new Intent(Intent.ACTION_CALL, Uri.parse(phoneNum));
                startActivity (phoneIntent);

            }
        });

        final View WWWPress = (Button)this.findViewById(R.id.websiteBtn);
        WWWPress.setOnClickListener(new OnClickListener() {
            public void onClick(View view){
                Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(settings.getWebsiteURL())); //URL
                startActivity (browserIntent);
            }
        });

        final View TxtPress = (Button)this.findViewById(R.id.txtBtn);
        TxtPress.setOnClickListener(new OnClickListener() {
            public void onClick(View view){
                Intent smsIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("sms:" +settings.getSmsNumber())); smsIntent.putExtra("sms_body", "AIR ");
                startActivity(smsIntent);
            }
        });
    }

    private void adBanner(){
        if ((getResources().getConfiguration().screenLayout &
                Configuration.SCREENLAYOUT_SIZE_MASK) ==
                Configuration.SCREENLAYOUT_SIZE_SMALL) {
            LinearLayout adAreaLl = (LinearLayout)findViewById(R.id.adArea);
            adAreaLl.setVisibility(View.GONE);
        }
        else{
            new DownloadImageTask((ImageView) findViewById(R.id.display_banner))
                    .execute(ADURL);
        }
    }

    public void launchWebcam(){
        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(settings.getRadioWebcamURL()));
        startActivity (browserIntent);
    }

    public void launchTweet(){
        //TODO
    }

    public void lauchRating(){
        //TODO
    }

    private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
        ImageView adImage;
        public DownloadImageTask(ImageView bmImage) {
            this.adImage = bmImage;
        }
        protected Bitmap doInBackground(String... urls) {
            String urldisplay = urls[0];
            Bitmap adBmFa = null;
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                adBmFa = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return adBmFa;
        }
        protected void onPostExecute(Bitmap result) {
            adImage.setImageBitmap(result);
        }
    }

}

A continuación, te dejo un video con la implementación de la App de Radio.

Deja una respuesta