Per emettere suoni in un programma Android la prima cosa da fare e' trovare un file con il suono desiderato.
Una ottima fonte di suoni gratuiti e' Freesound.org
Una volta scaricato il file wav si clicca sulla cartella /res del progetto e si crea un nuovo folder denominato raw (si avra' quindi /res/raw) dove si copia il file del suono
a questo punto si puo' inserire questa funzione (copiata da qui) dove il suono in questo caso e' chiamato beep (da notare che si omette l'estensione)
-------------------------------------------------------------
private void playAlarm() {
MediaPlayer mp = MediaPlayer.create(this,R.raw.beep);
mp.start();
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
martedì 19 marzo 2013
giovedì 14 marzo 2013
martedì 12 marzo 2013
Esempio di utilizzo di Itext in Java
Presento adesso un esempio reale dell'utilizzo della libreria IText per la creazione di pettorali per una corsa podistica.
La caratteristica dei pettorali era quella di dover contenere, oltre al numero, anche il relativo QrCode. Il pettorale e' quindi determinato dalla sovrapposizione di una immagine di base con i logo, il QrCode ed il numero. Il tutto e' gia' formattato per andare direttamente in tipografia (il foglio in formato Super A3 comprende 4 numeri che saranno successivamente tagliati)
Il codice per la generazione dei Pdf e' il seguente. Si deve precisare che le immagini dei QrCode erano gia' state create con il programma presentato in un precedente post e viene usato un font speciale (CITYB.ttf)
----------------------------------------------------------------------
package pettorale;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
/**
*
* @author l.innocenti
*/
public class Pettorale {
private static PdfWriter writer;
public static void main(String[] args) throws BadElementException, MalformedURLException, IOException {
//String numero = args[0];
String numero = "175";
int inizio = Integer.parseInt(numero);
BufferedOutputStream out = null;
try {
out = new BufferedOutputStream (new FileOutputStream (new File ("Pettorale_"+numero+"_"+Integer.toString(inizio+3) +".pdf")));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//Definisce le dimensioni del foglio come SuperA3 (45x32 cm)
//Itext usa una unita' di misura in punti tipografici
//1 cm = 28.35 unita' per cui le dimesioni del foglio sono
//45 cm = 1285 u
//32 cm = 907 u
Rectangle pagina = new Rectangle(1275, 907);
Document doc = new Document (pagina,0,0,0,0);
try
{
writer = PdfWriter.getInstance (doc, out);
doc.open ();
PdfContentByte canvas = writer.getDirectContent();
//inserisce lo sfondo
Image pettorale = Image.getInstance("pettorale/vuoto.png");
pettorale.setAbsolutePosition(0f, 0f);
pettorale.scalePercent(24.5f);
doc.add(pettorale);
//inserisce il QrCode del numero del pettorale
Image qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio) +".png");
qrcode.setAbsolutePosition(475f, 620f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//2° numero
qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+1) +".png");
qrcode.setAbsolutePosition(1125f, 620f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//3° numero
qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+2) +".png");
qrcode.setAbsolutePosition(475f, 170f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//4° numero
qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+3) +".png");
qrcode.setAbsolutePosition(1125f, 170f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//scrive il numero del pettorale alla giusta posizione
//1° numero
if (inizio <10) {
absText(Integer.toString(inizio),270,625);
}
if ((inizio >=10) && (inizio <= 99)) {
absText(Integer.toString(inizio),235,625);
}
if ((inizio >=100) && (inizio <= 999)) {
absText(Integer.toString(inizio),150,625);
}
//2°numero
if (inizio+1 <10) {
absText(Integer.toString(inizio+1),920,625);
}
if ((inizio+1 >=10) && (inizio+1 <= 99)) {
absText(Integer.toString(inizio+1),885,625);
}
if ((inizio+1 >=100) && (inizio+1 <= 999)) {
absText(Integer.toString(inizio+1),790,625);
}
//3°numero
if (inizio+2 <10) {
absText(Integer.toString(inizio+2),270,165);
}
if ((inizio+2 >=10) && (inizio+2 <= 99)) {
absText(Integer.toString(inizio+2),235,165);
}
if ((inizio+2 >=100) && (inizio+2 <= 999)) {
absText(Integer.toString(inizio+2),150,165);
}
//4°numero
if (inizio+3 <10) {
absText(Integer.toString(inizio+3),920,165);
}
if ((inizio+3 >=10) && (inizio+3 <= 99)) {
absText(Integer.toString(inizio+3),885,165);
}
if ((inizio+3 >=100) && (inizio+3 <= 999)) {
absText(Integer.toString(inizio+3),790,165);
}
}
catch (DocumentException e)
{
System.out.println ("Fatal PDF error: " + e);
}
doc.close ();
}
private static void absText(String text, int x, int y) {
try {
PdfContentByte cb = writer.getDirectContent();
BaseFont slam = BaseFont.createFont("CITYB.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
cb.saveState();
cb.beginText();
cb.moveText(x, y);
cb.setFontAndSize(slam, 200);
cb.showText(text);
cb.endText();
cb.restoreState();
} catch (DocumentException | IOException e) {
}
}
}
La caratteristica dei pettorali era quella di dover contenere, oltre al numero, anche il relativo QrCode. Il pettorale e' quindi determinato dalla sovrapposizione di una immagine di base con i logo, il QrCode ed il numero. Il tutto e' gia' formattato per andare direttamente in tipografia (il foglio in formato Super A3 comprende 4 numeri che saranno successivamente tagliati)
Immagine di fondo |
QrCode |
Il risultato finale |
Il codice per la generazione dei Pdf e' il seguente. Si deve precisare che le immagini dei QrCode erano gia' state create con il programma presentato in un precedente post e viene usato un font speciale (CITYB.ttf)
----------------------------------------------------------------------
package pettorale;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
/**
*
* @author l.innocenti
*/
public class Pettorale {
private static PdfWriter writer;
public static void main(String[] args) throws BadElementException, MalformedURLException, IOException {
//String numero = args[0];
String numero = "175";
int inizio = Integer.parseInt(numero);
BufferedOutputStream out = null;
try {
out = new BufferedOutputStream (new FileOutputStream (new File ("Pettorale_"+numero+"_"+Integer.toString(inizio+3) +".pdf")));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//Definisce le dimensioni del foglio come SuperA3 (45x32 cm)
//Itext usa una unita' di misura in punti tipografici
//1 cm = 28.35 unita' per cui le dimesioni del foglio sono
//45 cm = 1285 u
//32 cm = 907 u
Rectangle pagina = new Rectangle(1275, 907);
Document doc = new Document (pagina,0,0,0,0);
try
{
writer = PdfWriter.getInstance (doc, out);
doc.open ();
PdfContentByte canvas = writer.getDirectContent();
//inserisce lo sfondo
Image pettorale = Image.getInstance("pettorale/vuoto.png");
pettorale.setAbsolutePosition(0f, 0f);
pettorale.scalePercent(24.5f);
doc.add(pettorale);
//inserisce il QrCode del numero del pettorale
Image qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio) +".png");
qrcode.setAbsolutePosition(475f, 620f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//2° numero
qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+1) +".png");
qrcode.setAbsolutePosition(1125f, 620f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//3° numero
qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+2) +".png");
qrcode.setAbsolutePosition(475f, 170f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//4° numero
qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+3) +".png");
qrcode.setAbsolutePosition(1125f, 170f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//scrive il numero del pettorale alla giusta posizione
//1° numero
if (inizio <10) {
absText(Integer.toString(inizio),270,625);
}
if ((inizio >=10) && (inizio <= 99)) {
absText(Integer.toString(inizio),235,625);
}
if ((inizio >=100) && (inizio <= 999)) {
absText(Integer.toString(inizio),150,625);
}
//2°numero
if (inizio+1 <10) {
absText(Integer.toString(inizio+1),920,625);
}
if ((inizio+1 >=10) && (inizio+1 <= 99)) {
absText(Integer.toString(inizio+1),885,625);
}
if ((inizio+1 >=100) && (inizio+1 <= 999)) {
absText(Integer.toString(inizio+1),790,625);
}
//3°numero
if (inizio+2 <10) {
absText(Integer.toString(inizio+2),270,165);
}
if ((inizio+2 >=10) && (inizio+2 <= 99)) {
absText(Integer.toString(inizio+2),235,165);
}
if ((inizio+2 >=100) && (inizio+2 <= 999)) {
absText(Integer.toString(inizio+2),150,165);
}
//4°numero
if (inizio+3 <10) {
absText(Integer.toString(inizio+3),920,165);
}
if ((inizio+3 >=10) && (inizio+3 <= 99)) {
absText(Integer.toString(inizio+3),885,165);
}
if ((inizio+3 >=100) && (inizio+3 <= 999)) {
absText(Integer.toString(inizio+3),790,165);
}
}
catch (DocumentException e)
{
System.out.println ("Fatal PDF error: " + e);
}
doc.close ();
}
private static void absText(String text, int x, int y) {
try {
PdfContentByte cb = writer.getDirectContent();
BaseFont slam = BaseFont.createFont("CITYB.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
cb.saveState();
cb.beginText();
cb.moveText(x, y);
cb.setFontAndSize(slam, 200);
cb.showText(text);
cb.endText();
cb.restoreState();
} catch (DocumentException | IOException e) {
}
}
}
----------------------------------------------------------------------
Aggiornamento software Lumix DMC-LS5
Non pensavo che mi sarei mai ritrovato ad aggiornare il firmware ad una macchina fotografica (sarebbe curioso farlo con una Voigtlander a rullino) ma e' accaduto con la Lumix DMC-LS5
In sostanza si deve scaricare il file di aggiornamento PDCE570a.elf ed inserirlo nella radice della scheda SD. Si accende quindi la macchina premendo contemporaneamente il tasto di scatto ed il tasto di accensione.
Dopo qualche secondo la macchina si spenge in automatico ed al nuovo riavvio si vede l'avvenuto aggiornamento
La prossima volta voglio i tasti CTRL+ALT+DEL insieme al pulsante di scatto
In sostanza si deve scaricare il file di aggiornamento PDCE570a.elf ed inserirlo nella radice della scheda SD. Si accende quindi la macchina premendo contemporaneamente il tasto di scatto ed il tasto di accensione.
Dopo qualche secondo la macchina si spenge in automatico ed al nuovo riavvio si vede l'avvenuto aggiornamento
La prossima volta voglio i tasti CTRL+ALT+DEL insieme al pulsante di scatto
Falsi (Fake) Casio F-91W e G-9200-Riseman
Recentemente mi si e' rotto il cinturino del mio Casio F-91W (cosa abbastanza per questo orologio che e' sostanzialmente indistruttibile) e cercando mi sono accorto che i cinturini vanno dai 5 ai 10 euro mentre l'orologio nuovo completo viene venduto dai 17 ai 25 euro....insomma non conviene sostituito il pezzo
Andando a giro su Alibaba ho trovato un modello di Casio F-91W a 3 dollari (spedizione compresa)...un affare. Una volta arrivato l'oggetto mi sono reso conto che non si tratta di un vero Casio ma di una replica, seppur ben fatta. Esternamente le differenze sono solo sul fondello (la copia indica Made in China mentre l'originale Made in Thailandia) e sulla luce dell'illuminazione (sulla replica e' blu)
Con lo stesso ordine ho preso anche un Casio G9200 a meno di 9 euro per una eventuale sostituzione del mio Casio W-753 (anche questo con problemi di cinturino). Francamente non sapevo che questo e' il modello di punta della serie G-Shock con prezzi di oltre 150 euro e la cosa mi doveva insospettire...io cercavo solo un orologio con un altimetro integrato.
Andando a giro su Alibaba ho trovato un modello di Casio F-91W a 3 dollari (spedizione compresa)...un affare. Una volta arrivato l'oggetto mi sono reso conto che non si tratta di un vero Casio ma di una replica, seppur ben fatta. Esternamente le differenze sono solo sul fondello (la copia indica Made in China mentre l'originale Made in Thailandia) e sulla luce dell'illuminazione (sulla replica e' blu)
Originale a sinistra |
Originale a sinistra |
Le funzioni dell'orologio sono le medesime nella copia e nell'originale
Inutile dire che anche questo e' una copia dell'oroginale ma le funzioni sono purtroppo differenti: non e' presente l'altimetro/barometro/termometro, non ha la calibrazione via radio e non possiede la cella solare
Il metodo piu' semplice per distinguere la copia dall'originale e' la presenza di una G nel cerchio rosso (che e' presente solo nella copia)
Insomma. ho speso 10 euro per due copie ma volendo in fondo avere due cinturini direi che la spesa e' stata congrua. In piu' ho imparato una lezione per il futuro
Il metodo piu' semplice per distinguere la copia dall'originale e' la presenza di una G nel cerchio rosso (che e' presente solo nella copia)
Insomma. ho speso 10 euro per due copie ma volendo in fondo avere due cinturini direi che la spesa e' stata congrua. In piu' ho imparato una lezione per il futuro
Selezionare scheda di rete per Internet su LInux
In questo post verra' descritto come gestire una scheda di rete wireless USB in Linux.
Nel caso, come il mio, il portatile non possegga un pulsante fisico per disattivare la scheda di rete integrata non e' proprio banale utilizzare la scheda di rete supplementare in quanto il sistema operativo riconosce per prima la scheda integrata e la usera' come default
Una soluzione semplice potrebbe essere quella di disattivare una interfaccia di rete con
ifconfig wlan0 down
in questo modo si spenge la scheda integrata (wlan0) ma ci si accorge subito che non e' la soluzione finale in quanto non si riesce a navigare su internet. In pratica si riesce ad utilizzare tutta la rete interna e si riesce a pingare il router ma nessun pacchetto viene instradato all'esterno
E' chiaro che deve essere configurata la tabella di routing
Se si digita route con le due schede attive si ottiene
---------------------------------------------------
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.0.1 0.0.0.0 UG 0 0 0 wlan0
link-local * 255.255.0.0 U 1000 0 0 wlan0
192.168.0.0 * 255.255.255.0 U 0 0 0 wlan0
disattivando la scheda integrata wlan0
---------------------------------------------------
si vede chiaramente la perdita dell'interfaccia di default
Supponendo che l'indirizzo del router di 192.168.168.0.1 si puo' scrivere
route add default gw 192.168.0.1 wlan1
a questo punto la tabella di routing viene cosi' modificata
---------------------------------------------------
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.0.1 0.0.0.0 UG 0 0 0 wlan1
link-local * 255.255.0.0 U 1000 0 0 wlan1
192.168.0.0 192.168.0.1 255.255.255.0 UG 0 0 0 wlan1
192.168.0.0 * 255.255.255.0 U 0 0 0 wlan1
Nel caso, come il mio, il portatile non possegga un pulsante fisico per disattivare la scheda di rete integrata non e' proprio banale utilizzare la scheda di rete supplementare in quanto il sistema operativo riconosce per prima la scheda integrata e la usera' come default
Una soluzione semplice potrebbe essere quella di disattivare una interfaccia di rete con
ifconfig wlan0 down
in questo modo si spenge la scheda integrata (wlan0) ma ci si accorge subito che non e' la soluzione finale in quanto non si riesce a navigare su internet. In pratica si riesce ad utilizzare tutta la rete interna e si riesce a pingare il router ma nessun pacchetto viene instradato all'esterno
E' chiaro che deve essere configurata la tabella di routing
Se si digita route con le due schede attive si ottiene
---------------------------------------------------
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.0.1 0.0.0.0 UG 0 0 0 wlan0
link-local * 255.255.0.0 U 1000 0 0 wlan0
192.168.0.0 * 255.255.255.0 U 0 0 0 wlan0
---------------------------------------------------
disattivando la scheda integrata wlan0
---------------------------------------------------
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
link-local * 255.255.0.0 U 1000 0 0 wlan1
192.168.0.0 * 255.255.255.0 U 0 0 0 wlan1
si vede chiaramente la perdita dell'interfaccia di default
Supponendo che l'indirizzo del router di 192.168.168.0.1 si puo' scrivere
route add default gw 192.168.0.1 wlan1
a questo punto la tabella di routing viene cosi' modificata
---------------------------------------------------
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.0.1 0.0.0.0 UG 0 0 0 wlan1
link-local * 255.255.0.0 U 1000 0 0 wlan1
192.168.0.0 192.168.0.1 255.255.255.0 UG 0 0 0 wlan1
192.168.0.0 * 255.255.255.0 U 0 0 0 wlan1
---------------------------------------------------
e si riesce a navigare in Internet
In conclusione la sequenza di comandi per utilizzare a pieno la scheda Usb e'
ifconfig wlan0 down
route add default gw 192.168.0.1 wlan1
e si riesce a navigare in Internet
In conclusione la sequenza di comandi per utilizzare a pieno la scheda Usb e'
ifconfig wlan0 down
route add default gw 192.168.0.1 wlan1
Errore Resource out of sync in Eclipse
Nel momento di esportare come file zip (Export to archive file) un progetto Android da Eclipse mi e' stato notificato l'errore di "Resource out of sync" su un file di cache del progetto.
La soluzione al problema risiede semplicemente nell'effettuare un Refresh del progetto
La soluzione al problema risiede semplicemente nell'effettuare un Refresh del progetto
Iscriviti a:
Post (Atom)
Debugger integrato ESP32S3
Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede nell'ID USB della porta Jtag. Nel modulo...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...