PDA

Ver la Versión Completa : geolocalizacion


gohan0189
11/05/12, 20:16:10
hola estoy tratando de hacer una geolocalizacion tengo esto


import java.io.IOException;
import java.util.List;
import java.util.Locale;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope ;
import org.ksoap2.transport.HttpTransportSE;

/**
*
* @author Inmobart
*/
public class GoogleMaps extends MapActivity implements LocationListener
{
private static final String namespace = "http://tempuri.org/";
private static String url="http://192.168.1.119/SAR/AutoHelpWS/AutoHelpWS.asmx";
private static final String Metodo = "ReportarSiniestroAuto";
private static final String accionSoap ="http://tempuri.org/ReportarSiniestroAuto";
private MapView mapView;
private TextView coordenadas;
private LocationManager locationManager;
private MapController controlMapa = null;
//private Mylocation itemizedoverlay;
private Geocoder geoCoder;
EditText edtxtpoliza,edtxtinciso,edtxtplacassiniestro;
CheckBox checkdañopersona,checkdañoauto;
String latitud,longitud;

class MyOverlay extends Overlay {
GeoPoint point;

public MyOverlay(GeoPoint point) {
super();
this.point = point;
}

@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
super.draw(canvas, mapView, shadow);

Point scrnPoint = new Point();
mapView.getProjection().toPixels(this.point, scrnPoint);

Bitmap marker = BitmapFactory.decodeResource(getResources(), R.drawable.marcador_google_maps);
canvas.drawBitmap(marker,
scrnPoint.x - marker.getWidth() / 2,
scrnPoint.y - marker.getHeight() / 2, null);
return true;
}
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gps);

mapView=(MapView) findViewById(R.id.map_view);
coordenadas=(TextView) findViewById(R.id.tw_mensaje);
edtxtpoliza=(EditText)findViewById(R.id.edtxtpoliz a);
edtxtinciso=(EditText)findViewById(R.id.edtxtincis o);
checkdañopersona=(CheckBox) findViewById(R.id.chdañopersona);
checkdañoauto=(CheckBox) findViewById(R.id.chdañoauto);
edtxtplacassiniestro=(EditText)findViewById(R.id.e dtxtplacassiniestro);
mapView.setBuiltInZoomControls(true);

locationManager = (LocationManager)getSystemService(Context.LOCATION _SERVICE);
locationManager.requestLocationUpdates(LocationMan ager.GPS_PROVIDER, 6000, 50, this);
updateLocation(locationManager.getLastKnownLocatio n(LocationManager.GPS_PROVIDER));


}

@Override
protected boolean isRouteDisplayed() {
return false;
}

@Override
public void onLocationChanged(Location location) {
updateLocation(location);
}

@Override
public void onProviderDisabled(String provider) {
Intent intent = new Intent( android.provider.Settings.ACTION_LOCATION_SOURCE_S ETTINGS);
startActivity(intent);
}

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

@Override
public void onProviderEnabled(String provider) {}

protected void updateLocation(Location location){
mapView = (MapView) findViewById(R.id.map_view);
controlMapa = mapView.getController();
GeoPoint point = new GeoPoint((int) (location.getLatitude() * 1E6), (int) (location.getLongitude() * 1E6));
Double lat=(Double) (location.getLatitude());
Double lng=(Double) (location.getLongitude());
latitud=String.valueOf(lat);
longitud=String.valueOf(lng);
controlMapa.animateTo(point);
controlMapa.setZoom(15);
coordenadas.setText("Latitud:"+location.getLatitude()+"\nLongitud:"+location.getLongitude());

geoCoder = new Geocoder(this, Locale.getDefault());

try {
List<Address> addresses = geoCoder.getFromLocation(
point.getLatitudeE6() / 1E6,
point.getLongitudeE6() / 1E6, 1);


String address = "";
if (addresses.size() > 0) {
for (int i = 0; i < addresses.get(0).getMaxAddressLineIndex(); i++)
address += addresses.get(0).getAddressLine(i) + "\n";
}

Toast.makeText(getBaseContext(), address, Toast.LENGTH_SHORT).show();
}
catch (IOException e) {
e.printStackTrace();
}

List<Overlay> mapOverlays = mapView.getOverlays();
MyOverlay marker = new MyOverlay(point);
mapOverlays.add(marker);
mapView.invalidate();
}
}


pero cuando llega a

GeoPoint point = new GeoPoint((int) (location.getLatitude() * 1E6), (int) (location.getLongitude() * 1E6));

location es null y me cierra mi app , en que estoy mal o que me hace falta???

monchyrcg
11/05/12, 21:24:56
public void onLocationChanged(Location location) {
updateLocation(location);
}

Yo cambiara esto por esto:

public void onLocationChanged(Location location) {
if(location!=null)
updateLocation(location);
}

Este método no tiene restricción y puede ser que la primera vez que arrancas la aplicación el gps aun no haya recibido señal por lo tanto location sera null.

No se si me explico pero prueba y di si funciona!

gohan0189
11/05/12, 21:56:09
oo tenias razon gracias!!!!!!. oie aprovechando si tengo mi app con una apikey de google maps y el archivo . apk que se crea lo copio en otro dispositivo y se ven los mapas significa que ya tengo apikey .apk y no la de debug??? o como se cual tengo?? o como saco ya la api para mi app

gohan0189
11/05/12, 22:03:59
oie tambien otra cosa cuando esta activado el gps del movil no hay problema pero cuando esta desactivado, no entra al onproviderdisabled, como le hago para activar el gps??

monchyrcg
11/05/12, 22:11:25
Si has creado tu apk y te funciona en otros moviles es que tienes una apiKey para poder publicar.

Igual que el otro, tendra que saber que provider se ha dado de baja para poder funcionar no?
public void onProviderDisabled(String provider) {
Intent intent = new Intent( android.provider.Settings.ACTION_LOCATION_SOURCE_S ETTINGS);
startActivity(intent);
}

Lo cambias por:

public void onProviderDisabled(String provider) {
if(provider.equals(Context.LOCATION_SERVICE){
Intent intent = new Intent( android.provider.Settings.ACTION_LOCATION_SOURCE_S ETTINGS);
startActivity(intent);
}
}


Yo creo que te servira.

gohan0189
11/05/12, 22:19:26
mm no me cierra la app, es que de hecho no pasa al public void onProviderDisabled

gohan0189
11/05/12, 22:33:59
cuando llega a

updateLocation(locationManager.getLastKnownLocatio n(LocationManager.GPS_PROVIDER));

es cuando me bota la app

gohan0189
14/05/12, 18:44:59
como le hago para que esta linea

updateLocation(locationManager.getLastKnownLocatio n(LocationManager.GPS_PROVIDER));
se espera a que se active el gps porque supongo que por eso me marca error o que estoys haciendo mal???

kriogeN
14/05/12, 20:32:59
El getLastKnownLocation, como su propio nombre indica, utiliza el último valor conocido para el tipo de GPS que le has pasado.

Si quieres esperar a que el GPS fije la posición a la actual tienes que usar un LocationListener y en el método onLocationChanged poner el código para que ahí utilice el valor que has leído.

No se como de precisa querrás que sea tu localización, pero en la mayoría de los casos con NETWORK_PROVIDER es suficiente.

Ya para redondear puedes combinar el LocationListener con un Criteria, así el móvil elegirá automaticamente entre el GPS Real o el de Red según las necesidades. Yo ahora mismo es una cosa que tengo pendiente en una de mis aplicaciones, trasladar que esté forzado a NETWORK_PROVIDER por un Criteria.