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

Cómo Crear App De Alarma Android Studio

En esta oportunidad vamos a crear una app de alarma para tu Android.

En primer lugar, nos dirigimos al archivo strings.xml, añadimos un texto que será el nombre de nuestra app.

Posteriormente añadimos una lista de nombres de canciones para nuestra app.

<resources>
    <string name="app_name">Alarma</string>
    <string-array name="stepbrothers_array">
        <item>Elige un sonido</item>
        <item>Catalina Wine Mixer</item>
        <item>Inclement Weather</item>
        <item>Lightning Bolt</item>
        <item>Johnny Hopkins</item>
        <item>Butt Buddy</item>
        <item>Robert better not get in my face</item>
    </string-array>
</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 en su modo night y hacemos referencia a los colores que agregamos.

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.Curso6Alarma" 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>

Procedemos de la misma manera para la versión light.

Ahora nos dirigimos al archivo activity_main.xml, como se puede observar esta listo con RelativeLayout.

Colocamos el atributo fondo y espaciado interior.

Creamos un nuevo timepicker con su identificador, ancho, alto y alineación.

Luego creamos un botón para encender la alarma, de igual manera con identificador, ancho, alto, el atributo below para que este debajo del TextView alarm_state que crearemos adelante, colocamos alineación, texto y tamaño de texto.

Ahora creamos un botón para apagar la alarma, con su identificador, ancho, alto, el atributo below para que este debajo del textview alarm_state que crearemos adelante, colocamos alineacion, texto y tamaño de texto.

Posteriormente crearemos el textview alarm_state, con identificador, ancho, alto, con el atributo below posicionamos debajo del timepicker,
alineación horizontal, espaciado interno superior, texto y tamaño de texto.

Luego crearemos un Spinner para escoger los sonidos, con su identificador, ancho, alto, alineación y tamaño de texto.

<?xml version="1.0" encoding="utf-8"?>
<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:background="@drawable/ab_gradient"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingBottom="@dimen/activity_vertical_margin">

    <TimePicker
        android:id="@+id/timePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" />

    <Button
        android:id="@+id/alarm_on"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/alarm_state"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_marginTop="5dp"
        android:text="Iniciar"
        android:textSize="18dp" />

    <Button
        android:id="@+id/alarm_off"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/alarm_state"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="5dp"
        android:text="Detener"
        android:textSize="18dp" />

    <TextView
        android:id="@+id/alarm_state"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/timePicker"
        android:layout_centerHorizontal="true"
        android:paddingTop="10dp"
        android:text="Selecciona una opción"
        android:textSize="25dp" />

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:textSize="18dp" />
</RelativeLayout>

Ahora vamos al archivo MainActivity.java, colocamos los atributos de alarmMmanager, timePicker, textView, context, pendingIntent y sound_select.

Dentro del método oncreate, hacemos referencia a la alarma del sistema operativo, al timepicker que hemos colocado, al textview alarm_state.

Obtenemos la instancia del calendario.

Creamos un intent para dirigir hacia una nueva pantalla llamada alarmreceiver.

Hacemos referencia al spinner, colocamos un adaptador para el spinner, agregamos un recurso para los items que tendra el spinner.

Colocamos el adaptador al Spinner, ahora colocamos un Listener al Spinner.

Hacemos referencia al botón de encendido, colocamos un Listener al botón de encendido, dentro del método onClick, configuramos el calendario con la fecha actual.

Ahora obtenemos la hora y minutos que están seleccionados en el timePicker, convertimos los valores de hora en una cadena.

Luego colocamos condicionales para reiniciar el contador de horas a cero, cuando llegue a 12.

Seguimos colocando otra condición para colocar un cero a la izquierda en caso que sea menor a 10.

Ahora colocamos las horas y minutos dentro del textview alarm_state.

Añadimos datos extra hacia nuestro intent, el estado de alarma encendida y el sonido seleccionado.

Luego enviamos estas configuraciones al alarm_manager y establecer la alarma.

