2012-08-13 18 views
17

Ich schreibe einen Code, der den aktuellen Standort bringt, aber es gibt mir den Standort nicht, weil es nie onLocationChanged() ruft. Gibt es eine Möglichkeit, den Speicherort zu finden.onLocationChanged() nie aufgerufen

mobileLocation kommt für diesen Fall auf 0, so dass die Ausführung zum Else-Block geht.

Mein Code ist

public class FindLocation { 
private LocationManager locManager; 
private LocationListener locListener; 
private Location mobileLocation; 
private String provider; 

public FindLocation(Context ctx){ 
    locManager = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE); 
    locListener = new LocationListener() { 
     @Override 
     public void onStatusChanged(String provider, int status, 
       Bundle extras) { 
     } 
     @Override 
     public void onProviderEnabled(String provider) { 
     } 
     @Override 
     public void onProviderDisabled(String provider) { 
     } 
     @Override 
     public void onLocationChanged(Location location) { 
      System.out.println("mobile location is in listener="+location); 
      mobileLocation = location; 
     } 
    }; 
    locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locListener);    
    if (mobileLocation != null) { 
     locManager.removeUpdates(locListener); 
     String londitude = "Londitude: " + mobileLocation.getLongitude(); 
     String latitude = "Latitude: " + mobileLocation.getLatitude(); 
     String altitiude = "Altitiude: " + mobileLocation.getAltitude(); 
     String accuracy = "Accuracy: " + mobileLocation.getAccuracy(); 
     String time = "Time: " + mobileLocation.getTime(); 
     Toast.makeText(ctx, "Latitude is = "+latitude +"Longitude is ="+londitude, Toast.LENGTH_LONG).show(); 
    } else { 
     System.out.println("in find location 4"); 
     Toast.makeText(ctx, "Sorry location is not determined", Toast.LENGTH_LONG).show(); 
    } 
} 
    } 
+1

wenn Sie Emulator oder Gerät überprüfen? – rajeshwaran

+0

Nein zum ersten Mal auf (auch echte Maschine), wenn ich es starte, ruft es nicht onLocationChanged() auf, so Variable mobileLocation ist null. Bedeutet manchmal, dass es den Standort erreicht, aber nicht zum Zeitpunkt des Klicks. –

+0

Obwohl es sehr spät ist, aber ich hoffe, dass dieser Kommentar jemand anderem helfen kann, schauen Sie sich diesen Link an: http://www.lengrand.fr/2013/10/onlocationchanged-is-never-called-on-android – SMHJamali

Antwort

5

Haben Sie nie einen Ort bekommen oder nur wie du Du schreibst in deinen Kommentar "manchmal bekommt es den Ort, aber nicht zum Zeitpunkt des Klicks."?

Möglicherweise ist Ihr Code schneller als der LocationManager, der onLocationChanged() noch nicht aufgerufen hat. Ändern Sie den Code, um die letzte bekannte Position zu bekommen, oder warten Sie, bis Ihr locListener genannt wurde:

locManager.requestLocationUpdates(
    LocationManager.GPS_PROVIDER, 1000, 1, locListener); 
mobileLocation = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
if (mobileLocation != null) { 
4

ich, was Sie Erlaubnis vergessen

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

ODER

Proper Klasse deklarieren wie

public class MyLocationListener implements LocationListener { 
@Override 
    public void onLocationChanged(Location arg0) { 
    latitude = arg0.getLatitude(); 
    longitude = arg0.getLongitude(); 
    } 

} 
+0

Ich habe getan all diese Dinge. –

+0

Erzähl mir wenn Methode onLocationChanged() aufgerufen ?? wenn sich der Standort ändert oder wenn wir den Hörer anrufen ?? –

8

i laufen meine app auf realen Gerät.

locMan.requestSingleUpdate(LocationManager.NETWORK_PROVIDER, this, null); 
+0

NETWORK_PROVIDER hat mein Problem gelöst. Danke :) – Mehmood

+0

Das funktionierte auch für mich, wenn du die Möglichkeit hast, bitte zu tun :) – jobbert

0

Direkt nach locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locListener), fügen Sie den folgenden Code:

locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 1, locListener); 

EDIT: i Netzwerk statt GPS und OnLocationChanged verwenden aufgerufen, um den Code dank den Kommentar von @Fabian Streitel korrigiert.

+0

locManager ist in deinem Beispiel keine Funktion. Ich glaube nicht, dass dein Code selbst –

+0

@FabianStreitel kompilieren würde, du hast Recht, ich habe gerade einen dummen Fehler gemacht, indem ich .requestLocationUpdates vermisst habe. Ich habe die Antwort bearbeitet –

0
import android.app.ActivityManager; 
import android.app.Service; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.media.AudioManager; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.os.PowerManager; 
import android.util.Log; 

import org.json.JSONObject; 

import java.util.List; 


public class AndroidLocationServices extends Service { 

    PowerManager.WakeLock wakeLock; 
    String MODULE="AndroidLocationServices",TAG=""; 
    private LocationManager locationManager; 
    double getLattitude=0,getLogitude=0; 
    private static final long MIN_TIME_BW_UPDATES = 1; // 1 minute 
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0; 


    public AndroidLocationServices() { 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     // TODO Auto-generated method stub 
     super.onCreate(); 
     preferences=getSharedPreferences(GlobalConfig.PREF_NAME, MODE_PRIVATE); 
     PowerManager pm = (PowerManager) getSystemService(this.POWER_SERVICE); 

     wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DoNotSleep"); 

     // Toast.makeText(getApplicationContext(), "Service Created", 
     // Toast.LENGTH_SHORT).show(); 

     Log.e("Google", "Service Created"); 

    } 

    @Override 
    @Deprecated 
    public void onStart(Intent intent, int startId) { 
     // TODO Auto-generated method stub 
     super.onStart(intent, startId); 

     Log.e("Google", "Service Started"); 

     locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE); 

     //locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2500, 0, listener); 
     locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, listener); 


    } 



    public LocationListener listener = new LocationListener() { 

     @Override 
     public void onLocationChanged(Location location) { 
      // TODO Auto-generated method stub 

      Log.e("Google", "Location Changed"); 
      location.setAccuracy(100); 

      if (location == null) 
       return; 
        getLattitude=location.getLatitude(); 
        getLogitude=location.getLongitude(); 

        Log.e("latitude", getLattitude + ""); 
        Log.e("longitude", getLogitude + ""); 


     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onProviderEnabled(String provider) { 
      // TODO Auto-generated method stub 

     } 

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

     } 
    }; 

    @Override 
    public void onDestroy() { 
     // TODO Auto-generated method stub 
     super.onDestroy(); 

//  wakeLock.release(); 

    } 


} 

Manifest:

<service android:name=".services.AndroidLocationServices"/> 

Start Service vor Gebrauch:

startService(new Intent(this, AndroidLocationServices.class)); 
0

In meinem Fall wurde die App nicht für Berechtigungen zu fragen. Obwohl ich die Berechtigungen in der Datei menifest hinzugefügt habe. Daher konnte ich meiner App nicht den Zugriff auf den Standort erlauben.

Als Fehlerbehebung, ich ging manuell zu: Settings->Permissions->Your location und aktiviert die Standorterlaubnis für meine unter Entwicklung App. Und das hat mein Problem behoben.

Ich nehme an, dass dieses Problem nur auftritt, wenn die App über Android Studio installiert wird. Ich hoffe, es wird nicht passieren, wenn die App von Google Play installiert wird.

Verwandte Themen