Per avere una semplice gestione (non multitouch o gesture) della pressione sullo schermo si puo' aggiungere all'Activity il metodo OnTouchEvent
public boolean onTouchEvent(MotionEvent event)
{ int x = (int)event.getX();
int y = (int)event.getY();
Log.d("s",Integer.toString(x));
Log.d("s",Integer.toString(y));
}
giovedì 5 aprile 2012
martedì 3 aprile 2012
Vestizione OpenStreetMap
Nel tentativo di trovare la migliore cartografia gratuita per la mia applicazione Roadbook ha fatto qualche prova con MOBAC. Alla versione 1.9.6 sono disponibili tre vestizioni di Openstreetmap (l'unica cartografia gratuita) tra cui e' comparsa 4umaps.eu che riporta le isoipse...l'ideale per un programma di navigazione nel bosco
![]() |
| 4umaps.eu |
![]() |
| Mapquest |
![]() |
| Mapnik |
lunedì 2 aprile 2012
Connettersi a MySql da Android
Android ha varie possibilita' di salvare dati persistenti ma non c'e' una via semplice per connettersi a database esterni in particolare MySql
Usando JDBC ho avuto diversi problemi (il sorgente si compila bene ma non riesce a connettersi) per cui un sistema alternativo e' quello di passare per un intermediario dato da uno script in PHP
per prima cosa si deve impostare il permesso
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
il server e' 192.168.0.1 e lo script si trova in http://192.168.0.1/zenith/insert.php
vengono passate due variabili (piatto e tavolo) popolate
-------------------------------------------------------------------------------------------
InputStream is;
String piatto = spin.getSelectedItem().toString();
//String tavolo = tav_txt.getText().toString();
String tavolo = spin_tav.getSelectedItem().toString();
ArrayList <NameValuePair> nameValuePairs = new ArrayList <NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("piatto",piatto));
nameValuePairs.add(new BasicNameValuePair("tavolo",tavolo));
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://192.168.0.1/zenith/insert.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
Log.d("Zenith","Dato salvato");
Toast.makeText( getApplicationContext(),R.string.riuscito,Toast.LENGTH_SHORT ).show();
// suona per conferma
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
}
catch(Exception e)
{
Toast.makeText( getApplicationContext(),R.string.non_riuscito,Toast.LENGTH_SHORT ).show();
Log.e("Zenith", "Error in http connection"+e.toString());
}
-------------------------------------------------------------------------------------------
la struttura del database Mysql e' data dal codice
-------------------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `comande` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`tavolo` int(11) NOT NULL,
`piatto` text NOT NULL,
`data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=22 ;
-------------------------------------------------------------------------------------------
lo script Php insert.php invece risulta essere
-------------------------------------------------------------------------------------------
<?
$hostname_localhost ="localhost";
$database_localhost ="zenith";
$username_localhost ="xxxxxxxxx";
$password_localhost ="xxxxxxxxxxx";
var_dump($_REQUEST);
$localhost = mysql_connect($hostname_localhost,$username_localhost,$password_localhost)
or
trigger_error(mysql_error(),E_USER_ERROR);
mysql_select_db("zenith");
$sql_string = "INSERT INTO comande (id,tavolo,piatto,data) VALUES (NULL,'".$_REQUEST['tavolo']."','".$_REQUEST['piatto']."',CURRENT_TIMESTAMP)";
$sql=mysql_query($sql_string);
mysql_close();
?>
Stili in Android
Per definire gli stili di un elemento grafico in Android si puo' utilizzare il file styles.xml
Questo file non viene creato insieme al progetto Eclipse e deve essere generato inserendo nella directory /res/values un nuovo file Android XML Values File e nominandolo come style.xml
All'interno, un po' come fosse un Css in html, si crea uno stile con un determinato nome (in questo caso latlon)
-----------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="latlon">
<item name="android:textColor">#000000</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">16sp</item>
</style>
</resources>
---------------------------------------------------------------------------------------
per fare in modo che un elemento grafico usi lo style si puo' inserire nella definizione dell'oggetto. Per esempio
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="@string/latlon"
android:textAppearance="@style/latlon"
/>
Questo file non viene creato insieme al progetto Eclipse e deve essere generato inserendo nella directory /res/values un nuovo file Android XML Values File e nominandolo come style.xml
All'interno, un po' come fosse un Css in html, si crea uno stile con un determinato nome (in questo caso latlon)
-----------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="latlon">
<item name="android:textColor">#000000</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">16sp</item>
</style>
</resources>
---------------------------------------------------------------------------------------
per fare in modo che un elemento grafico usi lo style si puo' inserire nella definizione dell'oggetto. Per esempio
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="@string/latlon"
android:textAppearance="@style/latlon"
/>
RelativeLayout vs. LinearLayout
Normalmente i progetti di Android/Eclipse partono tutti con il LinearLayout, il modo piu' semplice (e meno potente) di disporre gli elementi grafici sullo schermo.
Impostando invece il RelativeLayout si ha il vantaggio di poter bloccare gli elementi grafici ad aree particolari dello schermo usando direttamente la composizione grafica del layout
Leggere file GPX in Android
Un esempio di come usare la classe java scaricabile qui per leggere i file gpx su Android
package com.gpx;
import android.app.Activity;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
class GpxReader
{
private static final SimpleDateFormat gpxDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
public static List<Location> getPoints(File gpxFile)
{
List<Location> points = null;
try
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
FileInputStream fis = new FileInputStream(gpxFile);
Document dom = builder.parse(fis);
Element root = dom.getDocumentElement();
NodeList items = root.getElementsByTagName("trkpt");
points = new ArrayList<Location>();
for(int j = 0; j < items.getLength(); j++)
{
Node item = items.item(j);
NamedNodeMap attrs = item.getAttributes();
NodeList props = item.getChildNodes();
Location pt = new Location("test");
pt.setLatitude(Double.parseDouble(attrs.getNamedItem("lat").getTextContent()));
pt.setLongitude(Double.parseDouble(attrs.getNamedItem("lon").getTextContent()));
for(int k = 0; k<props.getLength(); k++)
{
Node item2 = props.item(k);
String name = item2.getNodeName();
if(!name.equalsIgnoreCase("time")) continue;
try
{
pt.setTime((getDateFormatter().parse(item2.getFirstChild().getNodeValue())).getTime());
}
catch(ParseException ex)
{
ex.printStackTrace();
}
}
for(int y = 0; y<props.getLength(); y++)
{
Node item3 = props.item(y);
String name = item3.getNodeName();
if(!name.equalsIgnoreCase("ele")) continue;
pt.setAltitude(Double.parseDouble(item3.getFirstChild().getNodeValue()));
}
points.add(pt);
}
fis.close();
}
catch(FileNotFoundException e)
{
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch(ParserConfigurationException ex)
{
}
catch (SAXException ex) {
}
return points;
}
public static SimpleDateFormat getDateFormatter()
{
return (SimpleDateFormat)gpxDate.clone();
}
}
public class GpxActivity extends Activity {
private List<Location> t;
private double lat;
private double lon;
private double alt;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
File gpx = new File("/mnt/sdcard/malandrino.gpx");
t = GpxReader.getPoints(gpx);
Iterator<Location> it = t.iterator();
while (it.hasNext())
{
Location value = it.next();
lat = value.getLatitude();
lon = value.getLongitude();
alt = value.getAltitude();
Log.d("gpx",Double.toString(lat));
Log.d("gpx",Double.toString(lon));
Log.d("gpx",Double.toString(alt));
}
}
}
Iscriviti a:
Post (Atom)
FigSpec FS-60CL
A lavoro mi hanno rifilato questo sensore iperspettrale cinese (pushbroom 400-1000 nm con larghezza di banda di 0.5 nm compatibile con DJI M...
-
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...