Posteriormente configuramos el botón para apagar alarma, de igual manera, colocamos un listener a alarm_off.

Dentro del método onclick colocamos el mensaje alarma apagada, luego cancelamos el alarm_manager.

Colocamos el estado de alarma apagada y enviamos estas configuraciones.

Ahora sobrescribimos los métodos para controlar el spinner y establecer el sonido que se ha seleccionado.

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.icu.util.Calendar;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

    AlarmManager alarm_manager;
    TimePicker alarm_timepicker;
    TextView alarm_state;
    Context context;
    PendingIntent pending_intent;
    int sound_select;
    Intent my_intent;

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

        alarm_manager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarm_timepicker = (TimePicker) findViewById(R.id.timePicker);
        alarm_state = (TextView) findViewById(R.id.alarm_state);

        final Calendar calendar = Calendar.getInstance();

        my_intent = new Intent(MainActivity.this, AlarmReceiver.class);

        Spinner spinner = (Spinner) findViewById(R.id.spinner);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource
                (this, R.array.stepbrothers_array, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(this);
        Log.d("msg121", "hola0");
        Button alarm_on = (Button) findViewById(R.id.alarm_on);

        alarm_on.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("msg122", "hola0");
                calendar.set(Calendar.HOUR_OF_DAY, alarm_timepicker.getCurrentHour());
                calendar.set(Calendar.MINUTE, alarm_timepicker.getCurrentMinute());

                int hour = alarm_timepicker.getCurrentHour();
                int minute = alarm_timepicker.getCurrentMinute();

                String hour_string = String.valueOf(hour);
                String minute_string = String.valueOf(minute);

                if(hour > 12) hour_string = String.valueOf(hour - 12);
                if(minute < 10) minute_string = "0" + String.valueOf(minute);

                Log.d("msg123", "hola0");

                alarm_state.setText("Alarma establecida en: " + hour_string + ":" + minute_string);

                my_intent.putExtra("extra", "alarma encendida");

                my_intent.putExtra("sound_choice", sound_select);

                Log.d("msg124", "hola0");

                pending_intent = PendingIntent.getBroadcast(MainActivity.this, 0, my_intent, PendingIntent.FLAG_UPDATE_CURRENT);

                alarm_manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pending_intent);
                Log.d("msg119", ""+calendar.getTimeInMillis()+" "+pending_intent);

                sendBroadcast(my_intent);
            }
        });

        Button alarm_off = (Button) findViewById(R.id.alarm_off);
        alarm_off.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                alarm_state.setText("Alarm Apagada!");

                alarm_manager.cancel(pending_intent);

                my_intent.putExtra("extra", "alarma apagada");

                my_intent.putExtra("sound_choice", sound_select);

                sendBroadcast(my_intent);
            }
        });
    }

    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
        sound_select = (int) id;
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {

    }
}

Nos dirigimos a la clase alarmReceiver, en esta clase, haremos que alarmReceiver herede los métodos de BroadCastReceiver para que nuestra app pueda comunicarse con la alarma del sistema operativo.

Dentro del método onreceive recibimos las variables como los mensajes del estado de la alarma, el sonido elegido y comenzamos el servicio de fondo.

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String fetch_string = intent.getExtras().getString("extra");
        int get_sound_choice = intent.getExtras().getInt("sound_choice");
        Intent service_intent = new Intent(context, RingtonePlayingService.class);

        service_intent.putExtra("extra", fetch_string);

        service_intent.putExtra("sound_choice", get_sound_choice);

        Log.d("msg123", "hola1 "+ fetch_string + " "+get_sound_choice);

        context.startService(service_intent);

    }
}

Ahora nos dirigimos a la clase ringtonePlayingService, extendemos el servicio.

Colocammos los atributos de mediaplayer, startid y un atributo para determinar si el servicio esta funcionando.

Implementamos el método onbind del servicio, luego implementamos el método onstartcommand.

Dentro de onstartcommand, recibimos el sonido seleccionado, creaamos una notificación.

Luego creamos un intent para enviar datos sobre el estado de la alarma, ahora colocamos la variable state como distinto de nulo.

