2012-08-13 26 views
17

piszę kod, który przynosi aktualną lokalizację, ale to nie daje mi się lokalizacja, ponieważ nie wywołuje onLocationChanged() .Is jakiś sposób, aby znaleźć lokalizację.onLocationChanged() nigdy nie nazywa

MobileLocation nadchodzi 0 dla tego przypadku, więc wykonanie przechodzi do bloku else.

Mój kod jest

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

jeśli zaznaczysz Emulator lub urządzenie? – rajeshwaran

+0

Nie po raz pierwszy na (prawdziwym komputerze również), gdy go uruchomię, nie wywołuje on onLocationChanged() tak zmienna mobileLocation jest pusta. Znaczy czasami dostaje lokalizację, ale nie w momencie kliknięcia. –

+0

Chociaż jest bardzo późno, ale mam nadzieję, że ten komentarz może pomóc komuś innemu, spójrz na ten link: http://www.lengrand.fr/2013/10/onlocationchanged-is-never-called-on-android – SMHJamali

Odpowiedz

5

Czy nie masz lokalizację lub tylko jako yo piszesz w swoim komentarzu "czasami dostaje lokalizację, ale nie w momencie kliknięcia."?

Może być tak, że kod jest szybszy niż LocationManager, które nie mogą jednak być nazywany onLocationChanged(). Zmienić swój kod w celu uzyskania ostatnią znaną lokalizację, albo poczekać, aż locListener nazwano:

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

I rzeczą, którą zapomniał pozwolenie

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

LUB

stwierdzenie odpowiedniej klasie jak

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

} 
+0

Ja zrobiłem te wszystkie rzeczy. –

+0

Powiedz mi, kiedy metoda onLocationChanged() została wywołana? kiedy zmienia się lokalizacja lub kiedy dzwonimy do słuchacza? –

8

uruchamiam moją aplikację na rzeczywistym urządzeniu. używam sieć zamiast GPS i onLocationChanged nazywa się:

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

NETWORK_PROVIDER rozwiązał mój problem. Dzięki :) – Mehmood

+0

To również zadziałało dla mnie, jeśli masz szansę ukończyć proszę :) – jobbert

0

Bezpośrednio po locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locListener), dodaj następujący kod:

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

EDIT: poprawione Kodeksu dzięki komentarzem @Fabian Streitel.

+0

locManager nie jest funkcją w twoim przykładzie. Nie sądzę, że twój kod mógłby nawet skompilować –

+0

@FabianStreitel, masz rację, właśnie popełniłem głupią pomyłkę przez brak .requestLocationUpdates. Zmieniłem odpowiedź –

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

    } 


} 

Oczywisty:

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

Uruchom usługę przed użyciem:

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

W moim przypadku aplikacja nie prosi o uprawnieniach. Chociaż dodałem uprawnienia w pliku menifest. Nie mogłem zezwolić mojej aplikacji na dostęp do lokalizacji.

jako poprawka, ręcznie poszedł do: Settings->Permissions->Your location i umożliwiło zgodę lokalizacji dla mojej aplikacji pod-rozwojowej. I to naprawiło mój problem.

Zakładam, że ten problem występuje tylko wtedy, gdy aplikacja jest zainstalowana za pośrednictwem Android Studio. Mam nadzieję, że nie nastąpi, gdy aplikacja zostanie zainstalowana z Google Play.

Powiązane problemy