【问题标题】:Android Firebase use geolocation to filter dataAndroid Firebase 使用地理位置过滤数据
【发布时间】:2016-11-29 03:40:23
【问题描述】:

我一直在研究这个问题,但我仍然没有想到解决方案:假设有 A、B、C 和 D 人。每个人都可以发布一个包含他们的个人资料页面图片和自己的简短介绍,他们可以让附近的某些人看到这些个人资料。我们称这个距离为“半径”。例如,如果一个人是大学生,他可以允许他的大学校园里的人看到他的个人资料,但不允许校园外的人看到。假设 A,B,C 分别与 D 相距 1,2,8 英里,A,B,C 分别将其“半径”设置为 2,3,5,则 D可以看到 A 和 B 的轮廓,但看不到 C,因为 D 在 A 和 B 的“半径”内,但不在 C 内。 (2>1,3>2,but 5

我正在考虑如何使用 Firebase 和 Android 来实现此功能。 Geofire 是 Firebase 的地理定位库,但在这种情况下,我们不会主动搜索附近的人。在上面的例子中,A、B、C 没有搜索 D,D 也没有搜索 A、B 和 C。相反,如果 D 在某些人设置的“半径”内,这些人的个人资料会自动出现在D的屏幕。所以 Geofire 在一定距离内搜索人的能力在这里并不适用。

这就是我目前所拥有的:我有一个显示人名的数组列表,在 arrayList 下方我有一个 editText 和一个按钮。一个人可以在 EditText 上输入他的名字,然后单击按钮后,将他或她的名字添加到 ArrayList 中。通过单击名称,其他用户可以看到一个人的个人资料。

private ArrayList<String> people = new ArrayList<>();
private DatabaseReference root =   FirebaseDatabase.getInstance().getReference().getRoot();
private Button button1;
private EditText name;
private ListView listview;

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

    super.onCreate(savedInstanceState);
        listview = (ListView) findViewById(R.id.listview);
        name = (EditText) findViewById(R.id.editText);
        button1 = (Button) findViewById(R.id.button1);
        arrayAdapter = new ArrayAdapter<String>(this,     android.R.layout.simple_list_item_1, people);
        listview.setAdapter(arrayAdapter);

   button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Map<String, Object> map = new HashMap<String, Object>();
                map.put(people.getText().toString(), "");
                root.updateChildren(map);

            }
        });

        root.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                Set<String> set = new HashSet<String>();
                Iterator i = dataSnapshot.getChildren().iterator();

                while (i.hasNext()) {
                    set.add(((DataSnapshot) i.next()).getKey());
                }

                people.clear();
                people.addAll(set);

                arrayAdapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

       listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent intent = new Intent(getApplicationContext(), people.class);
                intent.putExtra("name", ((TextView) view).getText().toString());
                startActivity(intent);
            }
        });
    }

上述代码的问题是任何人都可以看到任何人创建的任何东西。没有使用“半径”过滤可以查看个人资料的人的功能。

我正在考虑这样做:获取一个人的地理位置和他设置的“半径”并将它们更新到 Firebase。然后,当另一个人打开这个应用程序时,他会从 Firebase 中检索所有的位置和半径对,并且对于每一对,他都会计算他是否在某些人的“半径”内。如果他在某些人的“范围”内,这些人的资料就会显示在他的屏幕上。这是实现功能的正确和最有效的方法吗?我不知道如何使用 Firebase 和 Android 执行此操作,具体来说,我不知道如何更改上述代码,以便应用程序将选择性地在屏幕上显示 Arraylist 中的一些名称,而不是其他名称。迭代器只会遍历 Arraylist 的每个成员。

是否可以从 Firebase 选择性地检索某些数据,而不是检索所有位置和半径对(如果距离小于半径,则从 Firebase 检索该人的个人资料并将其显示在屏幕上)?

感谢您的帮助,我知道我的帖子中有很多信息。我整天都在看有关 Firebase 和 android 中地理定位的教程,但我仍然没有找到解决方案。

【问题讨论】:

    标签: java android firebase collections geolocation


    【解决方案1】:

    根据 GeoFire: How to add extra conditions within the query?,您只能按它们到给定点的距离进行过滤,而不能添加任何其他条件(例如按它们设置的距离进行过滤)。

    因此它适合获取人的地理位置,与其他用户设置的半径进行比较并进行相应的过滤。如果您担心大数据返回到移动设备,您可以考虑创建一个 Web 服务,使用 GeoFire.js 在服务器上与这些数据进行交互,并将过滤后的数据返回到移动设备。

    【讨论】:

      猜你喜欢
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      相关资源
      最近更新 更多