如何加载保存到我的标记 ID 的图像并显示在该特定标记的自定义信息窗口中?

Posted

技术标签:

【中文标题】如何加载保存到我的标记 ID 的图像并显示在该特定标记的自定义信息窗口中?【英文标题】:How can I load an image saved to my Marker ID and display in a custom info window for that specific marker? 【发布时间】:2021-12-22 06:18:38 【问题描述】:

在我的应用程序中,我可以选择“长按”地图上的特定点,然后它会显示一个自定义对话框窗口,可以在其中输入自定义“标题”和“片段”,然后拍照并然后保存。这会将标记添加到地图中。

现在这是我有点卡住的地方。我可以让它显示每个标记的标题和 sn-p,但不能显示为该特定标记拍摄的图像。

我已尝试将标记保存到 HashMap

private HashMap<Marker, String> markerImageID = new HashMap<Marker, String>();

然后将其添加到drawMarker 方法中:

private void drawMarker(LatLng location, String infoTitle, String infoSnippet, String img) 
    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.position(location);
    mMap.addMarker(new MarkerOptions()
            .title(infoTitle)
            .snippet(infoSnippet)
            .position(location)
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN)));
    markerImageID.put(marker, img);

然后在点击地图标记时,我使用以下代码:

@Override
        public View getInfoContents(Marker marker) 

            View v = getLayoutInflater().inflate(R.layout.info_window_layout, null);
            LatLng latLng = marker.getPosition();
            ImageView imgViewMarker = (ImageView) v.findViewById(R.id.imageViewFinal);
            TextView tvLat = (TextView) v.findViewById(R.id.txtMarkerTitle);
            TextView tvLng = (TextView) v.findViewById(R.id.txtMarkerSnippet);
            String filep = markerImageID.get(marker.getId());
            if (filep != null) 
                Bitmap myBitmap = BitmapFactory.decodeFile(img);
                imgViewMarker.setImageBitmap(myBitmap);
            
            tvLat.setText(marker.getTitle());
            tvLng.setText(marker.getId());
            return v;
        

但不幸的是,这不起作用,因为该特定标记没有显示图像。其他信息如 sn-p、标题和图像使用 SQLite 数据库保存:

ContentValues contentValues = new ContentValues();
contentValues.put(LocationsDB.FIELD_LAT, point.latitude);
contentValues.put(LocationsDB.FIELD_LNG, point.longitude);
contentValues.put(LocationsDB.FIELD_ZOOM, mMap.getCameraPosition().zoom);
contentValues.put(LocationsDB.FIELD_TITLE, txtTitle.getText().toString());
contentValues.put(LocationsDB.FIELD_SNIPPET, txtSnippet.getText().toString());
contentValues.put(LocationsDB.FIELD_IMAGE_PATH, image.getAbsolutePath());

但是,当我像这样添加图像时:

View v = getLayoutInflater().inflate(R.layout.info_window_layout, null);
LatLng latLng = marker.getPosition();
ImageView imgViewMarker = (ImageView) v.findViewById(R.id.imageViewFinal);
TextView tvLat = (TextView) v.findViewById(R.id.txtMarkerTitle);
TextView tvLng = (TextView) v.findViewById(R.id.txtMarkerSnippet);
Bitmap myBitmap = BitmapFactory.decodeFile(img);
imgViewMarker.setImageBitmap(myBitmap);
tvLat.setText(marker.getTitle());
tvLng.setText(marker.getId());
return v;

然后它会在 ImageView 中显示图像,但始终是拍摄的最后一张图像,然后它会为添加的所有其他标记显示相同的图像。

然后我想到使用 HashMap 来保存 Marker 的 id,然后以这种方式显示图像,但它不起作用。

希望有人能帮我解决这个问题?

谢谢

【问题讨论】:

【参考方案1】:

与其存储包含标记图像的哈希图,不如在标记本身上设置标签?见:https://developers.google.com/maps/documentation/android-sdk/reference/com/google/android/libraries/maps/model/Marker?hl=en

与标记关联的对象。例如,对象可以包含有关标记所代表内容的数据。这比存储单独的 Map 更容易。作为另一个示例,您可以关联与数据集中的 ID 对应的字符串 ID。适用于 Android 的 Google Maps SDK 既不读取也不写入此属性。

您可以将字符串设置为标签,或者,您可以创建一个模型来包装所有标记的数据并将该模型的实例设置为标签。

就图像未显示而言,您在日志中是否看到任何错误消息?

【讨论】:

嗨,我一定会调查的。如何将标记 ID 保存在 SQLite 数据库中,然后单击标记检索与标记关联的标记 ID 和图像?我也没有收到关于图像显示的任何错误。【参考方案2】:

我认为您在drawMarker 中有一个小错误,您没有使用addMarker 的结果,这是添加的Marker 对象,因此您将img 关联到一些先前分配的marker

private void drawMarker(LatLng location, String infoTitle, String infoSnippet, String img) 
    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.position(location);

    // HERE: addMarker returns a Marker object and you never assign marker to it.  
    //       So I added the assignment

    marker = mMap.addMarker(new MarkerOptions()
            .title(infoTitle)
            .snippet(infoSnippet)
            .position(location)
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN)));

    // So in your original code the marker was never changing to the recently
    // added marker when you then associate it to the image.
    markerImageID.put(marker, img);

从代码中并不清楚marker 变量是如何在其他地方使用的(它不是本地的),因此如果需要,请使用本地变量来接收标记并在放置中使用它。

【讨论】:

以上是关于如何加载保存到我的标记 ID 的图像并显示在该特定标记的自定义信息窗口中?的主要内容,如果未能解决你的问题,请参考以下文章

裁剪图像并保存到 sdcard (Android) 中的特定文件夹?

UIImageView:旋转和缩放。如何保存结果?

将位图保存到位置

将图像保存到数据库并从服务器加载

如何解码保存到 SQLite 数据库并在 ImageView 中显示的图像文件路径

如何转换保存在db中的二进制图像数据并在浏览器中显示