0

我的位置为:

    LocationManager locationManager;
                GeoPoint p; 
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);


                boolean gps_enabled = locationManager
                        .isProviderEnabled(LocationManager.GPS_PROVIDER);
                if (gps_enabled) {
                    Location location = locationManager
                            .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                }

但是,gps_enabled=true位置=null。为什么无法获取我的位置?你能帮助我吗?如果我通过 NETWORK_PROVIDER 就可以了。

4

5 回答 5

2

有很多事情。GPS 可能来自所谓的“冷启动”,它不知道它在哪里。在这些情况下,最后一个已知位置为空。您也可能处于没有信号的位置以获取位置修复。它也可能是一个糟糕的 GPS 或一个糟糕的 GPS 驱动程序(咳嗽三星咳嗽)。这些东西都不准确。

首先,我将从这个文档开始。位置获取策略

接下来,让我们评估一下这里的逻辑。是的,GPS 已启用。但是,在这种情况下,启用意味着它已启用以供具有精细位置权限的应用程序使用。启用并不意味着它当前处于活动状态并正在获取位置。但有一个好消息!您可以创建监听器或订阅位置更新。

因此,正如其他人所提到的,请确保您在清单中设置了权限。我假设您这样做,否则您的应用程序可能会因getLastKnownLocation()通话权限问题而崩溃并烧毁。

然后要接收位置更新,请查看LocationListener类。通过实现此接口,您可以使用locationManager.requestLocationUpdates()从 GPS 注册位置更新。

使用您的代码(我假设一些事情,比如它在一个活动中,并且正在描述的方法在 UI 线程上调用):

public class MyActivity extends Activity implements LocationListener {
  // The rest of the interface is not really relevant for the example
  public void onProviderDisabled(String provider) { }
  public void onProviderEnabled(String provider) { }
  public void onStatusChanged(String provider, int status, Bundle extras) { }

  // When a new location is available from the Location Provider,
  // this method will be called.
  public void onLocationChanged(Location location) {
        // You should do whatever it was that required the location
        doStuffWithLocation(location);
        // AND for the sake of your users' battery stop listening for updates
        (LocationManager) getSystemService(LOCATION_SERVICE).removeUpdates(this);
        // and cleanup any UI views that were informing of the delay
        dismissLoadingSpinner();
  }

  // Then in whatever code you have
  public void methodA() {
    LocationManager locationManager;
    GeoPoint p; 
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    boolean gps_enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (gps_enabled) {
      Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
      if (location == null) {
            // When it is null, register for update notifications.
            // run this on the UI Thread if need be
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
            // Since this might take some time you should give the user a sense
            // that progress is being made, i.e. an indeterminate ProgressBar 
            showLoadingSpinner();
      } else {
            // Otherwise just use the location as you were about to
            doStuffWithLocation(location);
      }
    }
    ...

这应该像您期望的那样运行您的代码,然后在 GPS 没有位置的情况下,您启动它并等待直到您获得位置。一旦发生这种情况,您将其关闭并按照您的计划使用它。这是一种幼稚的方法,但您应该能够将其用作简单的基础。真正的解决方案应该考虑没有机会获得位置的情况,处理位置提供程序不可用或在您等待位置时变得不可用的情况,并验证位置的健全性。

于 2012-10-16T09:56:30.913 回答
1

您是否在清单中添加了这些权限:

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

编辑:

通过这个链接。它提供了不同的策略来查找位置。

于 2012-10-16T09:44:19.317 回答
1

在清单中,您是否授予了权限..

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
于 2012-10-16T09:45:28.617 回答
1

该方法getLastKnownLocation()仅返回 GPS 获取的最后一个位置,而无需打开它。例如,如果你重新启动你的手机,缓存将被清理,GPS 将不会返回任何缓存的位置,直到你启动它并让它至少获取一个位置。

于 2012-10-16T09:46:06.270 回答
1

使用代码:

    // Get the location manager
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    Criteria criteria = new Criteria();
    provider = locationManager.getBestProvider(criteria, false);
    Location location = locationManager.getLastKnownLocation(provider);

    // Initialize the location fields
    if (location != null) {
    System.out.println("Provider " + provider + " has been selected.");
    double lat = (double) (location.getLatitude());
    double lng = (double) (location.getLongitude());

    Log.i(TAG, "Lattitude:" +lat);
    Log.i(TAG, "Longitude:" +lng);

    } else {
      System.out.println("Location not avilable");
    }
  }
于 2012-10-16T09:48:07.500 回答