将HashMap添加到标记以显示图像不会返回该特定标记的正确图像

时间:2014-12-18 15:12:32

标签: java android google-maps

我将尝试尽可能详细地解释这一点(如果我错过任何事情请告诉我)

因此,在我在地图上的应用程序中,用户可以在地图上的任何位置长按,然后添加默认标记并启动相机意图,用户可以拍摄城堡照片并返回地图。因此,当用户点击地图时,整个图像会显示在getInfoContents(Marker marker)中,当用户点击infoWindow时,他们可以选择“删除标记”或“取消”所有这一切都很好和工作。然而,我面临的问题是,当用户拍摄城堡1的照片并放置标记,然后拍摄城堡2的另一张照片并放置标记时,似乎发生的是当点击城堡1标记时,城堡2图像显示(与城堡2相同)

所以我想做的是将该图像“保存”到该特定标记。

所以这是我的代码,直到这一点:

我创建了HashMap:

private HashMap<Bitmap, Marker> myMarkersHash;

然后在onCreate方法中:

myMarkersHash = new HashMap<Bitmap, Marker>();

然后在onMapLongClick这个:

Marker marker = googleMap.addMarker(new MarkerOptions()
       .position(thePoint));
myMarkersHash.put(bitmap, marker);

然后在我的getInfoContents(Marker marker)中:

View v  = getLayoutInflater().inflate(R.layout.infowindow_layout, null);
final ImageView markerIcon = (ImageView) v.findViewById(R.id.marker_icon);
myMarkersHash.get(bitmap);
markerIcon.setImageBitmap(bitmap);

但这似乎不起作用,所以我想在这里遗漏了一些东西。

这是我的相机意图(可能有助于解答我的问题)

Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File imagesFolder = new File(Environment.getExternalStorageDirectory(), "My Castle");
imagesFolder.mkdirs();
image = new File(imagesFolder, "Mycastle_" + timeStamp + ".jpg");
fileUri = Uri.fromFile(image);
imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(imageIntent, TAKE_PICTURE);

然后在onActivityResult这个:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
 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();
        }

(只需添加onActivityResult即可获得GetImageThumbnail.class

的缩小图片

希望我有道理并希望有人可以帮助我解决这个问题。

提前谢谢!

编辑1

所以我现在尝试的是实现这个:

private Map<String, Uri> myMarkersHash;

in onCreate方法:

myMarkersHash = new HashMap<String, Uri>();

然后在onMapLongClick这个:

myMarkersHash.put(marker.getId(), fileUri );

最后getInfoContents这个:

 myMarkersHash.get(marker.getId() + fileUri);
 markerIcon.setImageBitmap(bitmap);

但不幸的是,它似乎仍然无效。我还尝试了image.getAbsolutePath();,但这只是使用nullPointerException

崩溃应用程序

编辑2

正如我所说的那样:

private Map<String, Bitmap> myMarkersHash;

in onCreate方法:

myMarkersHash = new HashMap<String, Bitmap>();

然后在onMapLongClick这个:

myMarkersHash.put(marker.getId(), bitmap);

最后getInfoContents这个:

 myMarkersHash.get(marker.getId());
 markerIcon.setImageBitmap(bitmap);

但似乎仍然不起作用,仍然为每个标记显示相同的图像。我认为它没有看到那时拍摄的图像(虽然图像被保存到sdCard上的文件夹中,如果有意义的话?)

编辑3

好的,隧道尽头有光!但是还没到那里。正如我所建议的,我已经实现了这个代码:

Bitmap bitmap = myMarkersHash.get(marker.getId());
markerIcon.setImageBitmap(bitmap);

现在看来是这样的:

一个。放置第一个标记=无图像

湾放置第二个标记=第一个标记的图像

℃。放置第三个标记=第二个标记的图像

d。放置第4个标记=第3个标记的图像

即放置第5个标记=第4个标记的图像

等等。

为什么会发生这种情况的任何想法?现在就尝试一下,让你知道。

编辑4

完整OnMapLongClick代码:

@Override
public void onMapLongClick(LatLng point) {
    thePoint=point;

    Marker marker = googleMap.addMarker(new MarkerOptions()
            .position(thePoint));
    myMarkersHash.put(marker.getId(), bitmap );

     Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
     timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
     File imagesFolder = new File(Environment.getExternalStorageDirectory(), "My Castle");
     imagesFolder.mkdirs();
     image = new File(imagesFolder.getPath(), "Mycastle_" + timeStamp + ".jpg");
     fileUri = Uri.fromFile(image);

     imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
     startActivityForResult(imageIntent, TAKE_PICTURE);
}

希望这有帮助。

编辑5

GREAT !!有用!!哎呀,但问题是它是将肖像拍摄的图像转换为横向,这就是我必须实现此代码的原因:

ExifInterface exif = null;
        try {
            exif = new ExifInterface(image.getAbsolutePath());
        } catch (IOException e) {
            e.printStackTrace();
        }
           int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
           if (orientation != 1) {
                   switch (orientation) {
                   case ExifInterface.ORIENTATION_ROTATE_90:
                       rotate = 90;
                       break;
                   case ExifInterface.ORIENTATION_ROTATE_180:
                       rotate = 180;
                       break;
                   case ExifInterface.ORIENTATION_ROTATE_270:
                       rotate = 270;
                       break;
                   default:
                       rotate = 0;
                       break;
                   }
           }
           Matrix matrix = new Matrix();
            matrix.postRotate(rotate);
            bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),  bitmap.getHeight(), matrix, true);
           }
        }