Posteriormente creamos un switch para controlar el estado de la alarma, creamos una condición para comenzar a reproducir el sonido.

Iniciamos con un sonido por defecto, luego creamos otras condiciones para reproducir un sonido según el item seleccionado del Spinner.

Finalmente colocamos el caso contrario, en el cual se detendrá el sonido y cambiamos el estado a falso.

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;

import androidx.annotation.Nullable;

import java.util.Random;

public class RingtonePlayingService extends Service {

    MediaPlayer media_song;
    int startId;
    boolean isRunning;

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String state = intent.getExtras().getString("extra");

        Log.d("msg124", "hola2");

        int sound_id = intent.getExtras().getInt("sound_choice");

        NotificationManager notify_manager =
                (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        Intent intent_main_activity = new Intent(this.getApplicationContext(), MainActivity.class);

        PendingIntent pending_intent_main_activity =
                PendingIntent.getActivity(this, 0, intent_main_activity, 0);

        Notification notify_popup =
                new Notification.Builder(this).setContentTitle("An alarm is going off!")
                        .setContentText("Click me!")
                        .setContentIntent(pending_intent_main_activity)
                        .setAutoCancel(true).build();



        assert state != null;
        switch (state) {
            case "alarm on":
                startId = 1;
                break;
            case "alarm off":
                startId = 0;
                Log.e("Start ID is ", state);
                break;
            default:
                startId = 0;
                break;
        }

        Log.d("msg125", "hola3");

        if(!this.isRunning && startId == 1) {
            this.isRunning = true;
            this.startId = 0;

            notify_manager.notify(0, notify_popup);

            media_song = MediaPlayer.create(this, R.raw.kalimba);
            media_song.start();

            if(sound_id == 0) {
                int min = 1, max = 5;
                Random rand = new Random();
                int sound_number = rand.nextInt(max + min);

                if(sound_number == 1) {
                    media_song = MediaPlayer.create(this, R.raw.catalina_wine_mixer);
                    media_song.start();
                } else if(sound_id == 2) {
                    media_song = MediaPlayer.create(this, R.raw.inclement_weather);
                    media_song.start();
                } else if(sound_id == 3) {
                    media_song = MediaPlayer.create(this, R.raw.johnny_hopkins);
                    media_song.start();
                } else if(sound_id == 4) {
                    media_song = MediaPlayer.create(this, R.raw.lightning_bolt);
                    media_song.start();
                } else if(sound_id == 5) {
                    media_song = MediaPlayer.create(this, R.raw.robert_better_not_get_in_my_face);
                    media_song.start();
                } else {
                    media_song = MediaPlayer.create(this, R.raw.butt_buddy);
                    media_song.start();
                }
            } else if(sound_id == 1) {
                media_song = MediaPlayer.create(this, R.raw.catalina_wine_mixer);
                media_song.start();
            } else if(sound_id == 2) {
                media_song = MediaPlayer.create(this, R.raw.inclement_weather);
                media_song.start();
            } else if(sound_id == 3) {
                media_song = MediaPlayer.create(this, R.raw.johnny_hopkins);
                media_song.start();
            } else if(sound_id == 4) {
                media_song = MediaPlayer.create(this, R.raw.lightning_bolt);
                media_song.start();
            } else if(sound_id == 5) {
                media_song = MediaPlayer.create(this, R.raw.robert_better_not_get_in_my_face);
                media_song.start();
            } else {
                media_song = MediaPlayer.create(this, R.raw.butt_buddy);
                media_song.start();
            }


        } else if(this.isRunning && startId == 0) {
            media_song.stop();
            media_song.reset();

            this.isRunning = false;
            this.startId = 0;

        } else if(!this.isRunning && startId == 0) {
            this.isRunning = false;
            startId = 0;

        } else if(this.isRunning && startId == 1) {
            this.isRunning = true;
            this.startId = 1;

        } else {
        }

        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        this.isRunning = false;
    }

}

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

Deja una respuesta