将ID设置为谷歌地图API v2标记以返回相机意图拍摄的图像



好的,这个问题我已经面临几天了,似乎无法解决。

这是我的地图的工作方式:

  1. 点击地图上的任意点
  2. 通过相机意图拍照
  3. 将照片作为标记(缩略图(返回到点击的特定点。

(以上所有工作正常(

这就是我卡住的地方:

点击标记(图像(,它应该显示标记的较大图像,因为标记缩略图非常小。 问题是它显示的是拍摄的最新图像,而不是与该标记相关的图像。 所以我的问题是如何设置标记 ID,以便在用户点击该标记以显示完整图像时。 我之前在SO上问过这个问题,但不得不更改我的代码,以便将图像保存在设备上的文件夹中。 还有一个单独的类来创建缩略图。(但是我认为这对添加标记ID没有任何影响(

这是在为标记显示正确图像之前有效的代码。 (这仅显示拍摄的最新图像(:

相机意图

Intent getCameraImage = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
         getApplicationContext().getDir(
                 getResources().getString(R.string.app_name), MODE_PRIVATE);
         fileUri = Uri.fromFile(new File((Environment.getExternalStorageDirectory() +
                 "/" +getResources().getString(R.string.app_name)),new Date().getTime() + ".jpg"));
            getCameraImage.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
         startActivityForResult(getCameraImage, TAKE_PICTURE);

活动结果

if (requestCode == TAKE_PICTURE && resultCode == RESULT_OK) {
              try {
                  GetImageThumbnail getImageThumbnail = new GetImageThumbnail();
                  bitmap = getImageThumbnail.getThumbnail(fileUri, this);
              } catch (FileNotFoundException e1) {
                  e1.printStackTrace();
              } catch (IOException e1) {
                  e1.printStackTrace();
              }
              {
              MarkerOptions markerOptions = new MarkerOptions()
             .draggable(true)
             .snippet("Tap here to remove marker")
             .title("My Marker")
             .position(pointtap)
             .icon(BitmapDescriptorFactory
             .fromBitmap(bitmap));
             googleMap.addMarker(markerOptions);
            }
        }
 }

在标记点击

@Override
        public boolean onMarkerClick(Marker marker) {
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                    context);
                // set title
                alertDialogBuilder.setTitle("My Marker");
                // set dialog message
                alertDialogBuilder
                    .setMessage("Select Option")
                    .setCancelable(false)
                    .setPositiveButton("Display full Image",new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface arg0, int arg1) {
                              Intent intent = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            Uri imgUri = Uri.parse("file://" + fileUri);
            intent.setDataAndType(imgUri, "image/*");
            startActivity(intent);
                        }
                      })
                    .setNegativeButton("Delete Marker",new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,int id) {
                            // if this button is clicked, just close
                            marker.remove();
                        }
                    });
                    // create alert dialog
                    AlertDialog alertDialog = alertDialogBuilder.create();
                    // show it
                    alertDialog.show();
                    return false;

我希望有人能好心地向我展示如何实现标记 ID,以便在用户点击标记时全屏显示为该标记拍摄的图像。

谢谢大家!

更新必须实现 AlertDialog 来显示两个选项,一个用于删除标记,一个用于显示完整图像,显示完整图像是我正在努力在地图上显示该点拍摄的图像的选项。

如果您没有使用标记 InfoWindow,您可以将 InfoWindows 标题或代码段设置为您的 id,然后检索它。我这样做

myMap.addMarker(new MarkerOptions()
    .title(myTitle)
    .snippet(mySnippet)
    .position(myPosition));

然后要检索 id,只需使用:

myMarker.getTitle()

myMarker.getSnippet()

下面是使用代码段作为标记标记的示例:

public class CustomInfoWindow implements InfoWindowAdapter {
    @Override
    public View getInfoContents(Marker marker) {
        View v = LayoutInflater.from(AppCtxProv.getContext()).inflate(R.layout.custom_info_window, null);
        TextView title = (TextView) v.findViewById(R.id.title);
        title.setText(marker.getTitle());
        return v;
    }
    @Override
    public View getInfoWindow(Marker marker) {
        return null;
    }
}

然后对于自定义布局,我使用了以下简单代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/white" >
        <TextView 
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
</RelativeLayout>

AppCtxProv 是我创建的一个活动类,它只返回上下文:

public class AppCtxProv extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
    }
    public static Context getContext() {
        return getApplicationContext();
    }
}

并在清单中给出

android:name="your.package.AppCtxProv"

属性到应用程序标记

试试这个。

(参考如何从谷歌地图v2中删除标记?

以前我确实告诉过你..只需将标记保存到您自己的变量中即可。并且每个标记都有一个索引号。因此,索引号由您提供和谷歌标记本身有ID...谷歌标记返回带有"m1,m2或m3..."的ID。所以只需替换 get marker.getId 并替换 'm'..现在,您可以标记此ID与您的索引号匹配。

获取标记 ID 的示例代码

    String mId = marker.getId();
    mId = mId.replace("m","");
    String clickMarker =  Integer.valueOf(mId);

因此,'i' 是 Google-Marker Id...,并且您的标记索引值与它匹配。获取点击标记 ID 的示例代码

           for(int k = 0; k<myMarkersHash.size(); k++)
            {
                if(clickMarker == myMarkersHash.get(k))
                {
                    // now got k is marker value
                    break;
                }
            }

myMarkersHash 也定义在 ref. link

最新更新