对于每个版本,使用Android中的setOnMapLongClickListener在Google地图上添加标记

时间:2017-04-25 06:56:55

标签: android google-maps google-maps-markers onlongclicklistener

我正试图在Android上的Google Map上绘制poligon。要绘制多边形,我使用mMap.setOnMapLongClickListener在Google地图上添加了多个标记,并使用循环连接它们。我成功了。但setOnMapLongClickListener不适用于Android升级版(6.0)。

我添加了我的代码。

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());
            }
        });

我在FrameLayout中添加了地图片段。这是xml代码

<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>

我测试了这段代码。它适用于Android版本高达5.0。

让我知道如何让用户在Google地图上为Android中的每个版本添加标记。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。问题与android 6.0+中的权限允许有关。我添加了permission checking,这解决了我的问题。对于6和6+ android来说,Menifest权限还不够。

这是我的解决方案.......

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);
        }

@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());
                        }
                    });
                }
            }
        }
    }