2016-11-29 4 views
1

私はこの問題を長年取り組んできましたが、まだ解決策は考えていません:A、B、C、自分の写真を含むプロフィールページと自分自身の簡単な紹介を公開することができ、近隣の特定の人にこれらのプロフィールを見せることができます。この距離を「半径」としましょう。例えば、ある人が大学生であれば、大学キャンパスの人に自分のプロフィールを見せることができますが、キャンパス外の人は見られません。人A、B、Cがそれぞれ人Dから1,2,8マイル離れており、A、B、Cがそれぞれ2,3,5であるとすると、人D DはAとBの「半径」内にあり、Cではなく「A」と「B」のプロファイルを見ることができます(2> 1,3> 2、しかし5 < 8)AndroidのFirebaseはデータをフィルタリングするためにジオロケーションを使用します

私は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からすべての位置と半径のペアを取得し、各ペアについて、彼が特定の人々の「半径」内にいるかどうかを計算します。彼が特定の人々の「半径」内にいる場合、これらの人々のプロフィールは彼の画面に表示されます。これは、機能を達成するための正しい、最も効果的な方法ですか?私はFirebaseとAndroidでこれを行う方法がわかりません。具体的には、アプリケーションが画面上にArraylistの名前を選択的に表示するように上記のコードを変更する方法はわかりません。イテレータはArraylistのすべてのメンバーを通過します。

Firebaseから特定のデータを選択的に取得するのではなく、距離が半径より小さい場合はFirebaseからその人物のプロファイルを取得して画面に表示することはできますか?

ご協力いただきありがとうございます。投稿に多くの情報があります。私はFirebaseとAndroidのジオロケーションについてのチュートリアルを一日中見てきましたが、まだ解決策は見つかりませんでした。

答えて

1

GeoFire: How to add extra conditions within the query?によれば、指定されたポイントまでの距離だけをフィルタリングすることができ、別の条件を追加することはできません。

その人のジオロケーションを取得し、他のユーザーが設定した半径と比較し、それに応じて適切なものにすることが適切です。大きなデータがモバイルデバイスに返されることが心配な場合は、GeoFire.jsを使用してサーバー上のこのデータとやりとりし、フィルタリングされたデータをモバイルデバイスに返すWebサービスを作成することを検討してください。

関連する問題