2016-04-08 14 views
1

私は少しの経験プログラミングでアンドロイドのためのアプリを作成しようとしています。私は携帯電話のGPSを使用してgoogleマップ上の場所を決定し、その後アクションが起こるようにしたい。アクションは場所に基づいており、ユーザにアクションを起こす場所を指定させたいと思っています。特定の場所にいるユーザーの場所を使用するにはどうすればいいですか?場所は場所に基づいて行動を引き起こすでしょう

私に指摘できるリソースやウェブサイトがあれば、本当に感謝します。

私は現在アンドロイドスタジオのみを使用していますが、他に必要なものはありますか?

+0

私が探しているのは、LocationManagerと連携して使用されると思われるジオフェンシングです。あなたがまだ助けてくれると思うなら、大いに感謝します。私はその間にもっと多くを探しています。 – Taquitoburrito

答えて

1

まず、現在のユーザーの場所が必要です。 hereの手順に従って、入手することができます。 locationManagerはonLocationChanged(Location loc)メソッドを提供します。このメソッドは、ロケーションが変更されたときに自動的にトリガーされます。ここであなたの "行動"を実装することができます。私がユーザーの場所の指定が引き金を引かなければならないものを理解しているかどうかはわかりません。 特定の「アクション」をトリガーする場合は、onMapClickListenerをマップに設定してonMapClicked(Location loc)メソッドを実装できます。

「事前定義された場所」の構築方法によって、さまざまな可能性があります。

1)これらの場所はポイントですか? - >あなたは真円(または球)距離を計算することができ、その距離に関連して、何かをトリガーするかどうかを決定します。

2)は、2dの長方形の場所ですか? - > LatLngBoundsとそのcontains(LatLng点)メソッドを使用して、ユーザーの場所またはユーザー指定の場所が内部にあるかどうかを判断します。

3)はどのポリゴンですか? hereはそのような場所を作成する方法の良い例です。 contains()メソッドもあります。

4)あなたの場所はあらかじめ定義されていませんか?この場合、あなたが何をしたいのかについてもっと多くの情報が必要です。ウルコメントに基づいて

編集: ので、あなたのアプリがすべき2つのことがあります: 1)は、ユーザが「場所」を入力するか、来ているとき、ちょうどメッセージをポップアップのようないくつかのアクションを()行います「場所」の近く 2)ユーザーにそのような場所を自分で作成する可能性を与えます。

セカンダリは、マップにonMapClickListenerを追加することで実行できます。

@Override 
public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 

    mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { 
     @Override 
     public void onMapClick(LatLng latLng) { 
      // latLng is the lcoation, tapped by the user on the map. lets save it 
      chosen_location = new LatLng(latLng.latitude, latLng.longitude); 
     } 
    }); 
} 

これは、単一のポイントを保存し、ユーザーが地図上にタブで表示します。後でポリゴンを追加する場合は、このポイントをポイントのArrayListに追加することができます。しかし、おそらくユーザーは、そのポイントについての詳細情報を追加したいと思うでしょう。 EditTextを利用して、ユーザーに、その点(またはそれ以降のポリゴン)の説明を入力し、最後に「入力した場所を保存する」ボタンをクリックすると、ArrayListに追加できます。また、どこからでも複数の人が作成した場所のリストを更新したり取得したりするために、サーバーバックエンドを使用することもできます。

今のところ、ユーザーはnearToに、このような点に来たか、そのような多角形を入力した場合は上に行くとチェックすることができます:

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 35000, 10, new LocationListener() { 
     @Override 
     public void onLocationChanged(Location location) { 
      // the users location changed (e.g. he moved some meters) 
      current_location = new LatLng(location.getLatitude(), location.getLongitude()); 
      // somehow get all the places (i guess a server backend is recommended) 
      // for now, lets say all the places are already obtained into an Arraylist called places: 
      ArrayList<LatLng> places = new ArrayList<LatLng>; 

      // Go check for each of the places, if the users current location is near to such a point 
      for (LatLng place : places) { 
       if (distance(place,current_location)<100) { 
        LatLng near_place = place; 
        // here we are! near_place is near the users current location, lets do some action 
        Log.d("app","Users location (" + current_location.latitude +","+current_location.longitude+") is near to a place with coordinates "+near_place.latitude+","+near_place.longitude+")."); 
       } 
      } 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 

     } 

     @Override 
     public void onProviderEnabled(String provider) { 

     } 

     @Override 
     public void onProviderDisabled(String provider) { 

     } 
    }); 
} 

、ここでは緯度経度の間メートルで(球状の)距離を計算する方法でありますオブジェクト:

/** 
* method calculate distance between two LatLng points in meter 
*/ 
public float distance(double lat_a, double lng_a, double lat_b, double lng_b) { 
    double earthRadius = 3958.75; 
    double latDiff = Math.toRadians(lat_b - lat_a); 
    double lngDiff = Math.toRadians(lng_b - lng_a); 
    double a = Math.sin(latDiff/2) * Math.sin(latDiff/2) + 
      Math.cos(Math.toRadians(lat_a)) * Math.cos(Math.toRadians(lat_b)) * 
        Math.sin(lngDiff/2) * Math.sin(lngDiff/2); 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
    double distance = earthRadius * c; 

    int meterConversion = 1609; 

    return new Double(distance * meterConversion).floatValue(); 
} 
+0

私は、Googleの場所で盛り込まれたプレースポイントを使用することを考えていましたが、後でもっと経験したときに多分ポリゴンに移りましたが、複数のユーザーによって作成されたり、 – Taquitoburrito

+0

私は答えを更新しました。しかし、おそらく、ユーザーや地元の企業が検索した場所のリストを使ってサーバーを稼働させたいと思うかもしれません。 – MojioMS

+0

私は愛していると思う、ありがとう! – Taquitoburrito

関連する問題