Visualizzazione post con etichetta Eclipse. Mostra tutti i post
Visualizzazione post con etichetta Eclipse. Mostra tutti i post

giovedì 16 febbraio 2012

Option Menu

Per creare un Option menu, ovvero il menu che appare in basso allo schermo, si puo' procedere per due vie.
Prima di tutto si deve segnalare che non esiste un sistema unico per aprire un Option Menu. Sull'emulatore si deve premere il tasto Menu

Cerchiato in rosso il tasto di Option Menu

Localizzare una applicazione

Creare una versione localizzata, ovvero con le scritte tradotte nella lingua dell'utente, e' un processo piuttosto immediato in Android.
In generale e' buona abitudine non inserire le stringhe relative all'interfaccia grafica ed ai messaggi nel codice ma e' piu' conveniente scriverle nel file di default strings.xml che si trova nella cartella /res/values del progetto Android
un esempio di come vengono riferite le stringhe nel file strings.xml si puo' trovare nel codice sottostante
-----------------------------------------------------------------------------------------------
    <string name="hello">Hello World, GeocompassActivity!</string>
    <string name="app_name">Geocompass</string>
------------------------------------------------------------------------------------------------
per usare la stringa all'interno del codice del programma si puo' referenziare, per esempio, mediante R.strings.hello; in questo modo sara' stampata la stringa Hello World, GeocompassActivity!

Nel file strings.xml si puo' mettere il testo scritto nel linguaggio di default. Se si vuole effettuare una personalizzazione, per esempio in italiano, si deve creare sotto la directory /res/ una nuova cartella /values-it/ in cui copiare il file strings.xml che sara' poi editato per effettuare la traduzione delle stringhe.

Sara' il telefono, in base alle impostazioni contenute in Impostazioni/Impostazioni Lingua e Tastiera a scegliere quale elenco di stringhe utilizzare in modo del tutto trasparente



domenica 12 febbraio 2012

Log su Android (2)

In fase di debugging puo' essere utile non tracciare il programma con il DDMS ma anche inviando i dati al file di log da leggere in diretta mediante Logcat

Per stampare sul file di log il contenuto delle variabili da esaminare si deve aggiungere al programma la chiamata

if (Config.LOGD) Log.d("Nome_programma","Variabile 1 :"+variabile1);


In questo caso viene stampato il valore della variabile1. La prima stringa "Nome_programma" serve ad effettuare un filtro sul comando logcat come per esempio
adb logcat -s Nome_programma:*


In questo modo si vedono solo le parti del log relative al programma in debugging. Il log puo' essere stampato su un file del computer mediante piping
adb logcat -s Nome_programma:* > file_log.txt


Le stesse cose possono essere fatte, con maggiore semplicita' da dentro Eclipse, usando la finestra Logcat in basso nello schermo selezionando l'apposito tab ed impiegando il filtro











sabato 11 febbraio 2012

Screenshot su Android

per effettuare uno screenshot di una applicazione di propria scrittura in esecuzione sul telefono si puo' andare nel mene DDMS (in alto a destra in Eclipse insieme a Java e Debug)
si apre la finestra in cui si deve scegliere l'icona della macchina fotografica
Un esempio di cattura di schermo di una applicazione su cui sto lavorando adesso la potete trovare nella immagine sottoriportata

domenica 5 febbraio 2012

Move app su SDCard

Per poter spostare, una volta installata, una applicazione sulla SD e' aggiungere nel file Manifest la scritta installLocation="auto"
-------------------------------------------------------------------------------------------------------------

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.gpstest"
    android:versionCode="1"
    android:versionName="1.0" android:installLocation="auto">

-------------------------------------------------------------------------------------------------------------

altrimenti in modo automatico da dentro Eclipse si puo' usare il menu




lunedì 30 gennaio 2012

Sign an app

