Uno dei problemi di Android e' che, al contrario di IOs, puo' essere eseguito da una molteplicita' di hardware con caratteristiche differenti in particolar modo per quanto riguarda la risoluzione dello schermo.
Per gestire l'interfaccia visuale e' quindi necessario conoscere le dimensioni dello schermo che sono riportate in
-------------------------------------------------------------------
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
--------------------------------------------------------------------
giovedì 23 febbraio 2012
Un programma, due Activity
Il concetto di Activity in Android e' piu' o meno quello di Form in Visual Basic ovvero un gestore di una finestra legata ad un ben preciso compito. Per creare piu' finestre all'interno della stessa attivita' si devono preparare diversi file di layout (nell'esempio sono grid1.xml e main.xml)
Dopo cio' si deve modificare il file Manifest per includere oltre alla schermata principale (main) anche la sottoschermata grid1.
------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.geo.munsell"
android:versionCode="2"
android:versionName="0.99" android:installLocation="preferExternal">
<uses-sdk android:minSdkVersion="8" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name" >
<activity
android:name=".MunsellActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".grid1" android:label="@string/app_name"></activity>
</application>
</manifest>
------------------------------------------------------------
da main per aprire la schermata grid1 si esegue la chiamata
------------------------------------------------------------
Intent myIntent = new Intent(MunsellActivity.this, grid1.class);
startActivityForResult(myIntent, 0);
------------------------------------------------------------
Dove MunsellActivity e' l'Activity di main mentre grid1 e' la classe di grid1
Dopo cio' si deve modificare il file Manifest per includere oltre alla schermata principale (main) anche la sottoschermata grid1.
------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.geo.munsell"
android:versionCode="2"
android:versionName="0.99" android:installLocation="preferExternal">
<uses-sdk android:minSdkVersion="8" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name" >
<activity
android:name=".MunsellActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".grid1" android:label="@string/app_name"></activity>
</application>
</manifest>
------------------------------------------------------------
da main per aprire la schermata grid1 si esegue la chiamata
------------------------------------------------------------
Intent myIntent = new Intent(MunsellActivity.this, grid1.class);
startActivityForResult(myIntent, 0);
------------------------------------------------------------
Dove MunsellActivity e' l'Activity di main mentre grid1 e' la classe di grid1
Soil Color Chart pubblicata su Android Market
Il programma Soil Color Chart e' stato sviluppato come ausilio per il geologo rilevatore per classificare il colore di un suolo senza la necessita' di portarsi in campagna il libro dei colori di riferimento.
Sono disponibili 115 colori con relativi codici definiti come rappresentativi di tutte le possibili combinazione di colore di rocce e suoli.
All'avvio il programma mostra una galleria di colori con sottostante codice. Si puo' navigare la galleria sia facendo scivolare a destra e sinistra il dito sui rettangoli di colore sia usando la barra in basso allo schermo.
Altrimenti e' possibile avere una differente visione usando l'Option Menu e selezionando la modalita' Grid View
In questo modo si ha una comparazione piu' immediata delle differenze cromatiche
cliccando su un colore si ha il relativo codice e nome
Per tornare alla finestra precedente e' sufficiente cliccare sul menu Escape
Sono disponibili 115 colori con relativi codici definiti come rappresentativi di tutte le possibili combinazione di colore di rocce e suoli.
All'avvio il programma mostra una galleria di colori con sottostante codice. Si puo' navigare la galleria sia facendo scivolare a destra e sinistra il dito sui rettangoli di colore sia usando la barra in basso allo schermo.
Altrimenti e' possibile avere una differente visione usando l'Option Menu e selezionando la modalita' Grid View
In questo modo si ha una comparazione piu' immediata delle differenze cromatiche
cliccando su un colore si ha il relativo codice e nome
Per tornare alla finestra precedente e' sufficiente cliccare sul menu Escape
mercoledì 22 febbraio 2012
Passare variabili globali
Passare il valore di una variabile tra differenti classi non e' esattamente una operazione banale in quanto ci si deve affidare ad una apposita classe. Nella classe devono essere contenute le variabili che si desiderano essere globali ed i metodi per settare e richiamare il valore della variabile
-------------------------------------------------------------------------
class MyApp extends Application {
int width;
int height;
public int getwidth(){
return width;
}
public void setwidth(int s){
width = s;
}
public int getheight(){
return height;
}
public void setheight(int s){
height = s;
}
private int myVar = 0;
private static MyApp instance;
static {
instance = new MyApp();
}
private MyApp() {
}
public static MyApp getInstance() {
return MyApp.instance;
}
}
-------------------------------------------------------------------------
per settare il valore delle variabili si procede cosi'
-------------------------------------------------------------------------
MyApp.getInstance().setheight(height);
MyApp.getInstance().setwidth(width);
-------------------------------------------------------------------------
mentre per richiamare il valore...
-------------------------------------------------------------------------
int w = (int) (MyApp.getInstance().getwidth()*0.9);
int h = (int) ((int) (MyApp.getInstance().getheight())*0.7);
-------------------------------------------------------------------------
-------------------------------------------------------------------------
class MyApp extends Application {
int width;
int height;
public int getwidth(){
return width;
}
public void setwidth(int s){
width = s;
}
public int getheight(){
return height;
}
public void setheight(int s){
height = s;
}
private int myVar = 0;
private static MyApp instance;
static {
instance = new MyApp();
}
private MyApp() {
}
public static MyApp getInstance() {
return MyApp.instance;
}
}
-------------------------------------------------------------------------
per settare il valore delle variabili si procede cosi'
-------------------------------------------------------------------------
MyApp.getInstance().setheight(height);
MyApp.getInstance().setwidth(width);
-------------------------------------------------------------------------
mentre per richiamare il valore...
-------------------------------------------------------------------------
int w = (int) (MyApp.getInstance().getwidth()*0.9);
int h = (int) ((int) (MyApp.getInstance().getheight())*0.7);
-------------------------------------------------------------------------
martedì 21 febbraio 2012
Android Screenshot
per salvare la schermata di un programma qualsiasi ed al di fuori di Eclipse si puo' usare nella directory tools dell'SDK il comando DDMS,selezionare il device nella finestra Name e poi scegliere il menu Device/Screen Capture o piu' semplicemente premendo CTRL-S
Reverse USB Tethering
Detto in italiano, come sfruttare la connessione Internet del PC per navigare con il telefono Android usando il cavo dati USB
Per prima cosa si deve mettere il telefono in modalita' Aereo e poi come root sulla Linux Box lanciare il seguente script (dove 192.168.1.7 e' l'IP del computer che deve essere modificato secondo le necessita')
--------------------------------------------------------------------------
# Linux <-> Android Reverse Tethering Script
# This script tether the internet from your PC *to* the phone
# Some apps will not recognize the connection
# See http://ajasmin.wordpress.com/2011/07/24/android-usb-tethering-with-a-linux-pc/
# Path to ADB
export ADB=/home/luca/android_sdk/platform-tools/adb
if [ $USER != "root" ]; then
echo "Please run this script as root"
exit
fi
echo "Enabling NAT on `hostname`..."
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -F
iptables -t nat -A POSTROUTING -j MASQUERADE
echo "Connecting to the phone via 'adb ppp'..."
$ADB ppp "shell:pppd nodetach noauth noipdefault defaultroute /dev/tty" nodetach noauth noipdefault notty 192.168.1.7:10.0.0.2
echo "Done."
Per prima cosa si deve mettere il telefono in modalita' Aereo e poi come root sulla Linux Box lanciare il seguente script (dove 192.168.1.7 e' l'IP del computer che deve essere modificato secondo le necessita')
--------------------------------------------------------------------------
# Linux <-> Android Reverse Tethering Script
# This script tether the internet from your PC *to* the phone
# Some apps will not recognize the connection
# See http://ajasmin.wordpress.com/2011/07/24/android-usb-tethering-with-a-linux-pc/
# Path to ADB
export ADB=/home/luca/android_sdk/platform-tools/adb
if [ $USER != "root" ]; then
echo "Please run this script as root"
exit
fi
echo "Enabling NAT on `hostname`..."
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -F
iptables -t nat -A POSTROUTING -j MASQUERADE
echo "Connecting to the phone via 'adb ppp'..."
$ADB ppp "shell:pppd nodetach noauth noipdefault defaultroute /dev/tty" nodetach noauth noipdefault notty 192.168.1.7:10.0.0.2
echo "Done."
--------------------------------------------------------------------------
successivamente si lancia da utente normale il comando adb shell e si digita
--------------------------------------------------------------------------
sh-3.2# setprop net.dns1 151.99.125.2
--------------------------------------------------------------------------------------------
dove 151.99.125.2 e' il DNS di riferimento
lunedì 20 febbraio 2012
Centra TextView su un layout
Centrare una TextView rispetto al Layout non e' banale
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
Nomi delle risorse drawable
Le convenzioni dei nomi delle risorse in Android sono curiose.
I file grafici vengono indicati senza l'estensione (per esempio R.drawable.icon puo' fare riferimento sia ad una jpg che ad una png) ma e' obbligatorio che il nome inizia per una lettera minuscola e che non vi siano caratteri speciali...di fatto il nome delle risorse grafiche deve essere del tipo [a-z][0-9]
I file grafici vengono indicati senza l'estensione (per esempio R.drawable.icon puo' fare riferimento sia ad una jpg che ad una png) ma e' obbligatorio che il nome inizia per una lettera minuscola e che non vi siano caratteri speciali...di fatto il nome delle risorse grafiche deve essere del tipo [a-z][0-9]
Terminare applicazione in Android
Il ciclo di vita di una applicazione Android non e' uguale a quella delle applicazioni Desktop in quanto e' il sistema operativo, in relazione al carico di lavoro ed alla gestione della memoria, che si occupa di come allocare la memoria e quando effettivamente chiudere una applicazione.
Di fatto ogni applicazione si comporta con un utente Linux differente con un proprio ID e con i propri permessi, ogni applicazione viene eseguita all'interno di una propria macchina virtuale con completa separazione rispetto alle altre applicazioni in esecuzione
Detto cio' per far scomparire una Activity dallo schermo e' sufficiente chiamare il comando
finish()
Di fatto ogni applicazione si comporta con un utente Linux differente con un proprio ID e con i propri permessi, ogni applicazione viene eseguita all'interno di una propria macchina virtuale con completa separazione rispetto alle altre applicazioni in esecuzione
Detto cio' per far scomparire una Activity dallo schermo e' sufficiente chiamare il comando
finish()
domenica 19 febbraio 2012
Strip HTML tags in Android
Per rimuovere i tag HTML da una stringa in Android e' sufficiente il comando
String stringa = android.text.Html.fromHtml(stringa_html).toString();
String stringa = android.text.Html.fromHtml(stringa_html).toString();
venerdì 17 febbraio 2012
Screencast con RecordMyDesktop
Un utile programma su Linux per realizzare degli Screencast ovvero dei video del desktop con un commento audio risulta essere RecordMyDesktop.
Per prima si deve selezionate l'area di schermo da catturare (Tutto lo schermo/Finestra), il nome e la qualita' della registrazione
Cliccando su Registra la finestra scompare ed appare una icona nella toolbar (in Gnome in alto) caratterizzata da un quadratino grigio che simula il pulsante di Pausa. Per terminare la registrazione si deve premere questa icona che cambia diventando un puntino rosso per ricominciare a registrare
Il file viene salvato in formato .ogv (che praticamente non viene letto da quasi niente al mondo, Youtube compreso).
Per effettuare la conversione in AVI si puo' procedere da linea di comando con
mencoder screencast.ogv -ovc xvid -oac mp3lame -xvidencopts pass=1 -o screencast.avi
dove screencast.ogv e' il file di input mentre screencast.avi e' quello di output. Il filmato e' quindi pronto per essere postato su Yotube
Per prima si deve selezionate l'area di schermo da catturare (Tutto lo schermo/Finestra), il nome e la qualita' della registrazione
Cliccando su Registra la finestra scompare ed appare una icona nella toolbar (in Gnome in alto) caratterizzata da un quadratino grigio che simula il pulsante di Pausa. Per terminare la registrazione si deve premere questa icona che cambia diventando un puntino rosso per ricominciare a registrare
Il file viene salvato in formato .ogv (che praticamente non viene letto da quasi niente al mondo, Youtube compreso).
Per effettuare la conversione in AVI si puo' procedere da linea di comando con
mencoder screencast.ogv -ovc xvid -oac mp3lame -xvidencopts pass=1 -o screencast.avi
dove screencast.ogv e' il file di input mentre screencast.avi e' quello di output. Il filmato e' quindi pronto per essere postato su Yotube
Importare progetti Android in Eclipse
Importare un progetto Eclipse/Android nella propria Linux Box non e' esattamente banale perche' non e' sufficiente copiare i file a causa di alcuni file di configurazione (.classpath e .project) che sono tipici di ogni installazione Eclipse/Android. Si puo' ovviare con la seguente procedura.
Come esempio si scarichino gli esempi da
svn checkout http://krvarma-android-samples.googlecode.com/svn/trunk/ krvarma-android-samples-read-only
Come esempio si scarichino gli esempi da
svn checkout http://krvarma-android-samples.googlecode.com/svn/trunk/ krvarma-android-samples-read-only
si tratta di diversi esempi di funzioni di Android.
Nel caso in cui si voglia importare il progetto RssReader creare un nuovo progetto Android e selezionare Create project from existing source indicano la cartella dove e' stato scompattato il codice di esempio
Next,selezionare la versione del Build Target e terminare.
Il progetto e' stato importato e puo' essere eseguito
SVN e Proxy HTTP
Per eseguire un comando del tipo
svn checkout http://krvarma-android-samples.googlecode.com/svn/trunk/ krvarma-android-samples-read-only
svn checkout http://krvarma-android-samples.googlecode.com/svn/trunk/ krvarma-android-samples-read-only
stando dietro ad un server proxy si deve andare nella propria home, entrare nella directory nascosta ./.subversion ed editare il file servers nella sezione [global] (circa verso la fine del file) togliendo il segno di nota (#) dati a http-proxy-host e http-proxy-port e modificando i valori a destra del segno uguale con le impostazioni della propria rete
Dalvik
Ripreso e sintetizzato da Wikipedia.
Le applicazioni Android girano all'interno di una macchina virtuale denominata Dalvik che fa parte integrante del sistema operativo Android. I programmi sono di fatto compilati solo come bytecode (differente da quello di Java) e vengono convertiti dal formato .class di Java al formato .dex di Dalvik quando vengono installati sul telefono. Per questo motivo non sono supportate le librerie grafiche AWT e Swing di Java.
Di fatto quindi
In alcuni casi puo' accadere che in fase di compilazione si generi l'errore
Conversion to Dalvik format failed: Unable to execute dex: null
![]() |
| Immagine ripresa da www.learncomputer.com/what-is-dalvik |
Le applicazioni Android girano all'interno di una macchina virtuale denominata Dalvik che fa parte integrante del sistema operativo Android. I programmi sono di fatto compilati solo come bytecode (differente da quello di Java) e vengono convertiti dal formato .class di Java al formato .dex di Dalvik quando vengono installati sul telefono. Per questo motivo non sono supportate le librerie grafiche AWT e Swing di Java.
Di fatto quindi
- Android ha un sintassi Java
- Effettua una prima compilazione in bytecode Java
- Il codice che effettivamente gira nella macchina virtuale (non Java) e' Dalvik e non Java
In alcuni casi puo' accadere che in fase di compilazione si generi l'errore
Conversion to Dalvik format failed: Unable to execute dex: null
In pratica non e' stata effettuata la conversione in .dex
Alla mia esperienza un Clean sul progetto risolve il problema mentre per altre persone e' necessario aumentare la memoria di Eclipse con un add -Xmx1024m (per i dettagli link)
Iscriviti a:
Post (Atom)
Mappa frane da news on line
Correva l'anno 2008 ed il mio direttore di Dipartimento mi aveva chiesto di lavorare sui Big Data per estrarre dati di geolocalizzazione...
-
Aggiornamento questo e' la risposta degli sviluppatori First of all, almost all operating systems on both mobile and laptop/desktop n...
-
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...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...









