Android Firebase使用地理位置过滤数据

时间:2016-11-29 03:40:23

标签: java android firebase collections geolocation

我已经在这个问题上工作了很长时间,我仍然没有想到一个解决方案:让我们说有人A,B,C和D. person可以发布包含其图片的简介页面以及他们自己的简短介绍,并且他们可以允许其邻近区域内的某些人查看这些简档。我们将这个距离称为" radius"。例如,如果一个人是大学生,他可以允许他大学校园里的人看到他的个人资料,但不能看到校园外的人。让我们说人A,B,C分别与人D相距1,2,8英里,A,B和C设定他们的半径"然后,人D可以看到A和B的轮廓但不能看到C,因为D在"半径内#34; A和B但不是C.(2> 1,3> 2,但是5< 8)

我正在考虑如何使用Firebase和Android实现此功能。 Geofire是Firebase的地理定位库,但在这种情况下,我们并未主动搜索附近的人。在上面的例子中,A,B和C没有搜索D,而D没有搜索A,B和C.相反,如果D在" radius"由某些人设置,这些人的个人资料将自动显示在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);
            }
        });
    }

上述代码的问题是任何人都可以看到任何人创建的任何内容。使用的功能&#34; radius&#34;过滤那些可以看到一个人的个人资料缺席的人。

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

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

感谢您的帮助,我知道我的帖子中有很多信息。我花了几天时间在Firebase和android上查看关于地理定位的教程,但我还没有找到解决方案。

1 个答案:

答案 0 :(得分:1)

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

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