Android:当用户在 20m 时显示 MapMarker 信息

Posted

技术标签:

【中文标题】Android:当用户在 20m 时显示 MapMarker 信息【英文标题】:Android : Show MapMarker info when user is in 20m way 【发布时间】: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 ***.com/questions/28209548/… 检查距离 所以可能我需要使用带有坐标的数组,并且需要一直比较它是否靠近任何标记,当它靠近时,它应该从数组中获取 id,获取 snipet 值并对其进行广告某种观点。可悲的是,我只需要这个应用程序 8 小时,之后它将成为历史:D 嗯,还有另一种方法,你可以设置地理围栏 【参考方案1】:

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

【讨论】:

以上是关于Android:当用户在 20m 时显示 MapMarker 信息的主要内容,如果未能解决你的问题,请参考以下文章

当用户在运行时权限对话框上单击拒绝时显示 DialogFragment

过度滚动时显示标题的Android Listview

在 Android 中显示对话框时显示 AppBar

当用户点击一个键时显示一条消息

当用户登录时显示“注销”按钮,当他不使用 PHP/MySQL 时显示“连接”

如何在后台运行android应用程序时显示通话屏幕