lunedì 30 gennaio 2012

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