【问题标题】:android getlastknownlocation always null in emulatorandroid getlastknownlocation 在模拟器中始终为空
【发布时间】:2014-02-05 16:35:47
【问题描述】:

这似乎是一个常见问题,但我真的无法理解为什么会发生这种情况,即使我阅读了大量类似的问题。

我在模拟器设备上使用基本位置类,我设置了所有内容 - 权限(FINE 和 COARSE),我已经在 DDMS 中设置了坐标我也尝试使用 telnet 然后,但不管它总是在 getlastknownlocation 行上出现 nullpointer 异常而崩溃,有什么想法吗?

public class MainActivity extends Activity implements LocationListener {



private static LocationManager ok;
private Location L;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    ok=(LocationManager)this.getSystemService(ok.GPS_PROVIDER);
    L=ok.getLastKnownLocation(ok.GPS_PROVIDER);












}

@Override
public void onLocationChanged(Location Loc) {


    try {


        double latop=Loc.getLatitude();
        double longe=Loc.getLongitude();

        Log.i("OK", "and"+longe+""+latop);


    } catch (NullPointerException e)

    {

    }




}

【问题讨论】:

  • 这里有一些问题(例如,在尝试获取位置之前未检查哪些提供程序已启用或可用)可能会导致您的错误。不过,我建议您先阅读this documentation,了解如何获取用户位置。由于要使您当前的代码正常工作需要进行大量更改,因此重新开始可能会更有效率。
  • getlastknownlocation 如果没有最后一个已知位置,将返回 null,如果不调用更新,则需要检查是否有 lastknowlocation。我从不尝试使用模拟器进行定位,因为我真的觉得你需要做一些事情,让它在启用定位服务的情况下像普通手机一样工作。所以我的猜测是你总是得到空值,因为你正在使用模拟器。 GPS在室外也能很好地工作,在你家里面可能会失败并且不会为你提供位置。
  • 模拟器如何给出位置值。为了测试,我们必须使用 ddms-emulatorcontrol 内部的模拟器的默认 latlong。你必须使用设备来获取位置值..
  • 对不起,但我在设备上玩了很多位置,所以我知道一些东西,您提供的链接专门用于 Google Play 服务,GPS_PROVIDER 也启用了地理修复,我已经做了
  • 您的requestLocationUpdates() 电话在哪里?如果您没有,那可以解释您的症状。

标签: java android


【解决方案1】:

getLastKnownLocation() 通常会返回 null,如果最近没有应用请求您所需的提供商提供位置修复。

在模拟器上,它似乎更进一步:除非您的应用调用了requestLocationUpdates(),因此除非已将位置传送到模拟器,否则您不会获得位置。

使用getLastKnownLocation() 的一般模式是,如果您想要获得实际Location 的合理几率,则使用requestLocationUpdates()removeLocationUpdates() 以确保LocationManager 正在通过您选择的提供商积极寻找位置。当然,如果您愿意,也可以使用LocationListeneronLocationChanged(),而不是getLastKnownLocation()

【讨论】:

    【解决方案2】:

    @CommonsWare 的答案很明确。要在模拟器上获取非空值,请转到 Google Maps 应用程序,然后您会获得一些位置

    【讨论】:

      【解决方案3】:

      还有另一种选择,使用 locationManager.addTestProvider(); 创建您自己的提供程序;这样您就可以进行自己的测试了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-30
        • 1970-01-01
        • 1970-01-01
        • 2012-01-30
        相关资源
        最近更新 更多