我正在创建一个Android应用程序(Uber克隆)。在此,我使用Firebase列出用户创建的游乐设施。
游乐设施以以下格式存储。
{
"category" : "NUVO",
"driverids" : "",
"drop_lat" : "40.7127753",
"drop_long" : "-74.0059728",
"estdate" : "Wed@Feb@28th",
"estmile" : "4.19",
"esttime" : "01:02@PM",
"esttotalfare" : "4.61",
"fareest" : "1.1",
"g" : "t9z83wv46x",
"l" : [ 40.674426, -73.944033 ],
"notes" : "Gv",
"orgin_lat" : "145 Brooklyn Ave, Brooklyn, NY 11213, USA%20New York, NY, USA",
"request_id" : "5a75579740d166e95b8b4567",
"requested_category" : "FAM_SUV",
"rider_id" : "5a507bf340d16660288b4567",
"status" : 1,
"trip_id" : 0
}
现在,我正在使用GeoFire的GeoQuery的queryAtLocation来选择距他当前位置仅5公里的所有游乐设施。
该查询使用字段“ l”中的lat&lang并将其与驱动程序的当前位置lat&lang进行比较。
如果列表的经纬度在5公里之内,它将返回键,即子级“ l”的父级名称。
现在我目前在印度。我使用Lockito App修复了模拟GPS在印度的位置。之后,我在5公里半径内创建一个Ride。
现在,该游乐设施已成功列在驱动程序列表中。没问题。
我的问题
但是,当我在美国修复模拟GPS位置时,此流程无法正常工作。我将驾驶员的位置固定在布鲁克林·Childeren博物馆上,并在同一博物馆上进行了骑行。但是GeoQuery没有调用onKeyEntered。它只是在调用GeoQueryReady函数之后存在。
我从应用程序中检查了我当前的Lat&Lang,它返回为
40.67434763453142,-73.94402358680964
。我对照字段“ l”上的lat&lang对此进行了检查。(请参阅上面的JSON)。两者都指向相同的位置。但是GeoQuery无法检索到它
我的问题
为什么会发生此问题?如果我使用印度的位置。地理查询工作完美。
但是为什么它在美国失败了。
您可能会说:“ lockito中将出现问题”。但是Lockito返回了正确的位置lat lang。我在Logcat中检查了它。并且,如果Lockitto中存在问题,那么它在印度的运作方式如何。
这是我的GeoQoery代码:
try {
showDialog();
double nearByDistanceRadius = 5.00d;
com.firebase.geofire.GeoFire geoFire = new com.firebase.geofire.GeoFire(FirebaseDatabase.getInstance().getReference().child(childtype));
final com.firebase.geofire.GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(latitude, longitude), nearByDistanceRadius);
geoQueryEventListener=new GeoQueryEventListener() {
@Override
public void onKeyEntered(final String key, GeoLocation location) {
Toast.makeText (getApplicationContext(), "The key is = ",Toast.LENGTH_LONG).show();
}
@Override
public void onKeyExited(final String key) {
System.out.println("ON KEYEXITED"+key);
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
System.out.println("ON KEYMOVED"+key);
}
@Override
public void onGeoQueryReady() {
System.out.println("ON KEYQUERYREADY");
@Override
public void onGeoQueryError(DatabaseError error) {
System.out.println("ON KEYERROR"+error);
}
};
geoQuery.addGeoQueryEventListener(geoQueryEventListener);
} catch (Exception e) {
e.printStackTrace();
}
上面,除了
onGeoQueryReady
,如果我使用USA,则不会调用任何方法。但这是在印度工作。谁能告诉我为什么呢?
最佳答案
这也许早已尘土飞扬,但也许可以帮助其他人。
自从你提到了它的模拟GPS坐标。您可能手动输入了它们。
GeoFire使用特殊的g:“代码”(10位代码),按地区/城市
如果您在相同的城市/国家/地区使用相同的g码(在印度,则为您的情况)就可以正常工作!
但是,如果您在另一个国家/地区使用相同的代码,则geoQuery将失败。使它工作。您需要在代码中添加一行
geoFire.SetLocation()和美国境内的某个人只需运行一次该代码。 geoFire将在g:“” Location中保存一个特殊键。获得密钥后,您可以从应用程序中删除该行。
您可以使用geoFire生成的密钥在美国手动输入所需的任意位置,geoQuery始终可以在该位置使用!确保使用与geoFire相同的模式。
G:
l:
0:
1: