Search code examples
androidgoogle-mapsgoogle-maps-markersonlongclicklistener

Add marker on Google Map using setOnMapLongClickListener in Android for every version


I am trying to draw poligon on Google Map in android. To draw the polygon I added multiple marker on Google Map using mMap.setOnMapLongClickListener and connected those using a loop. I did it successfully. But the setOnMapLongClickListener is not working for Android Upgraded Version(6.0).

I added my code.

mMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
            @Override
            public void onMapLongClick(LatLng latLng) {
                mMap.addMarker(new MarkerOptions().position(new LatLng(latLng.latitude, latLng.longitude)).title("Marker of Finder"));
                // data formating for server
                JSONArray coordinateJsonArray = new JSONArray();
                try {
                    coordinateJsonArray.put(latLng.longitude);
                    coordinateJsonArray.put(latLng.latitude);
                } catch (JSONException e) {

                }
                list.add(coordinateJsonArray);
                markers.add(new LatLng(latLng.latitude, latLng.longitude));
                if (markers.size() > 2) {
                    removeGeofenceImageButton.setVisibility(View.VISIBLE);
                    for (int i = 0; i < markers.size() - 1; i++) {

                        polygon3 = mMap.addPolygon(new PolygonOptions()
                                .add(new LatLng(markers.get(i).latitude, markers.get(i).longitude),
                                        new LatLng(markers.get(i + 1).latitude, markers.get(i + 1).longitude),
                                        new LatLng(markers.get(0).latitude, markers.get(0).longitude))
                                .strokeColor(0x82662d91)
                                .fillColor(0x82662d91)
                                .strokeWidth(1)
                        );
                    }
                }
                Log.d("Polygone", markers.toString());
            }
        });

I added map fragment within FrameLayout. Here is xml code

<FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/mapLayout"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <fragment
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:longClickable="true"
            tools:context="com.finder.gps.tracker.activity.MainActivity" />

        <!--<ImageButton-->
            <!--android:id="@+id/remove"-->
            <!--android:layout_width="wrap_content"-->
            <!--android:layout_height="wrap_content"-->
            <!--android:layout_gravity="right|center"-->
            <!--android:background="@color/background"-->
            <!--app:srcCompat="@android:drawable/ic_delete" />-->



        <Button
            android:id="@+id/add_geofence"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:background="#c7ffffff"
            android:text="Add Geofence"
            android:textColor="@color/black" />

    </FrameLayout>

I tested this code. It worked for Android Version upto 5.0.

Let me know how can I enable user to add marker on google map for every version in Android.


Solution

  • I found the solution. The problem was related to permissions allowance in android 6.0+. I added permission checking and this solved my problem. Menifest permission is not enough for 6 and 6+ android.

    Here is my solution.......

    boolean permissionGranted = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
    
            if (permissionGranted) {
                // {Some Code}
                mMap.setMyLocationEnabled(true);
    
                mMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
                    @Override
                    public void onMapLongClick(LatLng latLng) {
                        mMap.addMarker(new MarkerOptions().position(new LatLng(latLng.latitude, latLng.longitude)).title("Marker of Finder"));
                        JSONArray coordinateJsonArray = new JSONArray();
                        try {
                            coordinateJsonArray.put(latLng.longitude);
                            coordinateJsonArray.put(latLng.latitude);
                        } catch (JSONException e) {
    
                        }
                        list.add(coordinateJsonArray);
                        markers.add(new LatLng(latLng.latitude, latLng.longitude));
                        if (markers.size() > 2) {
    //                    removeGeofenceImageButton.setVisibility(View.VISIBLE);
                            for (int i = 0; i < markers.size() - 1; i++) {
    
                                polygon3 = mMap.addPolygon(new PolygonOptions()
                                        .add(new LatLng(markers.get(i).latitude, markers.get(i).longitude),
                                                new LatLng(markers.get(i + 1).latitude, markers.get(i + 1).longitude),
                                                new LatLng(markers.get(0).latitude, markers.get(0).longitude))
                                        .strokeColor(0x82662d91)
                                        .fillColor(0x82662d91)
                                        .strokeWidth(1)
                                );
                            }
                        }
                        Log.d("Polygone", markers.toString());
                    }
                });
            } else {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 200);
            }
    

    and

    @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            switch (requestCode) {
                case 200: {
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        // {Some Code}
                        Toast.makeText(getApplicationContext(), "Permission Granted", Toast.LENGTH_SHORT).show();
    
                        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                            // TODO: Consider calling
                            //    ActivityCompat#requestPermissions
                            // here to request the missing permissions, and then overriding
                            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                            //                                          int[] grantResults)
                            // to handle the case where the user grants the permission. See the documentation
                            // for ActivityCompat#requestPermissions for more details.
                            return;
                        }
                        mMap.setMyLocationEnabled(true);
    
                        mMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
                            @Override
                            public void onMapLongClick(LatLng latLng) {
                                mMap.addMarker(new MarkerOptions().position(new LatLng(latLng.latitude, latLng.longitude)).title("Marker of Finder"));
                                JSONArray coordinateJsonArray = new JSONArray();
                                try {
                                    coordinateJsonArray.put(latLng.longitude);
                                    coordinateJsonArray.put(latLng.latitude);
                                } catch (JSONException e) {
    
                                }
                                list.add(coordinateJsonArray);
                                markers.add(new LatLng(latLng.latitude, latLng.longitude));
                                if (markers.size() > 2) {
    //                    removeGeofenceImageButton.setVisibility(View.VISIBLE);
                                    for (int i = 0; i < markers.size() - 1; i++) {
    
                                        polygon3 = mMap.addPolygon(new PolygonOptions()
                                                .add(new LatLng(markers.get(i).latitude, markers.get(i).longitude),
                                                        new LatLng(markers.get(i + 1).latitude, markers.get(i + 1).longitude),
                                                        new LatLng(markers.get(0).latitude, markers.get(0).longitude))
                                                .strokeColor(0x82662d91)
                                                .fillColor(0x82662d91)
                                                .strokeWidth(1)
                                        );
                                    }
                                }
                                Log.d("Polygone", markers.toString());
                            }
                        });
                    }
                }
            }
        }