Google API v2 location.getLatitude()返回nullpointerexception

时间:2014-08-15 19:43:29

标签: java android nullpointerexception google-maps-android-api-2

好的问题是,当我使用下面的代码时,使用ACCURACY_COARSE,一切正常,除了位置不准确到我所在的位置。

// Creating a criteria object to retrieve provider
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);

// Getting LocationManager object from System Service
// LOCATION_SERVICE
LocationManager locationManager = (LocationManager) getActivity().getApplicationContext()
        .getSystemService(LOCATION_SERVICE);

// Getting the name of the best provider
String provider = locationManager.getBestProvider(criteria, true);

// Getting Current Location
Location location = locationManager.getLastKnownLocation(provider);

if (location != null) {
    onLocationChanged(location);
}

locationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES,
                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

// Get current location Latitude and Longitude
double lat = location.getLatitude();
double lng = location.getLongitude();

但是当我使用这段代码时,我会从location.getLatitude()获得nullpointerexception;

// Creating a criteria object to retrieve provider
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);

// Getting LocationManager object from System Service
// LOCATION_SERVICE
LocationManager locationManager = (LocationManager) getActivity().getApplicationContext()
        .getSystemService(LOCATION_SERVICE);

// Getting the name of the best provider
String provider = locationManager.getBestProvider(criteria, true);

// Getting Current Location
Location location = locationManager.getLastKnownLocation(provider);

if (location != null) {
    onLocationChanged(location);
}

locationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES,
                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

// Get current location Latitude and Longitude
double lat = location.getLatitude();
double lng = location.getLongitude();

问题在于设定准确性的问题。

当我使用它时,我得到一个NullPointerException

// Creating a criteria object to retrieve provider
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);

当我使用它时一切正常。

// Creating a criteria object to retrieve provider
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);

哦,这是我的明显权限

<permission
    android:name="com.where.common.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.where.common.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />

2 个答案:

答案 0 :(得分:0)

我在Accuracy值上找到了这个资源,可能有助于确定使用它们的方式/方式。这可能会让您避免遇到的问题。似乎setAccuracy期望COURSE或FINE的值,而有其他方法(setVerticalAccuracy,setHorizo​​ntalAccuracy和setSpeedAccuracy)将接受ACCURACY_LOW,MEDIUM和HIGH。但是,这些工作方式略有不同。 Accuracy Info

答案 1 :(得分:0)

当您申请Criteria.ACCURACY_FINE的位置时,可能需要更多时间才能获得该位置。因此,当您尝试location.getLatitude()时,您将获得NPE。 我按照here所述的Location使用google services。这样当检测到位置时,您将获得回调,然后您可以访问其坐标。