2012-08-13 19 views
17

Sto scrivendo un codice che porta la posizione corrente ma non mi dà la posizione perché non chiama mai onLocationChanged(). C'è un modo per trovare la posizione.onLocationChanged() mai chiamato

mobileLocation sta arrivando 0 per questo caso, quindi l'esecuzione va al blocco else.

mio codice è

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

se si controlla l'emulatore o il dispositivo? – rajeshwaran

+0

No per la prima volta su (macchina reale anche) quando lo avvio, Non chiama onLocationChanged() in modo che la variabile mobileLocation sia nullo. I mezzi a volte ottengono la posizione ma non al momento del clic. –

+0

Anche se è molto tardi ma spero che questo commento possa aiutare qualcun altro, guarda questo link: http://www.lengrand.fr/2013/10/onlocationchanged-is-never-called-on-android – SMHJamali

risposta

5

Ti mai ottenere una posizione o un solo come te scrivi nel tuo commento "a volte ottiene la posizione ma non al momento del clic".?

Potrebbe essere che il codice sia più veloce di LocationManager, che potrebbe non aver ancora chiamato onLocationChanged(). Modificare il codice al fine di ottenere l'ultima posizione nota, o aspettare fino a quando il locListener è stato chiamato:

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

io cosa ti sei dimenticato il permesso

<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" /> 

O

Dichiarare classe propria come

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

} 
+0

Ho fatto queste tutte le cose. –

+0

dimmi quando il metodo onLocationChanged() ha chiamato ?? quando la posizione è cambiata o quando chiamiamo l'ascoltatore ?? –

8

ho eseguito la mia applicazione sul dispositivo reale. io uso della rete invece di GPS e onLocationChanged si chiama:

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

NETWORK_PROVIDER ha risolto il mio problema. Grazie :) – Mehmood

+0

Questo ha funzionato anche per me, se hai la possibilità di eleborare per favore fallo :) – jobbert

0

Subito dopo locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locListener), aggiungere il seguente codice:

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

EDIT: corretto il codice grazie al commento di @Fabian Streitel.

+0

locManager non è una funzione nell'esempio. Non penso che il tuo codice possa anche compilare –

+0

@FabianStreitel, hai ragione, ho appena commesso uno stupido errore mancando .requestLocationUpdates. Ho modificato la risposta –

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(); 

    } 


} 

manifesto:

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

Servizio ai proprietari inizio prima dell'uso:

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

Nel mio caso l'applicazione non aveva chiesto i permessi. Anche se ho aggiunto le autorizzazioni nel file manifest. Quindi non ero in grado di consentire alla mia app di accedere alla posizione.

Come una correzione, sono andato manualmente a: Settings->Permissions->Your location e abilitato l'autorizzazione di posizione per la mia app in fase di sviluppo. E questo ha risolto il mio problema.

Suppongo che questo problema si verifichi solo quando l'app viene installata tramite Android Studio. Spero che non si verifichi quando l'app è installata da Google Play.

Problemi correlati