1

我在诺基亚 N73上安装了Google Maps Java 2 ME 应用程序,它支持 Location API (JSR 179),但没有内置 GPS 传感器。“我的位置”功能正常工作,并且能够精确定位我在城市中的位置。

当我尝试访问CellID、LAC和其他相关数据时,我得到了空值。那么地图是如何计算我的位置的呢?是因为他们的应用程序是用证书签名的吗?(我的不是)

4

2 回答 2

2

它的作用是测量该地区 WiFi、3G 和 GSM 基站/接入点的信号强度。由于所有 WiFi 接入点都有唯一的 MAC 地址,并且 3G 和 GSM 基站也有唯一的标识,因此它现在可以根据强度知道您靠近哪些基站以及您与它们的大致距离。

现在有几种方法可以找到距离。如果它知道接入点/基站的位置,那么它可以根据信号强度对您的位置进行三角测量。为此,它需要访问至少 3 个 AP/BS。借助 GSM,它还可以使用 Timer Advance,它可以估计您与基站的距离,准确度约为 1 公里。有了3G就更好了。

另一种方法(谷歌和其他人使用)是将所有信号强度数据发送到服务器。如果您有 GPS,那么您的 GPS 信息也会一起发送。然后,服务器可以在不同坐标处构建到不同 AP/BS 的信号强度图。由于您没有 GPS,它现在会比较您传递的信号强度并尝试在其数据库中找到最接近的匹配,然后在该最近点找到位置。

于 2009-08-29T15:06:27.343 回答
1

这在 J2ME 中使用JSR 179定义的 API 很容易做到。这里有一个简单的示例:JavaME Location API Example application with Source Code(在撰写本文时该页面已损坏;这是Google Cache 版本)。

该示例在我的诺基亚 E63 上完美运行,与您的N97 N73 一样,它没有 GPS,但支持基于蜂窝的定位。这是它的核心:

public void checkLocation() throws Exception
{
    String string;
    Location l;
    LocationProvider lp;
    Coordinates c;

    // Set criteria for selecting a location provider:
    // accurate to 500 meters horizontally
    Criteria cr = new Criteria();
    cr.setHorizontalAccuracy(500);

    // Get an instance of the provider
    lp = LocationProvider.getInstance(cr);

    // Request the location, setting a one-minute timeout
    l = lp.getLocation(60);
    c = l.getQualifiedCoordinates();

    if(c != null ) {
      // Use coordinate information
      double lat = c.getLatitude();
      double lon = c.getLongitude();
      string = "\nLatitude : " + lat + "\nLongitude : " + lon;

    } else {
        string ="Location API failed";
    }
    midlet.displayString(string);
}

@Marius 关于该技术的工作原理是正确的,但 JSR 179 API 对您隐藏了所有这些细节。@JaanusSiim 是错误的,您不能从 J2ME 执行此操作。

请注意,示例应用程序不需要签名即可工作 - 手机会弹出一个提示,询问是否允许未签名的应用程序访问您的位置信息。

于 2009-10-16T11:58:58.157 回答