Как я могу получить изображение, сделанное с моей камеры, и добавить его в качестве маркера на картах Google?

#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 из одного из двух упомянутых источников.