проблема в получении GPS-координат в Android 2.1 (найденный ответ) - PullRequest
1 голос
/ 29 сентября 2010

У меня проблема с получением координат GPS в 2.1.

Код, который я сейчас использую, хорошо работает в 1.6, но когда я тестирую этот же apk в устройстве 1.6 показывает нулевые значения

помогите, пожалуйста, найти способ работы с устройствами 2.1 также

Вот мой код.

public class GpsLocator {

   private static String PROVIDER="gps";
   private LocationManager myLocationManager=null;

   public GpsLocator(Context context) {
      myLocationManager=(LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
   }

   public void myOnresume() {
      myLocationManager.requestLocationUpdates(PROVIDER, 0,   0, onLocationChange);
   }

   public void myonPause() {
       myLocationManager.removeUpdates(onLocationChange);
   }

   public double getLatitude() {
      Location loc=myLocationManager.getLastKnownLocation(PROVIDER);
      if (loc==null) {
         return(0);
      }
      return(loc.getLatitude());
   }

   public double getLongitude() {
      Location loc=myLocationManager.getLastKnownLocation(PROVIDER);
      if (loc==null) {
         return(0);
      }

      return(loc.getLongitude());
   }

   LocationListener onLocationChange=new LocationListener() {

      public void onLocationChanged(Location location) {
      }

      public void onProviderDisabled(String provider) {
         // required for interface, not used
      }

      public void onProviderEnabled(String provider) {
         // required for interface, not used
      }

      public void onStatusChanged(String provider, int status,Bundle extras) {
         // required for interface, not used
      }
   };
}

в файле манифеста я добавляю разрешение на доступ к файлу, они

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

Ответы [ 3 ]

3 голосов
/ 30 сентября 2010
    LocationManager locationManager;
    String context = Context.LOCATION_SERVICE;
    locationManager = (LocationManager)getSystemService(context);
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    criteria.setAltitudeRequired(false);
    criteria.setBearingRequired(false);
    criteria.setCostAllowed(true);
    criteria.setPowerRequirement(Criteria.POWER_LOW);
    String provider = locationManager.getBestProvider(criteria, true);

    Location location = locationManager.getLastKnownLocation(provider);

    updateWithNewLocation(location);

    locationManager.requestLocationUpdates(provider, 2000, 10,   
                                           locationListener);
  }

  private final LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
      updateWithNewLocation(location);
    }

    public void onProviderDisabled(String provider){
      updateWithNewLocation(null);
    }

    public void onProviderEnabled(String provider){ }
    public void onStatusChanged(String provider, int status, 
                                Bundle extras){ }
  };
2 голосов
/ 29 сентября 2010

LocationManager.getLastKnownLocation не гарантирует возврата действительного местоположения.Если GPS-определение еще не установлено, оно вернется к нулю.Единственный надежный способ получить фактическое местоположение - использовать LocationListener -интерфейс.Я вижу, что вы определили LocationListener, но не используете его.

Вам необходимо изменить свой код, чтобы он ожидал первого вызова onLocationChanged, прежде чем пытаться что-либо делать с этим местоположением.

1 голос
/ 21 февраля 2011

Привет, я столкнулся с той же проблемой в 2.1 после того, как я решил, как это ... это будет работать для вас

myManager = ((LocationManager) ApplicationController.getAppContext()
            .getSystemService(Context.LOCATION_SERVICE));

myManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
            1 * 1000, 0.00001f, this);

Следуйте за местоположением, измененным методом asy, в котором вы получите lat / и long

не используйте объект связки там, где он не будет работать, вместо этого вы можете использовать класс Gps Satellite для 2.1 ..

...