DevCorner: gestiamo il LED di notifica

Giuseppe Tripodi
Giuseppe Tripodi Tech Master
DevCorner: gestiamo il LED di notifica

Abbiamo già visto in un passato tutorial come utilizzare le notifiche del nostro Android: ma se oltre al messaggio nella tendina apposita, volessimo associare al nostro messaggio la luce lampeggiante del LED di notifica che tutti noi amiamo? Vediamo con questo breve tutorial come fare!

Per prima cosa, c'è da fare una precisazione: anche se il vostro smartphone ha il LED, non è detto che sia di tipo RGB, quindi il supporto ai diversi colori potrebbe non funzionare. Se, invece, il vostro dispositivo ne è sprovvisto, è scontato dire che questa guida sarà "inutile".

Imposteremo la nostra interfaccia con un menu a tendina (Spinner) con la scelta di tre possibile variazioni cromatiche (Blu, Rosso e Verde) e due bottoni per avviare e stoppare il LED. Da notare che su alcuni device (la maggior parte, a dire il vero), il lampeggio non inizierà finché lo schermo è attivo: abbiamo quindi aggiunto anche un alert che ci ricorda di bloccare il telefono con l'apposito tasto di accensione.

Per prima cosa, definiamo un array di stringhe con i colori scelti all'interno del file Strings.xml (in /res/values):



	Colori
    
    NotificheLED
    Settings
      
        Blu
        Rosso
        Verde
    

A questo punto, possiamo scrivere comodamente la nostra interfaccia: 



    

    

    

Fatto questo, passando al codice java, la prima cosa da fare è ovviamente assegnare degli OnClickListener ai nostri bottoni: per far questo, come sempre, definiamo bene l'OnCreate dove rintracciamo i tasti e lo spinner tramite il loro ID. In questo metodo, inoltre, istanziamo un oggetto di tipo NotificationManager per la gestione delle notifiche.

public class MainActivity extends Activity implements OnClickListener {
Button led;
NotificationManager nm;
Button stop;
Spinner listaColori;

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listaColori = (Spinner) findViewById(R.id.listaColori);
		nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
		led = (Button) findViewById(R.id.led);
		stop = (Button) findViewById(R.id.stop);
		stop.setOnClickListener(this);
		led.setOnClickListener(this);
	}

A questo punto, scriviamo i due semplici metodi per l'accensione e lo spegnimento del LED: quel che facciamo è creare un oggetto di tipo Notification a cui assegniamo, tra le altre cose, quanto tempo il LED deve stare acceso e quanto spento, il tutto espresso in millisecondi.

Per quanto riguarda il colore, è possibile esprimerlo tramite codice RGB o utilizzando le variabili Color di Android (come abbiamo fatto noi): in ogni caso, lo passiamo tramite la variabile int codiceColore.
In entrambi i casi la notifica viene gestita dal Notification Manager:

private void AccendiLed(int codiceColore) {
		// Toast.makeText(getApplicationContext(), "Yup",
		// Toast.LENGTH_LONG).show();

		Notification notif = new Notification();
		notif.flags = Notification.FLAG_SHOW_LIGHTS;
		notif.ledARGB = codiceColore;
		notif.ledOnMS = 100;
		notif.ledOffMS = 100;
		nm.notify(0, notif);
	}

	public void StopLed() {
		if (nm != null) {
			nm.cancel(0);
		}
	}

Scriviamo adesso un breve metodo che controlla il colore scelto dallo Spinner e ritorna la variabile Color corrispondente. Ricordiamo che si tratta di un valore numerico (int) perché la sintassi Color.BLUE (ad esempio) non è nient'altro che una semplificazione per esprimere il valore RGB del colore corrispondente.

public int assegnaColore() {
		int codiceColore = Color.BLUE;
		String colore = String.valueOf(listaColori.getSelectedItem());
		if (colore.equals("Blu")) {
			codiceColore = Color.BLUE;
		}
		if (colore.equals("Rosso")) {
			codiceColore = Color.RED;
		}
		if (colore.equals("Verde")) {
			codiceColore = Color.GREEN;
		}
		return codiceColore;
	}

Non ci rimane che gestire il click sui due bottoni, richiamando i metodi corrispondenti: abbiamo inserito, inoltre, un alert per ricordare di bloccare lo schermo per visualizzare il LED.

