使用 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)

有没有办法重新询问用户获取他的位置的权限,或者使用带有 javascript 的地理定位 API 删除旧设置?

在特定时间获得最佳位置

Kindle:获取最远阅读位置

如何使用 Traccar API 获取实时位置?