#java #android #google-maps
Вопрос:
Итак, то, что я пытаюсь сделать, — это долго нажимать на свою карту, а затем сделать снимок с помощью намерения камеры, а затем вернуть эту фотографию в качестве маркера в той точке карты, где пользователь «долго нажимал».
Что работает, так это длинный щелчок, а затем съемка. Что не работает, так это возврат этого изображения на карту в качестве маркера.
Это то, что я использую, чтобы добавить маркер и сделать снимок с помощью камеры:
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
LatLng mylocation = new LatLng(-xx.xxxx, xx.xxxx);
mMap.addMarker(new MarkerOptions().position(mylocation).title("Marker in mylocation"));
CameraPosition cameraPosition = new CameraPosition.Builder().target(mylocation).zoom(12).build();
mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
googleMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng latLng) {
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
root = Environment.getExternalStorageDirectory().toString() "/My Folder";
imageFolderPath = root "/saved_images";
File imagesFolder = new File(imageFolderPath);
imagesFolder.mkdirs();
imageName = "test.png";
File image = new File(imageFolderPath, imageName);
fileUri = Uri.fromFile(image);
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(takePictureIntent, TAKE_PICTURE);
}
public void onActivityResult(int requestCode, int resultCode, Intent data, LatLng latlng) {
if (requestCode == TAKE_PICTURE amp;amp; 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()
.position(latlng)
.icon(BitmapDescriptorFactory.fromBitmap(bitmap));
googleMap.addMarker(markerOptions);
}
}
});
И это класс GetImageThumbnail:
public class GetImageThumbnail {
private static int getPowerOfTwoForSampleRatio(double ratio) {
int k = Integer.highestOneBit((int) Math.floor(ratio));
if (k == 0)
return 1;
else
return k;
}
public Bitmap getThumbnail(Uri uri, GoogleMap.OnMapLongClickListener test)
throws FileNotFoundException, IOException {
InputStream input = ((Context) test).getContentResolver().openInputStream(uri);
BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options();
onlyBoundsOptions.inJustDecodeBounds = true;
onlyBoundsOptions.inDither = true;// optional
onlyBoundsOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;// optional
BitmapFactory.decodeStream(input, null, onlyBoundsOptions);
input.close();
if ((onlyBoundsOptions.outWidth == -2)
|| (onlyBoundsOptions.outHeight == -2))
return null;
int originalSize = Math.max(onlyBoundsOptions.outHeight, onlyBoundsOptions.outWidth);
double ratio = (originalSize > 200) ? (originalSize / 175) : 0.5;
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inSampleSize = getPowerOfTwoForSampleRatio(ratio);
bitmapOptions.inDither = true;
bitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;// optional
input = ((Context) test).getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions);
input.close();
return bitmap;
}
}
Как я уже упоминал, запускается намерение камеры, и я могу сделать снимок, но после того, как снимок сделан, он возвращается на карту, но без маркера? Там также нет сообщений об ошибках или чего-либо, что я могу найти о том, почему он не отображает маркер/изображение.
Я уверен, что делаю здесь что-то не так, но не могу понять, что именно?
Спасибо
Комментарии:
1.
onActivityResult
Подпись неверна — например, попробуйте использовать@Override
и убедитесь, что она выдает ошибку. Где вы нашли эту подпись? В зависимости от того, что вы хотите, вы можете использовать либоLatLng
длительное нажатие, либо текущую позицию пользователя — и то, и другое вы можете получить. Рекомендуем удалитьLatLng
параметр вonActivityResult
, убедитесь, что он вызван, @Override не выдает ошибку и используетсяLatLng
из одного из двух упомянутых источников.