无法获得正确的位置

时间:2012-10-16 09:38:41

标签: android geolocation gps

我的位置为:

    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但是location = null。 为什么找不到我的位置?你能帮助我吗? 如果我通过NETWORK_PROVIDER得到了。

6 个答案:

答案 0 :(得分:2)

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

首先,我将从这个文档开始。 Location Acquisition Strategies

接下来,我们来评估逻辑。是的,GPS已启用。但是,在此上下文中,enabled表示启用了具有精细位置权限的应用程序。启用并不意味着它当前处于活动状态并获取位置。但是有好消息!您可以创建一个监听器或订阅位置更新。

正如其他人提到的那样,请确保您在清单中设置了权限。我认为你这样做了,否则你的应用可能会因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没有位置的情况下,您将其旋转并等到您获得位置。一旦发生这种情况,您可以将其关闭并按照您的计划使用它。这是一种天真的方法,但你应该能够将它作为一个简单的基础。真正的解决方案应考虑到无法获得位置的情况,在位置提供者不可用时处理案例或在等待位置时变得不可用的情况,并验证位置的完整性。

答案 1 :(得分:1)

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

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

编辑:

浏览this link。它提供了不同的策略来查找位置。

答案 2 :(得分: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>

答案 3 :(得分:1)

方法getLastKnownLocation()只返回GPS获取的最后一个位置,并将其打开。例如,如果您重新安排手机,则会清理缓存并且GPS不会有任何缓存位置返回,直到您启动它并让它在一个位置获取。

答案 4 :(得分: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");
    }
  }

答案 5 :(得分:1)

你可以找到我已回答类似问题的解决方案。希望这会帮助你。 https://stackoverflow.com/a/12911930/1730706