【问题标题】:Setting ID to google map API v2 marker to return image taken by camera intent将 ID 设置为 google map API v2 标记以返回相机意图拍摄的图像
【发布时间】:2014-12-12 14:46:36
【问题描述】:

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

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

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

(以上都正常)

这是我卡住的地方:

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

onActivityResult

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

onMarkerClick

@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 来显示两个选项,一个是删除标记,一个是显示完整图像,显示完整图像是我正在努力在地图上显示该点拍摄的图像。

【问题讨论】:

    标签: android google-maps android-intent


    【解决方案1】:

    如果您不使用标记 InfoWindow,您可以将 InfoWindows 标题或 sn-p 设置为您的 id,然后检索它。我这样做

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

    然后检索 id 只需使用:

    myMarker.getTitle()
    

    myMarker.getSnippet()
    

    以下是使用 sn-p 作为标记的示例:

    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 是我创建的一个 Activity 类,它只返回上下文:

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

    在清单中只需给出

    android:name="your.package.AppCtxProv"
    

    应用标签的属性

    【讨论】:

    • 谢谢,你能举个例子吗?
    • @Allrounder 抱歉,我刚刚看到我是根据我使用的一些不起作用的代码给出答案的......我最后实际上做的是只使用 InfoWindow 的标题显示信息,并使用 sn-p 存储我的标签...通过创建一个扩展 InfoWindowAdapter 的类并覆盖 getInfoContents 我能够为未显示 sn-p 的信息窗口设置自定义布局。如果这可以帮助你,我很乐意用一个例子来编辑我的答案
    • 我认为这可能行得通,你介意给我举个例子吗?
    • 我已经尝试过您的解决方案,但它只显示文本,但我需要的是“绑定”到该标记的图像,我添加了一些代码也许会有所帮助?非常感谢您对此的帮助,我可以将文本更改为图像视图吗?然后将图像加载到该视图中?
    • 我也在考虑尝试类似@CommonsWare 的方法帮助我解决用户点击然后返回缩略图的问题 (stackoverflow.com/questions/27197379/…) 所以对图像做类似的事情吗?
    【解决方案2】:

    试试这个..

    (ref.How to remove marker from google map v2?)

    之前我确实告诉过你..只需将标记保存到您自己的变量中.. 每个标记都有一个索引号..因此索引号由您提供 并且 Google-Marker 有自己的 ID... Google-Marker 返回 ID 为 'm1, m2 or m3...'.. 所以 只需替换 get marker.getId 并替换 'm'.. 现在您可以获取此 ID 与您的索引号匹配的标记。

    // 获取marker 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 中定义。链接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 2015-03-07
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多