[RESOLVIDO] Rotina TimerTask com GPS

3 respostas
carvalhais

Olá Pessoal :lol: sou iniciante na programação android estou tendo um problema em construir uma rotina onde a cada 3 minutos uma nova posição deverá ser gravada junto com a data e hora e id referente ao cadastro do usuario.

Usei o TimerTask para crianção da rotina (gravar de 3 em 3 min) o unico problema e que se o GPS mudar de posição "N" vezes, "N" vezes será capturada a posição, alguem pode me ajudar a fazer com que a cada 3 min ele apenas capture uma unica posição sendo ela a posição atual.

Ficarei Grata se alguem me ajuda vou postar o codigo aqui para vcs

Classe GPSActivity

package br.com.android;

import java.io.DataOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.util.Timer;
import java.util.TimerTask;

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

public class GPSActivity extends Activity {
 
	LocationManager manager;
	Location Loc_Atual;
	TextView txtLatitude;
    TextView txtLongitude;
    TextView txtuser;
    String VB;
    DataOutputStream os;
    String user="123@";
    String data1 = "dd/MM/yyyy";  
    String data,hora,hora1;
    
    
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main); // chama tela layout 
        
        txtLatitude = (TextView) findViewById(R.id.txtLatitude);
        txtLongitude = (TextView) findViewById(R.id.txtLongitude);
        txtuser = (TextView) findViewById(R.id.txtuser);
        manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    }
 
	@Override
	protected void onResume() {
		super.onResume();
		Loc_Atual = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
		
		atualizacao();
		//Registra as atualizações
		manager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0, 0, listener);
	}
 
	private void atualizacao() {
		if(Loc_Atual == null){
			txtuser.setText("Determinando sua localização...");
		} else {
			
			Double latPoint =  Loc_Atual.getLatitude();
	    	Double lngPoint =  Loc_Atual.getLongitude();

	        txtLatitude.setText(latPoint.toString());
	        txtLongitude.setText(lngPoint.toString());
	        txtuser.setText(user.toString());
	        
	        // gerador que vai conter a Data atual 
	        
	        java.util.Date agora = new java.util.Date();  
	        SimpleDateFormat formata = new SimpleDateFormat(data1);  
	        data= formata.format(agora);   
	              
	        // gerador que vai conter a hora atual 
	                         
	        StringBuilder sb = new StringBuilder();
	        GregorianCalendar d = new GregorianCalendar(); 
	        sb.append( d.get( GregorianCalendar.HOUR_OF_DAY ) );
	        sb.append( ":" );  
	        sb.append( d.get( GregorianCalendar.MINUTE ) );     
	        hora= sb.toString();
	        
	        // Variavel que será enviada para o VB via socket TCP/IP
	        
	        VB = "/POS"+lngPoint+","+latPoint+","+data +","+ hora+","+user;

		}
	}
	
	
	public void grava()
    {
    	/*try {
    		// Envia dados para o VB atraves do Socket
			os = new DataOutputStream(ClientActivity.socket.getOutputStream());
			os.writeBytes(VB);
			System.out.println(VB);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} */

		System.out.println(VB); // só ira imprimir pois não mandei minha parte de servidor para envia os dados no codigo a cima.
			
    }
	
 
	//Manipula as chamadas dos eventos de localização
	
	private LocationListener listener = new LocationListener() {
 
		@Override
		public void onLocationChanged(Location location) {
			Loc_Atual = location;
			atualizacao();					
			// rotina para atualizar de 3 em 3 mintos que estou tendo problema
			Timer timer = new Timer();
	    		    	timer.scheduleAtFixedRate(new TimerTask(){

	                    public void run() { 
	                   grava();
	                    	}
				
	                },3*60000,3*60000);  
					
		}
 
		@Override
		public void onStatusChanged(String arg0, int arg1, Bundle arg2) {}
 
		@Override
		public void onProviderEnabled(String arg0) {}
 
		@Override
		public void onProviderDisabled(String arg0) {}
	};
 
	@Override
	protected void onPause() {
		super.onPause();
		manager.removeUpdates(listener);
	}
}

Main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="35dp" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="40dp"
            android:text="Usuario: "
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="#0000CD" />

        <TextView
            android:id="@+id/txtuser"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="40dp"
            android:layout_weight="0.67"
           
            android:textColor="#E0FFFF" />
    </LinearLayout>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/lblLatitude"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="60dp"
            android:layout_marginTop="20dp"
            android:text="Latitude: "
            android:textColor="#8DB6CD" />

        <TextView
            android:id="@+id/txtLatitude"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="20dp"

            android:textColor="#E0FFFF" />
    </LinearLayout>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/lblLongitude"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="60dp"
            android:layout_marginTop="20dp"
            android:text="Longitude: "
            android:textColor="#8DB6CD" />

        <TextView
            android:id="@+id/txtLongitude"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="20dp"
           
            android:textColor="#E0FFFF" />
    </LinearLayout>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

    </LinearLayout>

</LinearLayout>

3 Respostas

soaresinfo

Na própria configuração do gps, tem opção para você definir de quanto em quanto tempo você quer a atualização:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 180000, 0, this);
S

É isso ai mesmo.

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, TEMPO, DISTANCIA, this);
carvalhais

[quote=srmachado]É isso ai mesmo.

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, TEMPO, DISTANCIA, this);

Mas então eu já tentei isto mas quando eu simulo no GPS do emulador aperto aperto duas vezes ele pega as duas posições consecutivamente sem dar o tempo determinado

Criado 9 de fevereiro de 2012
Ultima resposta 10 de fev. de 2012
Respostas 3
Participantes 3