我已经在这个问题上工作了很长时间,我仍然没有想到一个解决方案:让我们说有人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上查看关于地理定位的教程,但我还没有找到解决方案。
答案 0 :(得分:1)
按照 GeoFire: How to add extra conditions within the query?,您只能根据它们到给定点的距离进行过滤,并且不能添加任何其他条件(例如按照它们设置的距离过滤)。
因此,它适合于获取人员的地理位置,与其他用户设置的半径进行比较并相应地进行过滤。如果您担心将大数据返回到移动设备,您可以考虑使用GeoFire.js创建一个与服务器上的此数据交互的网络服务,并将过滤后的数据返回给移动设备。