【问题标题】:Android : Show MapMarker info when user is in 20m wayAndroid:当用户在 20m 时显示 MapMarker 信息
【发布时间】:2018-02-17 08:45:35
【问题描述】:

我是 Android 开发的新手,第一个项目很艰难。 :D

所以背景故事:

我有 MapActivity 从 MySql DB 获取 MapMarkers (php -> Json)

现在我有一张地图,其中一些标记和用户位置是已知的。

我想做什么? 简单..当用户靠近标记(比如说 20m)时,他会得到 弹出窗口,他可以提交他在那里..

问题是我不知道该怎么做.. 我的代码很糟糕,但它可以工作: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();

        }

    }

}

【问题讨论】:

  • 您需要使用位置监听器developer.android.com/training/location/…
  • Ty 响应,到目前为止我也得到了但我不知道如何编写它以便它会检测地图上的标记,范围也应该是 20m :(
  • 在您的 OnLocationResult 方法中,您将有一个条件检查是否靠近您的任何标记 github.com/googlesamples/android-play-location/blob/master/… 您可以使用 Location.distanceto stackoverflow.com/questions/28209548/… 检查距离
  • 所以可能我需要使用带有坐标的数组,并且需要一直比较它是否靠近任何标记,当它靠近时,它应该从数组中获取 id,获取 snipet 值并对其进行广告某种观点。可悲的是,我只需要这个应用程序 8 小时,之后它将成为历史:D
  • 嗯,还有另一种方法,你可以设置地理围栏

标签: java android json google-maps location


【解决方案1】:

您可以使用这些设置 GeoFences (https://developer.android.com/training/location/geofencing.html),您可以创建一个区域,当用户进入它或者您将在您的意图服务中获得一个意图时,您可以在任何地方使用该信息。

【讨论】:

    猜你喜欢
    • 2016-05-13
    • 1970-01-01
    • 2021-09-10
    • 2016-12-26
    • 2017-04-21
    • 1970-01-01
    • 2015-11-06
    • 2021-02-28
    • 1970-01-01
    相关资源
    最近更新 更多