@Override
	public void onClick(View view) {
		// TODO Auto-generated method stub
		if (view == led) {
			int codiceColore = assegnaColore();

			AccendiLed(codiceColore);
			AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
					this);
			alertDialogBuilder.setTitle("Spegni lo schermo");
			// inseriamo qui il titolo della Dialog Box
			alertDialogBuilder
					.setMessage(
							"Blocca lo schermo per vedere lampeggiare il LED")
					// inseriamo qui la domanda da porre all'utente
					.setCancelable(false)

					.setPositiveButton("ok",
							new DialogInterface.OnClickListener() {
								// scriviamo qui il testo del bottone per
								// annullare e l'azione da eseguire
								public void onClick(DialogInterface dialog,
										int id) {
									dialog.cancel();
								}
							});
			AlertDialog alertDialog = alertDialogBuilder.create();
			alertDialog.show();
			// con questi due metodi viene effettivamente generato l'alert e
			// successivamente mostrato
		}

		if (view == stop)
			StopLed();
	}

Il risultato finale della nostra Activity, quindi, sarà qualcosa del genere:

 package com.peppeuz.notificheled;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Spinner;

public class MainActivity extends Activity implements OnClickListener {
	Button led;
	NotificationManager nm;
	Button stop;
	Spinner listaColori;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listaColori = (Spinner) findViewById(R.id.listaColori);
		nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
		led = (Button) findViewById(R.id.led);
		stop = (Button) findViewById(R.id.stop);
		stop.setOnClickListener(this);
		led.setOnClickListener(this);

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	private void AccendiLed(int codiceColore) {
		// Toast.makeText(getApplicationContext(), "Yup",
		// Toast.LENGTH_LONG).show();

		Notification notif = new Notification();
		notif.flags = Notification.FLAG_SHOW_LIGHTS;
		notif.ledARGB = codiceColore;
		notif.ledOnMS = 100;
		notif.ledOffMS = 100;
		nm.notify(0, notif);
	}

	public void StopLed() {
		if (nm != null) {
			nm.cancel(0);
		}
	}

	public int assegnaColore() {
		int codiceColore = Color.BLUE;
		String colore = String.valueOf(listaColori.getSelectedItem());
		if (colore.equals("Blu")) {
			codiceColore = Color.BLUE;
		}
		if (colore.equals("Rosso")) {
			codiceColore = Color.RED;
		}
		if (colore.equals("Verde")) {
			codiceColore = Color.GREEN;
		}
		return codiceColore;
	}

	@Override
	public void onClick(View view) {
		// TODO Auto-generated method stub
		if (view == led) {
			int codiceColore = assegnaColore();

			AccendiLed(codiceColore);
			AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
					this);
			alertDialogBuilder.setTitle("Spegni lo schermo");
			// inseriamo qui il titolo della Dialog Box
			alertDialogBuilder
					.setMessage(
							"Blocca lo schermo per vedere lampeggiare il LED")
					// inseriamo qui la domanda da porre all'utente
					.setCancelable(false)

					.setPositiveButton("ok",
							new DialogInterface.OnClickListener() {
								// scriviamo qui il testo del bottone per
								// annullare e l'azione da eseguire
								public void onClick(DialogInterface dialog,
										int id) {
									dialog.cancel();
								}
							});
			AlertDialog alertDialog = alertDialogBuilder.create();
			alertDialog.show();
			// con questi due metodi viene effettivamente generato l'alert e
			// successivamente mostrato
		}

		if (view == stop)
			StopLed();
	}

}

Prima di salutarvi, specifichiamo che la guida dovrebbe essere valida per gestire i LED della maggior parte degli smartphone: l'abbiamo testata con successo su vari membri della famiglia Galaxy S, HTC One X, Nexus 4, e Galaxy Nexus.

Paradossalmente, piccoli problemi (il LED parte un po' in ritardo) sono riscontrati su due Nexus con ROM stock; nessun contrattempo, invece, con firmware modificati.

Anche per questa settimana, l'appuntamento con DevCorner è terminato: adesso che sapete come gestire anche il LED, potete realizzare delle notifiche più accattivanti, ma se doveste incappare in problemi con lo sviluppo, veniteci pure a trovare sul nostro forum!

Via: DevCorner