2011-12-15 19 views
5

ho cercato di creare un'app per Android correlata alla mappa, ma mi sono reso conto che l'onLocationChanged della mia app non era stata chiamata, quindi la mappa rimane sempre nell'area predefinita (Stati Uniti).onLocationChanged non è stato chiamato

il mio codice:

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 

tutta la mia registro gatto quando ho eseguito l'applicazione tramite il mio 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 

manifestare:

<?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

come hai cambiato la posizione ?? – freshDroid

+0

ehm ... non capisco davvero cosa intendi. ma, dal momento che non sono in stato, quando eseguo l'app non dovrebbe visualizzare la mappa degli stati. – Jovi

+0

u eseguirlo sull'emulatore – freshDroid

risposta

1

Stai provando che mentre ti muovi o mentre sei seduto legato alla tua macchina di sviluppo con USB e guardando logcat?

Se seduto alla macchina dev, ho il sospetto che non sei in grado di spostare i 5 metri necessari per attivare un evento posizione cambiamento come richiesto nella chiamata a requestLocationUpdates

Da API documenti:.

Se minDistance è maggiore di 0, una posizione andrà in onda solo se il dispositivo si muove da minDistance metri.

provare a ridurre a zero il parametro della distanza minima in quella chiamata e vedere cosa succede.

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

Probabilmente non vuoi lasciarlo a zero per qualcosa di diverso dal test.

Se questo non aiuta si potrebbe provare a vedere che il GPS funziona affatto facendo qualcosa di simile nel tuo onResume, dopo chiedete locationUpdates:

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

e vedere se hai trovato una buona posizione Informazioni.

+0

sì, lo collaudo con il cavo USB collegato al mio computer. non succede nulla quando ho cambiato da 5 a 0.Ho testato l'app con un log inserito nel metodo onLocationChanged e quando eseguo l'app, il log non viene visualizzato. quindi la mia ipotesi è che non entri nemmeno in quel metodo. – Jovi

+0

ciao, niente sembra accadere. ho aggiornato il codice e il mio LogCat sopra. per favore aiuto. thanks =) – Jovi

+0

prova a fare qualche logging alla fine di onResume e guarda cosa contiene loc per assicurarsi che stai ricevendo qualcosa dal fornitore di location. – mmeyer

0

Location stuiff è difficile. Da un lato, è necessario disporre di una posizione recente in modo rapido, con la massima precisione possibile, dall'altro lato non si vuole scaricare la batteria velocemente. Ci sono anche differenze tra i livelli API. Vedere questo manuale per una spiegazione dettagliata:

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

quanto riguarda la tua domanda iniziale - requersting aggiornamenti sulla posizione ist solo una raccomandazione per location manager per l'invio di questi aggiornamenti dopo qualcosa cambia. Non è obbligato a fare così. Il tuo sistema GPS potrebbe non essere abbastanza preciso (e certamente non lo è) per rilevare le modifiche della posizione del cagnolino mentre è al guinzaglio sul cavo USB. A scopo di test, è possibile creare il fornitore fittizio e manipolarlo con un'altra applicazione.

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

+0

ciao, potresti farmi sapere come e dove dovrei inserire il codice? thks – Jovi

Problemi correlati