我在支持Location API(JSR 179)的Nokia N73上安装了 Google Maps Java 2 ME应用程序,但没有内置GPS传感器。 “我的位置”功能正常工作,能够确定我在城市中的位置。
当我尝试访问CellID, LAC和其他相关数据时,我得到了空值。那么地图如何计算我的位置呢?是因为他们的应用程序是用证书签名的吗? (我的不是)
答案 0 :(得分:2)
它的作用是测量该地区的WiFi,3G和GSM基站/接入点的信号强度。由于所有WiFi接入点都具有唯一的MAC地址,并且3G和GSM基站也具有唯一标识,因此它现在根据强度知道您接近哪个基站以及它们与您的接近程度。
现在有几种方法可以找到距离。如果它知道接入点/基站的位置,那么它可以根据信号强度对您的位置进行三角测量。为此,它需要能够访问至少3个AP / BS。使用GSM,它还可以使用Timer Advance,它可以估算出距离基站有多远,精度约为1km。使用3G甚至更好。
另一种方法(谷歌和其他人使用)是将所有信号强度数据发送到服务器。如果您有GPS,那么您的GPS信息也会被发送。然后,服务器可以在不同坐标处为不同的AP / BS建立信号强度图。由于您没有GPS,它现在会比较您传递的信号强度,并尝试在其数据库中找到最接近的匹配,然后找到最近点的位置。
答案 1 :(得分:1)
使用JSR 179定义的API在J2ME中很容易做到这一点。这里有一个简单的例子:JavaME Location API Example application with Source Code(在撰写本文时该页面已被删除;此处为Google Cache version)。
该样本在我的诺基亚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做到这一点。
请注意,示例应用程序不需要签名即可运行 - 手机会弹出一个提示,询问是否允许未签名的应用程序访问您的位置信息。