使用 API 19(特别是 S5)使用位置服务获取 nullpointerexception
Posted
技术标签:
【中文标题】使用 API 19(特别是 S5)使用位置服务获取 nullpointerexception【英文标题】:Getting a nullpointexception with location services with API 19 (S5 in particular) 【发布时间】:2014-07-13 07:06:34 【问题描述】:我的应用在 S5 设备上遇到问题(在两个设备上测试),但它在 s4 和 s3 上运行良好。我认为这与 Kitkat API 19 与 18 有关。我测试了各种配置,虽然它每次都可以在 S3 上运行,但除非位置服务开启并且我加载了全新安装,否则 S5 将无法运行。我已将所有相关代码放在下面:
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//set up Factual
FactualRetrievalTask task=new FactualRetrievalTask();
//set up location
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
String provider=locationManager.getBestProvider(newCriteria(), true);
Location l = locationManager.getLastKnownLocation(provider);
locationManager.requestLocationUpdates(provider, 2000, 10,
locationListener);
//ask for all places within the nearest x meters.
Query q=new Query()
.within(new Circle(l.getLatitude(), l.getLongitude(), 5000))
.sortAsc("$distance")
.only("name","price")
.limit(25);
task.execute(q);
定位服务的设置
public Criteria newCriteria()
Criteria c = new Criteria();
c.setAccuracy(Criteria.ACCURACY_FINE);
c.setPowerRequirement(Criteria.POWER_LOW);
c.setAltitudeRequired(false);
c.setBearingRequired(false);
c.setSpeedRequired(false);
c.setCostAllowed(true);
return c;
public void updatedWithNewLocation(Location location)
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location l = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
//Location Listener
LocationListener locationListener = new LocationListener()
public void onLocationChanged(Location location)
updatedWithNewLocation(location);
public void onProviderDisabled(String provider)
public void onProviderEnabled(String provider)
public void onStatusChanged(String provider, int status, Bundle extras)
;
我收到一条错误消息,告诉我查询中存在 NullPointException(再次仅在 s5 设备上),但我不明白为什么它只发生在 API 19 手机上。我将不胜感激。
【问题讨论】:
截至今天(2014 年 5 月 23 日)的最新 android 版本是 4.4.2。你可能误会了那里的一些信息。 很抱歉让我感到困惑,虽然 API 19 是 4.4.3,但我更改了内容以仅反映 API 级别。 【参考方案1】:getLastKnownLocation
方法不能保证返回一个值,这样它可能会在Query
行崩溃是可以理解的,一个常见的修复是这样的:
Location l = locationManager.getLastKnownLocation(provider);
if(l != null)
Query q=new Query()
.within(new Circle(l.getLatitude(), l.getLongitude(), 5000))
.sortAsc("$distance")
.only("name","price")
.limit(25);
else
// wait until you have a location update `onLocationChanged(Location)` to do the query
为什么这个 S5 没有给你一个位置,那是另一个话题。 也许设置中禁用了位置服务?
【讨论】:
以上是关于使用 API 19(特别是 S5)使用位置服务获取 nullpointerexception的主要内容,如果未能解决你的问题,请参考以下文章
如何使用地名服务 api 而不是 html5 位置对象的东西获取国家/地区代码信息
使用 Google Play 服务我可以在离线模式下获取最新位置吗(FusedLocationProvider Api)