Heim >Java >javaLernprogramm >Android öffnet die GPS-Navigation, ruft Standortinformationen ab und gibt eine Nulllösung zurück
Ich habe kürzlich an einem Android-Projekt gearbeitet und musste GPS verwenden, um Standortinformationen zu erhalten. Nachdem ich die API überprüft hatte, stellte ich fest, dass zum Abrufen von Standortinformationen nur ein äußerst einfacher Satz erforderlich ist:
getLastKnownLocation(LocationManager.GPS_PROVIDER),
Also ich war sehr zufrieden. Aber sobald ich es in den Code geschrieben habe, war der Rückgabewert (Standorttyp) immer null ... was sehr frustrierend war. Nachdem ich lange im Internet gesucht hatte, stellte ich fest, dass viele Leute wie ich mit diesem Problem zu kämpfen haben. Einige Leute sagen, es liege daran, dass das GPS nicht eingeschaltet sei, und andere sagen, es liege daran, dass die entsprechenden Berechtigungen nicht hinzugefügt wurden. Aber meines ist offensichtlich in den Einstellungen aktiviert und die Berechtigungen sind natürlich auch hinzugefügt. Nachdem ich lange mit der API gekämpft habe, habe ich endlich den Grund herausgefunden. Es stellt sich heraus, dass das Einschalten von GPS tatsächlich von diesem Satz abhängt:
setTestProviderEnabled("gps",true);
und es hat nichts mit den Einstellungen auf der zu tun Telefon (zumindest habe ich das auf meinem Telefon getestet) von). Selbst wenn die Telefoneinstellungen deaktiviert sind, kann dieser Satz weiterhin aktiviert werden, und selbst wenn die Telefoneinstellungen aktiviert sind, ist er ohne diese Zeile nutzlos. Entsprechend diesem Satz wird
setTestProviderEnabled("gps",false);
verwendet, um das GPS auszuschalten.
Kann ich die obige Methode verwenden, um den Standort zu ermitteln, nachdem das GPS eingeschaltet wurde? Immer noch nicht möglich! Um genau zu sein, ist dies manchmal möglich, da diese Funktion die beim letzten Mal erhaltenen Positionsinformationen abruft. Stellen Sie sich vor, dass bei der ersten Ausführung dieses Programms die Positionsinformationen noch nicht abgerufen wurden und der Rückgabewert natürlich null ist . Nachdem ich die API sorgfältig überprüft habe, habe ich diesen Satz in
requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener)
gefunden: Es kann eine Weile dauern, bis der aktuelle Standort angezeigt wird. Wenn ein sofortiger Standort erforderlich ist, verwenden Anwendungen möglicherweise die Methode getLastKnownLocation(String). Um Standortinformationen abzurufen, sollten Sie daher mit dieser Methode einen Listener für den Manager festlegen und ihn in onLocationChanged(Location location) im Listener abrufen.
Der Testcode lautet wie folgt:
public void onLocationChanged(Location location) { Log.i("onLocationChanged", "come in"); if (location != null) { Log.w("Location","Current altitude = "+ location.getAltitude()); Log.w("Location","Current latitude = "+ location.getLatitude()); } }
Nach dem Testen kann der Standort nach einer gewissen Zeit ermittelt werden (die Erfassungszeit hängt von minTime und minDistance ab). Ein weiteres Problem, das beachtet werden muss, besteht darin, dass Sie nach dem Einrichten des Listeners die oben beschriebene Methode nicht verwenden können, um GPS auszuschalten, bevor Sie den Listener löschen, da sonst ein Fehler gemeldet wird. Daher ist die Methode zum Ausschalten von GPS
manager.removeUpdates (listener);//listener 即为监听器实例 manager.setTestProviderEnabled("gps",false);
Das Folgende ist der Testcode, die erforderlichen Berechtigungen sind:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"></uses-permission> <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"></uses-permission>
import android.app.Activity; import android.content.Context; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; public class audio extends Activity { /** Called when the activity is first created. */ LocationManager locationManager; LocationListener llistener; String provider; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); String serviceName = Context.LOCATION_SERVICE; locationManager = (LocationManager) getSystemService(serviceName); locationManager.setTestProviderEnabled("gps", true); provider = locationManager.getBestProvider(criteria, true); Log.d("provider", provider); llistener = new LocationListener() { @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub Log.i("onLocationChanged", "come in"); if (location != null) { Log.w("Location", "Current altitude = " + location.getAltitude()); Log.w("Location", "Current latitude = " + location.getLatitude()); } locationManager.removeUpdates(this); locationManager.setTestProviderEnabled(provider, false); } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub Log.i("onProviderDisabled", "come in"); } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub Log.i("onProviderEnabled", "come in"); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub Log.i("onStatusChanged", "come in"); } }; locationManager.requestLocationUpdates(provider, 1000, (float) 1000.0, llistener); } protected void onDestroy() { locationManager.removeUpdates(llistener); locationManager.setTestProviderEnabled(provider, false); super.onDestroy(); }
Weitere Informationen zum Öffnen der GPS-Navigation auf mehreren Android-Geräten und zum Abrufen von Standortinformationen finden Sie auf der chinesischen PHP-Website.