2016-11-29 2 views
1

저는 오랫동안이 문제를 해결해 왔지만 여전히 해결책을 생각하지 않았습니다. A, B, C, D 명의 사람들이 있다고 가정 해 봅니다. 각 사람 자신의 사진이 포함 된 프로필 페이지와 자신의 간단한 소개를 게시 할 수 있으며 인접 지역의 특정 사람들이 이러한 프로필을 볼 수 있도록 허용 할 수 있습니다. 이 거리를 "반지름"이라고합시다. 예를 들어 대학생 인 경우 대학 캠퍼스에있는 사람들이 자신의 프로필을 볼 수는 있지만 캠퍼스 외부의 사람들은 볼 수 없습니다. 사람 A, B, C가 사람 D와 각각 1,2,8 마일 떨어져 있고 A, B, C가 각각 "반지름"을 2,3,5로 설정했다면 사람 D D가 A와 B의 "반경"내에 있지만 C가 아닌 A와 B의 프로파일을 볼 수 있지만 C는 아닙니다. (2> 1,3> 2, 그러나 5 < 8)안드로이드 파이어베이스가 데이터를 필터링하기 위해 geolocation을 사용합니다.

나는 Firebase와 Android를 사용하여이 기능을 구현하십시오. Geofire는 Firebase의 Geolocation 라이브러리이지만,이 경우에는 가까운 사람들을 적극적으로 검색하지 않습니다. 위의 예에서 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에서 위치와 반경의 모든 쌍을 검색하고 각 쌍에 대해 특정 인물의 "반경"내에 있는지 여부를 계산합니다. 특정 인물의 "반경"내에 있으면이 사람들의 프로필이 화면에 표시됩니다. 이것이 기능을 달성하는 데 가장 정확하고 효과적인 방법입니까? 파이어베이스와 안드로이드로이 작업을 수행하는 방법을 모르겠다. 특히, 위의 코드를 변경하여 화면에 Arraylist의 일부 이름 만 표시하고 다른 이름은 표시하지 않는 방법을 모르겠다. 반복기는 Arraylist의 모든 구성원을 거치게됩니다.

모든 쌍의 위치와 반지름을 검색하는 대신 Firebase에서 특정 데이터를 선택적으로 검색 할 수 있습니까? (거리가 반경보다 작 으면 Firebase에서 해당 사용자의 프로필을 검색하여 화면에 표시합니다)?

도움을 주셔서 감사합니다. 게시물에 많은 정보가 있다는 것을 알고 있습니다. 나는 Firebase와 android에서 geolocation에 대한 튜토리얼을 보면서 하루 종일 보냈다. 아직 해결책을 찾지 못했다.

답변

1

GeoFire: How to add extra conditions within the query?에 따라 주어진 지점까지의 거리 만 필터링 할 수 있으며 다른 조건을 추가 할 수 없습니다 (예 : 거리 별 필터 설정).

그래서 사람의 지구 위치 정보를 얻고, 다른 사용자가 설정 한 반경과 비교하여 적절히 필터링합니다. 대용량 데이터가 모바일 장치에 반환 될지 걱정되는 경우 GeoFire.js을 사용하여 서버에서이 데이터와 상호 작용하고 필터링 된 데이터를 모바일 장치로 반환하는 웹 서비스를 만드는 것이 좋습니다.

관련 문제