Per poter distribuire una applicazione Android e' necessario firmarla in modo digitale (vedere qui). Il certificato digitale non e' necessario che sia validato da una autorita' esterna.
Per poter firmare una applicazione da dentro Eclipse si puo' cliccare con il tasto destro sul progetto di cui si vuole rilasciare l'apk e scegliere Android Tool/Export Signed Application Package.
Si apre una finestra nel quale si sceglie il nome dell'applicazione e poi si puo' scegliere una firma digitale gia' creata oppure una gia' pronta

Prima schermata
Seconda Schermata

Definizione di una nuova chiave

Per quanta riguarda le versioni di debug queste sono firmate con una speciale chiave che puo' essere usata sull'emulatore o sul telefono di test ma non funziona su altri sistemi

Track GPS su Android Java

Ho fatto qualche tentativo di utilizzare Python per registrare i dati del GPS mediante il semplice script



--------------------------------------------------------------------------------------------------------------
import android,time
droid = android.Android()


droid.startLocating()
time.sleep(15)
while True:
loc = droid.readLocation().result
if loc == {}:
loc = getLastKnownLocation().result
if loc != {}:
try:
n = loc['gps']
except KeyError:
n = loc['network']
la = n['latitude']
lo = n['longitude']
print la,lo

--------------------------------------------------------------------------------------------------------------
ma dopo pochi secondi di utilizzo l'icona del GPS si spenge e viene visualizzato sempre lo stesso valore di latitudine e longitudine nonostante le normali fluttuazioni che affliggono tutti i sensori GPS.
Francamente non ho chiaro se il problema derivi dal mio hardware o dalle modifiche al firmware software del telefono (dato che il medesimo script ad altre persone funziona)
In ogni caso l'unica soluzione e' stata quella di convertire il progetto in Java

Manifest.xml (da notare le modifiche alle uses-permission ed all'icona personalizzata)

--------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.gpstest"
    android:versionCode="1"
    android:versionName="1.0" >


    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name" >
        <activity
            android:name=".GpsTestActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>


--------------------------------------------------------------------------------------------------------------


GpsTestActivity.java
In questo codice viene acquisita la posizione, l'accuratezza e l'ora, dati che poi vengono scritti sulla SD card su un file cvs dati_gps_android.txt
--------------------------------------------------------------------------------------------------------------

package com.test.gpstest;


import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;


import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.widget.Toast;


public class GpsTestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        /* Use the LocationManager class to obtain GPS locations */
        LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        LocationListener mlocListener = new MyLocationListener();
        mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
    }
    public class MyLocationListener implements LocationListener
    {
    @Override
    public void onLocationChanged(Location loc)
    {
    loc.getLatitude();
    loc.getLongitude();
    loc.getAccuracy();
    String Text = "My current location is: " + "Latitud = " + loc.getLatitude() +"Longitud = " + loc.getLongitude()+" Accuracy = " + loc.getAccuracy();
    Toast.makeText( getApplicationContext(),Text,Toast.LENGTH_SHORT).show();
    // scrive i dati sul file
    try {
        File root = Environment.getExternalStorageDirectory();
        if (root.canWrite()){
            File gpxfile = new File(root, "dati_gps_android.txt");
            FileWriter gpxwriter = new FileWriter(gpxfile,true);
            BufferedWriter out = new BufferedWriter(gpxwriter);
            //String currentDateTimeString = DateFormat.getDateInstance().format(new Date());
            String currentTimeString = new SimpleDateFormat("HH:mm:ss").format(new Date());
            out.write(currentTimeString+";"+loc.getLatitude()+";"+loc.getLongitude()+";"+loc.getAccuracy()+"\n");
            out.close();
        }
    } catch (IOException e) {
   
    }


    }




    @Override
    public void onProviderDisabled(String provider)
    {
    Toast.makeText( getApplicationContext(),"Gps Disabled",Toast.LENGTH_SHORT ).show();
    }




    @Override
    public void onProviderEnabled(String provider)
    {
    Toast.makeText( getApplicationContext(),"Gps Enabled",Toast.LENGTH_SHORT).show();
    }




    @Override
    public void onStatusChanged(String provider, int status, Bundle extras)
    {


    }


    }/* End of Class MyLocationListener */
    
}

