2011-12-15 18 views
5

He estado tratando de crear una aplicación de Android relacionada con el mapa, pero me di cuenta de que el onLocationChanged de mi aplicación no se había llamado, por lo tanto, el mapa siempre permanece en el área predeterminada (EE. UU.).onLocationChanged no se ha llamado

mi código:

public class MapMainActivity extends MapActivity 
implements OnClickListener, LocationListener { 

MapView mapView; 

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

    //reference 
    mapView = (MapView)findViewById(R.id.map_view); 
    mapView.setBuiltInZoomControls(true); 
    this.findViewById(R.id.btn_satellite).setOnClickListener(this); 
    this.findViewById(R.id.btn_street).setOnClickListener(this); 

}//onCreate 

@Override 
protected void onResume() { 
    super.onResume(); 

    Toast.makeText(this, "GPS tracking started", 
     Toast.LENGTH_SHORT).show(); 

// Start location updates; 5s/5m 
    LocationManager locManager = (LocationManager)getSystemService(
     Context.LOCATION_SERVICE); 
    locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
     5000, 0, this); 

    Criteria crit = new Criteria(); 
    crit.setAccuracy(Criteria.ACCURACY_FINE); 
    String provider = locManager.getBestProvider(crit, true); 
    Location loc = locManager.getLastKnownLocation(provider); 

}//onResume 

@Override 
protected void onPause() { 
    super.onPause(); 

    Toast.makeText(this, "GPS tracking stopped", 
     Toast.LENGTH_SHORT).show(); 

    LocationManager locManager = (LocationManager)getSystemService(
      Context.LOCATION_SERVICE); 
     locManager.removeUpdates(this); 
}//onPause 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    if(v == findViewById(R.id.btn_street)) 
    { 
     mapView.setSatellite(false); 
    }//street view 

    else if (v == findViewById(R.id.btn_satellite)) 
    { 
     mapView.setSatellite(true); 
    } 
}//onClick 

@Override 
protected boolean isRouteDisplayed() { 
    // TODO Auto-generated method stub 
    return false; 
}//isRouteDisplayed 

@Override 
public void onLocationChanged(Location location) { 
    // TODO Auto-generated method stub 
    double lat = location.getLatitude(); 
    double lon = location.getLongitude(); 

    TextView txtLat = (TextView)findViewById(R.id.txt_lat); 
    txtLat.setText(String.format("%.6f", lat)); 
    TextView txtLon = (TextView)findViewById(R.id.txt_lon); 
    txtLon.setText(String.format("%.6f", lon)); 

    MapView map = (MapView)findViewById(R.id.map_view); 
    map.getController().animateTo(new GeoPoint((int)(lat*1E6),//1000000), 
     (int)(lon*1E6))); 
}//onLocationChanged 

@Override 
public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 
    Toast.makeText(this, "GPS disabled", 
      Toast.LENGTH_SHORT).show(); 
}//onProviderDisabled 

@Override 
public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 
    Toast.makeText(this, "GPS enabled", 
      Toast.LENGTH_SHORT).show(); 
}//onProviderEnabled 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
    // TODO Auto-generated method stub 

}//onStatusChanged 


}//class 

el conjunto de mi gato de registro cuando corro la aplicación a través de mi dispositivo (16/12/2011)

D/InputTransport(5357): Input channel constructed: name='40baf680 Toast (client)', ashmemFd=54, receivePipeFd=57, sendPipeFd=58 

I/MapActivity(5357): Handling network change notification:CONNECTED 

E/MapActivity(5357): Couldn't get connection factory client 

I/ViewRoot(5357): [email protected] DRAWING : sg.edu.tp/sg.edu.tp.SIP_TestMapActivity 

I/ViewRoot(5357): [email protected] is completed : sg.edu.tp/sg.edu.tp.SIP_TestMapActivity 

I/ViewRoot(5357): [email protected] DRAWING : Toast 

I/ViewRoot(5357): [email protected] is completed : Toast 

D/InputTransport(5357): Input channel destroyed: name='40baf680 Toast (client)', ashmemFd=54, receivePipeFd=57, sendPipeFd=58 

manifiesta:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="sg.edu.tp" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="10" /> 

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

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

     <uses-library android:name="com.google.android.maps" /> 
     <activity android:name=".SIP_TestMapActivity"></activity> 
     <activity android:name=".SIP_TestDraw1Activity"></activity> 
     <activity android:name=".SIP_TestDraw2Activity"></activity> 
    </application> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

</manifest> 
+0

¿cómo ha cambiado la ubicación? – freshDroid

+0

er ... realmente no entiendo lo que quieres decir. pero, como no estoy en el estado, cuando ejecuto la aplicación no debería mostrar el mapa de estados. – Jovi

+0

lo ejecuta en el emulador – freshDroid

Respuesta

1

¿Está probando eso mientras se mueve o mientras está sentado atado a su máquina de desarrollo con USB y observa logcat?

Si sentado en la máquina dev, sospecho que no eres capaz de mover los 5 metros necesarios para desencadenar un evento de cambio de ubicación, ya que solicitó en su llamada a requestLocationUpdates

De API documentos:.

Si minDistance es mayor que 0, sólo se transmitirá en una ubicación si el dispositivo se mueve por metros minDistance.

intente reducir el parámetro de distancia mínima en esa llamada a cero y vea qué pasa.

locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,5000, 0, this); 

Es probable que no desee dejar eso en cero para nada más que la prueba.

Si eso no ayuda que pueda tratar de ver que su GPS funciona en absoluto por hacer algo como esto en su onResume, después de pedir locationUpdates:

Criteria crit = new Criteria(); 
crit.setAccuracy(Criteria.ACCURACY_FINE); 
String provider = lm.getBestProvider(crit, true); 
Location loc = lm.getLastKnownLocation(provider); 

y ver si está recibiendo buena ubicación información

+0

sí, lo pruebo con el usb enchufado a mi com. no pasa nada cuando cambié de 5 a 0.Probé la aplicación con un registro insertado en el método onLocationChanged, y cuando ejecuto la aplicación, el registro no aparece. así que supongo que ni siquiera entra en ese método. – Jovi

+0

hola, nada parece suceder. He actualizado el código y mi LogCat arriba. por favor ayuda. thanks =) – Jovi

+0

intente hacer algo de registro al final de onResume y vea qué loc contiene para asegurarse de que está recibiendo algo del proveedor de ubicación. – mmeyer

0

Ubicación stuiff es complicado. Por un lado, necesita una ubicación reciente rápida, con la mejor precisión posible en el otro lado que no le gusta agotar la batería rápidamente. También hay diferencias entre los niveles de API. Ver este manual para una explicación detallada:

http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html

En cuanto a su pregunta original - requersting actualizaciones de ubicación ist sólo una recomendación al gerente de locación que le envíe las actualizaciones después de que algo cambie. No está obligado a hacer así. Es posible que su sistema GPS no sea lo suficientemente fino (y ciertamente no lo es) para detectar pequeños cambios de ubicación mientras está conectado a un cable USB. Para fines de prueba, puede crear el proveedor simulado y manipularlo con otra aplicación.

http://developer.android.com/reference/android/location/LocationManager.html#addTestProvider%28java.lang.String,%20boolean,%20boolean,%20boolean,%20boolean,%20boolean,%20boolean,%20boolean,%20int,%20int%29

+0

hola, ¿podría decirme cómo y dónde debo poner el código? thks – Jovi

Cuestiones relacionadas