Android:当用户以20米的方式显示MapMarker信息

时间:2017-09-08 12:09:09

标签: java android json google-maps location

我是Android开发的新手,并为第一个项目付出了艰辛。 :d

所以背后的故事:

我有MapActivity从MySql DB获取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();

        }

    }

}

1 个答案:

答案 0 :(得分:0)

您可以使用这些设置GeoFences(examples),您可以创建一个区域,当用户输入该区域时,您将获得意图服务的意图,那么它只是一个使用问题无论你喜欢哪个信息。