我将尝试尽可能详细地解释这一点(如果我错过任何事情请告诉我)
因此,在我在地图上的应用程序中,用户可以在地图上的任何位置长按,然后添加默认标记并启动相机意图,用户可以拍摄城堡照片并返回地图。因此,当用户点击地图时,整个图像会显示在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%工作!感谢所有的帮助,非常感谢!!!
答案 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的数量是否匹配。