2012-03-14 5 views
0

Это мой последний вопрос о GPSТекущее местоположение пользователя не загружается

Getting 0.0 for latitude and longitude while showing current location in map

Теперь вот код, я использую, чтобы получить текущее местоположение пользователя.

LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     Criteria crta = new Criteria(); 
     crta.setAccuracy(Criteria.ACCURACY_FINE); 
     crta.setAltitudeRequired(false); 
     crta.setBearingRequired(false); 
     crta.setCostAllowed(true); 
     crta.setPowerRequirement(Criteria.POWER_LOW); 
     String provider = mlocManager.getBestProvider(crta, true); 
     Location loc = null; 
     if (provider != null) { 
      loc = mlocManager.getLastKnownLocation(provider); 
     } 
     LocationListener mlocListener = new MyLocationListener(); 
     mlocListener.onLocationChanged(loc); 
     mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
       2000, 10, mlocListener); 


public class MyLocationListener implements LocationListener{ 
    public MyLocationListener() { 
    } 

    @Override 
    public void onLocationChanged(Location loc) { 
     if (null != loc) { 
     String Text = "Your current location is: \n" + "Latitude = \n" 
     + loc.getLatitude() + "\nLongitude = \n" + loc.getLongitude(); 
     Toast.makeText(getApplicationContext(),Text,Toast.LENGTH_SHORT).show(); 

     GeoPoint myGeoPoint = new GeoPoint((int)(loc.getLatitude()*1E6),(int)(loc.getLongitude()*1E6)); 
     mpc.animateTo(myGeoPoint); 
     mpc.setZoom(10); 
     objMapView.invalidate(); 

     } 
    } 

    @Override 
    public void onProviderDisabled(String provider){ 
     Toast.makeText(getApplicationContext(), "gps disabled",Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     Toast.makeText(getApplicationContext(), "gps enabled",Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 

    } 
} 

Теперь проблема, с которой я столкнулся, не показывает мне текущее местоположение, когда включен gps. Объект loc, loc = mlocManager.getLastKnownLocation (поставщик); всегда возвращает null. Я получил значение для провайдера как gps.

Но если я включу свое соединение gps, то тот же объект loc будет иметь соответствующую информацию, и он будет работать частично. Это значит, что это дает мне ближайшее место. Я имею в виду полное местоположение города, где я сижу.

Но если я нахожусь в моем gps-соединении, это не дает мне даже местоположение города, не входит ли в цикл только внутри класса слушателя. Я не понимаю, что здесь не так.

Любой может сказать мне, как его решить?

Update:

Это значение я для объекта цит если мой GPS выключен

Местоположение [mProvider = сеть, время изменения = 1331718353322, mLatitude = 12,9053401, mLongitude = 74,8359128, mHasAltitude = ложь, mAltitude = 0,0, mHasSpeed ​​= ложь, mSpeed ​​= 0,0, mHasBearing = ложь, mBearing = 0,0, mHasAccuracy = верно, mAccuracy = 36,0, mExtras = Пачка [mParcelledData.dataSize = 148]].

Но если GPS включен, локусы возвратного нуля

ответ

2

CustomLocationManager.Java

import java.util.Timer; 
import java.util.TimerTask; 

import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 

public class CustomLocationManager { 

    private LocationManager mLocationManager; 
    private LocationValue locationValue; 
    private Location networkLocation = null; 
    private Location gpsLocation = null; 

    private Timer mTimer; 

    private boolean isGpsEnabled = false; 
    private boolean isNetworkEnabled = false; 

    private static CustomLocationManager _instance; 

    private CustomLocationManager() {} 

    public static CustomLocationManager getCustomLocationManager() { 
     if (_instance == null) { 
      _instance = new CustomLocationManager(); 
     } 
     return _instance; 
    } 

    public LocationManager getLocationManager(Context context) { 
     if (mLocationManager == null) 
      mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
     return mLocationManager; 
    } 

    public boolean getCurrentLocation(Context context, LocationValue result) { 
     locationValue = result; 
     if (mLocationManager == null) 
      mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 

     try { 
      isGpsEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
     } catch (Exception ex) {} 

     try { 
      isNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
     } catch (Exception ex) {} 

     if (!isGpsEnabled && !isNetworkEnabled) 
      return false; 

     if (isGpsEnabled) 
      mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, gpsLocationListener); 

     if (isNetworkEnabled) 
      mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, networkLocationListener); 

     mTimer = new Timer(); 
     mTimer.schedule(new GetLastKnownLocation(), 20000); 

     return true; 
    } 