--------------------------------------------------------------------------------------------------------------

Rispetto al test precedente effettuato con un senbsore bluetooth esterno le condizioni di visibilita' del cielo erano decisamente migliori per cui l'errore di posizione e' risultato inferiore ai 5 m



Icone su applicazione Android

Per inserire una icona personalizzata in un progetto Android e' sufficiente inserire nelle directory una immagine .png come suggerito qui


res/drawable-hdpi
res/drawable-mdpi
res/drawable-ldpi


rispettivamente alle risoluzioni 72x72 (hdpi), 48x48 (mdpi) e 36x36 (ldpi) ed usando sempre lo stesso nome (per esempio miaicona.png)

Successivamente si dovra' modificare il file Manifest.xml

   <application
        android:icon="@drawable/miaicona"


inserendo il nome dell'icona dopo la scritta @drawable senza l'estensione png

Suggerimenti di Eclipse



Usando Eclipse puo' tornare comodo usare i suggerimenti di completamento del codice
Se si digitano le seguenti righe pero'

--------------------------------------------------------------------------------------------
String currentDateTimeString = DateFormat.getDateInstance().format(new Date());
String currentTimeString = new SimpleDateFormat("HH:mm:ss").format(new Date());
--------------------------------------------------------------------------------------------

vengono proposti alcuni import mentre quelli corretti sono

--------------------------------------------------------------------------------------------
import java.text.DateFormat;
import java.text.SimpleDateFormat;
--------------------------------------------------------------------------------------------
In caso contrario il codice non compila

Il motivo dell'errore risiede nel fatto che i comandi sono contenuti, con lo stesso nome, in piu' librerie e quindi Eclipse, non sapendo quale scegliere, sbaglia





martedì 17 gennaio 2012

Creare file .apk da Eclipse-ADT

il procedimento per creare i file di installazione e distribuzione .apk da Eclipse e' piuttosto banale
Una volta selezionato il progetto File/Export/Export Android Application

Selezionare il nome del progetto da esportare a cui segue la schermata  del keystore (il file deve avere l'estensione keystore)

Una nuova schermata con parametri da inserire (25 anni e' il valore minimo suggerito da Android)


ed infine si sceglie dove scrivere il file .apk. Tale file puo' essere distribuito, copiato sul telefono ed installato

Creare progetti Android con Eclipse/ADT

Per creare un nuovo progetto Android con Eclipe/ADT si clicchi su File/New/Other/Android Project

Compare quindi la schermata sottostante


in cui Project Name si puo' inserire il nome UDPClient (meglio non usare spazi..non si mai)
in Application Name si puo' inserire il nome in formato libero (spazi,virgole)
in Package Name si deve utilizzare le convenzioni Java per cui il nome puo' essere com.udp.client
in Activity Name si deve inserire il nome della classe che verra' generata in questo caso udpclient


Errori di Eclipse ADT nella creazione di un progetto

lasciando da parte Python sono tornato a rivedere un po' Eclipse e Java mi sono ritrovato con due errori nella fase di creazione di un nuovo progetto mi sono imbattuto in

Debug certificate expired in 03/01/2012.....

che si risolve cancellando il file /.android/debug.keystore (soluzione ripresa da qui) e probabilmente dovuta al fatto che non usavo piu' Eclipse da molto tempo

altro errore
Unable to open class file......R.java
la soluzione (qui) consiste nell'aprire e richiuedere Eclipse oppure cliccare sul progetto nel package explorer sulla sinistra con tasto destro/Source/Format

un altro problemino che0 ho riscontrato (forse a causa di una vecchia versione di ADT) e' che il plug-in cerca il file adb nella directory tools dell'SDK mentre nelle versioni piu' recenti e' stato spostato sotto platform-tools. Si puo' risolvere in modo un po' brutale copiando il file adb nella directory tools

Opencv camera calibration in cpp

Oltre che con uno script Python come visto qui la calibrazione della camera si puo' fare anche con il programma in CPP Questo il proce...