Java NullPointerException位置。getLongitude()

Java NullPointerException位置。getLongitude(),java,android,location,android-location,Java,Android,Location,Android Location,我试图在片段的onCreateView()中获取当前位置。我在试图获取当前经度的行上得到一个空指针异常。我做错了什么 final LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(Location currentLocation) {

我试图在片段的onCreateView()中获取当前位置。我在试图获取当前经度的行上得到一个空指针异常。我做错了什么

final LocationListener locationListener = new LocationListener()
        {
            @Override
            public void onLocationChanged(Location currentLocation)
            {
                latitude = currentLocation.getLatitude();
                longitude = currentLocation.getLongitude();
            }
            public void onProviderDisabled(String provider)
            {

            }
            public void onProviderEnabled(String provider)
            {

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

            }
        };

        lm = (LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 1, locationListener);
        location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        longitude = location.getLongitude();
        latitude = location.getLatitude();
你没有错

location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
该方法只返回上次已知的位置。它不计算位置。当没有旧位置记录时,它将为空。您在代码中请求更新。因此,如果需要,您可以等待位置更新。

您没有错

location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

该方法只返回上次已知的位置。它不计算位置。当没有旧位置记录时,它将为空。您在代码中请求更新。因此,如果需要,您可以等到获得位置更新。

您是说在回调之外调用
location.getLongitude()
吗? 如果这就是你所说的,那么就不能保证手机会有GPS或启用GPS。在这两种场景中,您都会得到一个空响应。虽然很难满足所有的场景,但你最好从网络提供商那里获得位置,这很可能在那里。此外,我会使用
标准
生成器来获得更适合您需要的连接。例如,如果你只想知道一个用户在哪个城市,GPS就太危险了

//force last known location from network provider
String providerName = LocationManager.NETWORK_PROVIDER;
if (mLocationManager.isProviderEnabled(providerName)) {
  Location lastLocation = mLocationManager.getLastKnownLocation(providerName);
}

//get high accuracy provider
providerName = mLocationManager.getBestProvider(createMediumCriteria(), true);
if (providerName == null) {
  // get low accuracy provider
  providerName = mLocationManager.getBestProvider(createLowCriteria(), true);
}

if (providerName == null) {
  //get low accuracy even if its disabled
  providerName = mLocationManager.getBestProvider(createLowCriteria(), false);
}

if (providerName != null && mLocationManager.isProviderEnabled(providerName)) {

  Location lastLocation = mLocationManager.getLastKnownLocation(providerName);

  if (lastLocation != null) {
    onLocationChanged(lastLocation);
  }
  //else {
  //timeout after 30 seconds.
  if (!sLocationHandler.hasMessages(MSG_UNREGISTER)) {
    sLocationHandler.sendEmptyMessageDelayed(MSG_UNREGISTER, 30000);
  }

  //LocationProvider provider = locMgr.getProvider(providerName);
  // using low accuracy provider... to listen for updates
  mLocationManager.requestLocationUpdates(providerName, 0, 0f, this);
  //}
标准构建器将类似于:

  /**
   * this criteria will settle for less accuracy, high power, and cost
   */
  public static Criteria createLowCriteria() {

    Criteria c = new Criteria();
    c.setAccuracy(Criteria.ACCURACY_LOW);
    c.setAltitudeRequired(false);
    c.setBearingRequired(false);
    c.setSpeedRequired(false);
    c.setCostAllowed(true);
    c.setPowerRequirement(Criteria.POWER_LOW);
    return c;
  }

  /**
   * this criteria needs high accuracy, high power, and cost
   */
  public static Criteria createMediumCriteria() {

    Criteria c = new Criteria();
    c.setAccuracy(Criteria.ACCURACY_MEDIUM);
    c.setAltitudeRequired(false);
    c.setBearingRequired(false);
    c.setSpeedRequired(false);
    c.setCostAllowed(true);
    c.setPowerRequirement(Criteria.POWER_HIGH);
    return c;
  }

您是在谈论回调之外的
location.getLongitude()
调用吗? 如果这就是你所说的,那么就不能保证手机会有GPS或启用GPS。在这两种场景中,您都会得到一个空响应。虽然很难满足所有的场景,但你最好从网络提供商那里获得位置,这很可能在那里。此外,我会使用
标准
生成器来获得更适合您需要的连接。例如,如果你只想知道一个用户在哪个城市,GPS就太危险了

//force last known location from network provider
String providerName = LocationManager.NETWORK_PROVIDER;
if (mLocationManager.isProviderEnabled(providerName)) {
  Location lastLocation = mLocationManager.getLastKnownLocation(providerName);
}

//get high accuracy provider
providerName = mLocationManager.getBestProvider(createMediumCriteria(), true);
if (providerName == null) {
  // get low accuracy provider
  providerName = mLocationManager.getBestProvider(createLowCriteria(), true);
}

if (providerName == null) {
  //get low accuracy even if its disabled
  providerName = mLocationManager.getBestProvider(createLowCriteria(), false);
}

if (providerName != null && mLocationManager.isProviderEnabled(providerName)) {

  Location lastLocation = mLocationManager.getLastKnownLocation(providerName);

  if (lastLocation != null) {
    onLocationChanged(lastLocation);
  }
  //else {
  //timeout after 30 seconds.
  if (!sLocationHandler.hasMessages(MSG_UNREGISTER)) {
    sLocationHandler.sendEmptyMessageDelayed(MSG_UNREGISTER, 30000);
  }

  //LocationProvider provider = locMgr.getProvider(providerName);
  // using low accuracy provider... to listen for updates
  mLocationManager.requestLocationUpdates(providerName, 0, 0f, this);
  //}
标准构建器将类似于:

  /**
   * this criteria will settle for less accuracy, high power, and cost
   */
  public static Criteria createLowCriteria() {

    Criteria c = new Criteria();
    c.setAccuracy(Criteria.ACCURACY_LOW);
    c.setAltitudeRequired(false);
    c.setBearingRequired(false);
    c.setSpeedRequired(false);
    c.setCostAllowed(true);
    c.setPowerRequirement(Criteria.POWER_LOW);
    return c;
  }

  /**
   * this criteria needs high accuracy, high power, and cost
   */
  public static Criteria createMediumCriteria() {

    Criteria c = new Criteria();
    c.setAccuracy(Criteria.ACCURACY_MEDIUM);
    c.setAltitudeRequired(false);
    c.setBearingRequired(false);
    c.setSpeedRequired(false);
    c.setCostAllowed(true);
    c.setPowerRequirement(Criteria.POWER_HIGH);
    return c;
  }

使用网络提供商获取位置,因为很多时候GPS会给出零纬度和零经度

   m_locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0, this);
    m_location = m_locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
在清单中添加以下权限

<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" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

使用网络提供商获取位置,因为很多时候GPS会给出零纬度和零经度

   m_locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0, this);
    m_location = m_locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
在清单中添加以下权限

<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" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />


似乎无法确定lastKnownLocation,因此它将为您提供
null
,因此,您可以使用任何
Location
方法,直到实际获得添加一些日志的
位置
可能的副本,以便更好地理解。似乎无法确定LastKnown位置,因此它会为您提供
null
,因此,您可以使用任何
Location
方法,直到实际获得添加一些日志的
Location
可能的副本,以便更好地理解。是的,我说的是回调之外的Location.getLongitude()。是的,我说的是回调之外的Location.getLongitude()