2017-09-08 51 views
0

我是Android開發人員的新手,爲第一個項目花了很大力氣。 :dAndroid:當用戶在20米的路上顯示MapMarker信息

所以後面的故事:

我有什麼MapActivity從MySQL數據庫得到MapMarkers(PHP - > JSON)

現在我有地圖,有一些標記和用戶位置是已知的。

而我想要做什麼? 簡單..當用戶接近到達標記(可以說20米)那麼他將獲得 彈出,在那裏他可以提交自己是有..

問題是,我不知道該怎麼做.. 我的代碼不好,但它的工作原理:D。

對於權利我有快速的解決方法(聯想標籤是有點舊的Android,但其他方式適用於Android 7.1 ..我希望有人可以幫助我在這裏:)。

public class kaart extends FragmentActivity implements OnMapReadyCallback { 

    MapFragment mapFragment; 
    GoogleMap gMap; 
    MarkerOptions markerOptions = new MarkerOptions(); 
    CameraPosition cameraPosition; 
    LatLng center, latLng; 
    String title; 
    String kirjeldus; 
    String vahend; 

    public static final String ID = "id"; //god to use for marker detection 
    public static final String TITLE = "nimi"; 
    public static final String KIRJELDUS = "kirjeldus"; 
    public static final String LAT = "lat"; 
    public static final String LNG = "lng"; 
    public static final String VAHEND = "vahend"; 

    private String url = "https://lammerdis.ee/orient/"; 
    String tag_json_obj = "json_obj_req"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.kaart); 

     mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.kaart); 
     mapFragment.getMapAsync(this); 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     gMap = googleMap; 
     gMap.getUiSettings().setMapToolbarEnabled(false); 
     gMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); //Võimalikud valikud MAP_TYPE_SATELLITE, MAP_TYPE_TERRAIN, MAP_TYPE_HYBRID, MAP_TYPE_NORMAL 
     gMap.getUiSettings().setZoomControlsEnabled(true); 
     gMap.getUiSettings().setCompassEnabled(true); 
     gMap.getUiSettings().setMyLocationButtonEnabled(true); 
     gMap.getUiSettings().setZoomGesturesEnabled(true); 

     // Kaardi alguse asukoha Zoomime Aida juurde 
     center = new LatLng(59.175597, 25.022103); 
     cameraPosition = new CameraPosition.Builder().target(center).zoom(10).build(); 
     googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

     getMarkers(); 

    } 

    private void addMarker(LatLng latlng, final String title, final String kirjeldus, final String vahend) { 
     markerOptions.position(latlng); 
     markerOptions.title(title); 
     markerOptions.snippet(kirjeldus); 

     if (vahend.equalsIgnoreCase("auto")) { 
      markerOptions.icon(BitmapDescriptorFactory.fromResource(R.mipmap.auto)); 
     } else { 
      markerOptions.icon(BitmapDescriptorFactory.fromResource(R.mipmap.jala)); } 

     gMap.addMarker(markerOptions); 

    } 

    // Korjame JSON-ist punktid kokku 
    private void getMarkers() { 
     StringRequest strReq = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { 

      @Override 
      public void onResponse(String response) { 
       Log.e("Response: ", response.toString()); 

       try { 
        JSONObject jObj = new JSONObject(response); 
        String getObject = jObj.getString("punktid"); 
        JSONArray jsonArray = new JSONArray(getObject); 

        for (int i = 0; i < jsonArray.length(); i++) { 
         JSONObject jsonObject = jsonArray.getJSONObject(i); 
         title = jsonObject.getString(TITLE); 
         kirjeldus = jsonObject.getString(KIRJELDUS); 
         vahend = jsonObject.getString(VAHEND); 
         latLng = new LatLng(Double.parseDouble(jsonObject.getString(LAT)), Double.parseDouble(jsonObject.getString(LNG))); 

         // Kuvame andmed kaardile 
         addMarker(latLng, title, kirjeldus, vahend); 
        } 


       } catch (JSONException e) { 
        // JSON error 
        e.printStackTrace(); 
       } 

      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.e("Error: ", error.getMessage()); 
       Toast.makeText(kaart.this, error.getMessage(), Toast.LENGTH_LONG).show(); 
      } 
     }); 

     AppController.getInstance().addToRequestQueue(strReq, tag_json_obj); 
     //kui punktid kaardil ja seadmes on lubatud asukohta otsida, siis kuvame kasutaja asukoha ka 
     //Kui on vanem android siis saame Manifestis kirjeldatud õigustega hakkama ja saaba sukoha kuvatud 
       if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == 
         PackageManager.PERMISSION_GRANTED && 
         ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == 
           PackageManager.PERMISSION_GRANTED) { 
        gMap.setMyLocationEnabled(true); //Kuvab asukoha punktina kaardil 
        gMap.getUiSettings().setMyLocationButtonEnabled(true); // Kuvab asukoha nupu (viskab ilusti oma asukohale) 
       } else { 
        //Kui on android 6.0 või uuem siis tuleb õiguseid küsida rakenduse käivitamisel 
        ActivityCompat.requestPermissions(this, new String[] { 
            Manifest.permission.ACCESS_FINE_LOCATION, 
            Manifest.permission.ACCESS_COARSE_LOCATION }, 
          PackageManager.PERMISSION_GRANTED); 
        //Kui õigused on lubatud siis tuleb neid rakendada, kõige lihtsam on kasutajale pasundada, et rakenduse restardiks 

        final Toast tag = Toast.makeText(this, R.string.OIGUSE_INFO, Toast.LENGTH_LONG); 
        tag.show(); 

        new CountDownTimer(50000, 1000) 
        { 
         public void onTick(long millisUntilFinished) {tag.show();} 
         public void onFinish() {tag.show();} 
        }.start(); 

     } 

    } 

} 
+0

您將需要使用位置偵聽器https://developer.android.com/training/location/receive-location-updates.html –

+0

Ty for response,我到目前爲止也是,但我不知道如何寫它會檢測地圖上的標記也應該是20米:( – Jaanus

+0

在你的OnLocationResult方法,你將有一個條件檢查是否接近你的標記 https://github.com/googlesamples/android-play-location /blob/master/LocationUpdates/app/src/main/java/com/google/android/gms/location/sample/locationupdates/MainActivity.java 您可以使用Location.distance來檢查距離https://stackoverflow.com/questions/28209548/android-how-to-use-location-distanceto –

回答