我正在创建一个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:

10-05 21:28