但是,自从按照建议添加代码后,它又回到了以纵向显示照片的方式。

最后编辑

好的,所有现在都在100%工作!感谢所有的帮助,非常感谢!!!

2 个答案:

答案 0 :(得分:0)

我不确定你编辑的是你正在做什么,但似乎你并没有像你需要的那样使用HashMap。您可以尝试这样的事情:

Bitmap bitmap = myMarkersHash.get(marker.getId());
markerIcon.setBitmap(bitmap);

在将其添加到HashMap之前,您还应该创建一个本地位图:

@Override
public void onMapLongClick(LatLng point) {
    thePoint=point;

    Marker marker = googleMap.addMarker(new MarkerOptions()
            .position(thePoint));
     markerId = marker.getId();         

     Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
     timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
     File imagesFolder = new File(Environment.getExternalStorageDirectory(), "My Castle");
     imagesFolder.mkdirs();
     image = new File(imagesFolder.getPath(), "Mycastle_" + timeStamp + ".jpg");
     fileUri = Uri.fromFile(image);

     imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
     startActivityForResult(imageIntent, TAKE_PICTURE);
} 

然后在设置位图时:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
 if (requestCode == TAKE_PICTURE && resultCode == RESULT_OK) {

 try {
 GetImageThumbnail getImageThumbnail = new GetImageThumbnail();
 Bitmap bitmap = getImageThumbnail.getThumbnail(fileUri, this);
 myMarkersHash.put(markerId, bitmap );
 } catch (FileNotFoundException e1) {
    e1.printStackTrace();
    } catch (IOException e1) {
      e1.printStackTrace();
        }

因此,您需要将markerId存储在某处以便能够在onActivityResult中获取

答案 1 :(得分:0)

我认为你每次都在创建一个新的imagesFolder。

您可以尝试执行以下操作:

File imagesFolder = new(File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "My Castle");
if (!imagesFolder.exists()) {
   if (!imagesFolder.mkdirs()) {
       Log.e(TAG, "Fail to create directory.");
       return null;
   }
}

而且:

file = new File(imageFolder.getPath() + File.seperator + "IMG_" + timestamp + ".jpg");

此外,您可以从hashmap输出标记ID列表,查看标记ID的数量是否匹配。