    LocationListener gpsLocationListener = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      mTimer.cancel(); 
      locationValue.getCurrentLocation(location); 
      mLocationManager.removeUpdates(this); 
      mLocationManager.removeUpdates(networkLocationListener); 
     } 

     public void onProviderDisabled(String provider) {} 

     public void onProviderEnabled(String provider) {} 

     public void onStatusChanged(String provider, int status, Bundle extras) {} 
    }; 

    private LocationListener networkLocationListener = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      mTimer.cancel(); 
      locationValue.getCurrentLocation(location); 
      mLocationManager.removeUpdates(this); 
      mLocationManager.removeUpdates(gpsLocationListener); 
     } 

     public void onProviderDisabled(String provider) {} 

     public void onProviderEnabled(String provider) {} 

     public void onStatusChanged(String provider, int status, Bundle extras) {} 
    }; 

    private class GetLastKnownLocation extends TimerTask { 
     CurrentLocationHandler handler; 

     GetLastKnownLocation() { 
      handler = new CurrentLocationHandler(); 
     } 

     @Override 
     public void run() { 
      mLocationManager.removeUpdates(gpsLocationListener); 
      mLocationManager.removeUpdates(networkLocationListener); 

      if (isGpsEnabled) 
       gpsLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

      if (isNetworkEnabled) 
       networkLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

      handler.sendEmptyMessage(0); 
     } 
    } 

    private class CurrentLocationHandler extends Handler { 
     @Override 
     public final void handleMessage(Message msg) { 
      if (gpsLocation != null && networkLocation != null) { 

       if (gpsLocation.getTime() > networkLocation.getTime()) 
        locationValue.getCurrentLocation(gpsLocation); 
       else 
        locationValue.getCurrentLocation(networkLocation); 

       return; 
      } 

      if (gpsLocation != null) { 
       locationValue.getCurrentLocation(gpsLocation); 
       return; 
      } 

      if (networkLocation != null) { 
       locationValue.getCurrentLocation(networkLocation); 
       return; 
      } 

      locationValue.getCurrentLocation(null); 
     } 
    } 
} 


LocationValue.Java

import android.location.Location; 

public abstract class LocationValue { 
    public abstract void getCurrentLocation(Location location); 
} 


YourActivity.Java

private void getCurrentLocation() { 
     CustomLocationManager.getCustomLocationManager().getCurrentLocation(this, locationValue); 
    } 

    public LocationValue locationValue = new LocationValue() { 
     @Override 
     public void getCurrentLocation(Location location) { 
      // You will get location here if the GPS is enabled 
      if(location != null) { 
       Log.d("LOCATION", location.getLatitude() + ", " + location.getLongitude()); 
      } 
     } 
    }; 


AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
+0

спасибо. Пожалуйста, дайте мне время, чтобы проверить этот код. Я вернусь – tejas

+0

Супер, большое спасибо Лалиту. Он работает идеально. Не могли бы вы рассказать мне, как отметить точное местоположение пользователя сейчас.Я могу переехать в город, где он стоит. Я хочу отметить раунд, как тот, который мы получаем в приложении карты. Не могли бы вы сказать мне, как это сделать? – tejas

+0

Чтобы нарисовать маркер, просто включите myLocation. Вот код \t mMyLocationOverlay = new MyLocationOverlay (VenueDescription.this, objMapView); \t \t \t \t \t mMyLocationOverlay.enableMyLocation(); \t \t \t \t \t objMapView.getOverlays(). Add (mMyLocationOverlay); и установите масштаб на некоторое большее число, например, 30+ – tejas

0

Прежде всего, я не знаком с Android Location API, но вы пытаетесь GPS снаружи? Поскольку GPS не работает внутри зданий, довольно сложно получить местоположение вашего мобильного устройства, используя только ваш GPS. Когда в помещении, как правило, ваша позиция «GPS» определяется с использованием вашего соединения с точкой доступа WiFi.

+0

Я не думаю, что это вызывает у меня проблемы. Также я попробовал приложение карты по умолчанию на Android-телефоне. Это работает отлично. Я подозреваю свой код сейчас, но не понимаю, что здесь не так. – tejas

Смежные вопросы