ExifInterface не может получить геотег снятой фотографии на эмуляторе - PullRequest
0 голосов
/ 12 января 2019

Создание приложения, которое должно извлекать exif-данные из снятых фотографий и сохранять их в базе данных Room. Ниже я предоставил код, который я использую для получения широты и долготы изображения, а также даты. Следующий конструктор используется для создания объекта для хранения в базе данных. Дело в том, что этот код прекрасно работает на телефоне (и местоположение, и дата извлекаются), но он не работает на эмуляторе только для данных о местонахождении (дата все еще получается). Вызов getLatLong() метода возвращает ноль.

public Picture(String picturePath, String title) {
    this.picturePath = picturePath;
    this.title = title;

    try {
        ExifInterface exifInterface = new ExifInterface(picturePath);

        double latLong[] = exifInterface.getLatLong();
        this.lat = latLong != null ? latLong[0] : 0;
        this.lon = latLong != null ? latLong[1] : 0;

        this.date = exifInterface.getAttribute(ExifInterface.TAG_DATETIME);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Я дважды проверил все разрешения и есть ли у фотографии данные о местоположении. Все необходимые разрешения были предоставлены и фотография имеет свое местоположение. Внутри приложения расположение равно 0,0 для широты и долготы . Однако, глядя на детали изображения, мы можем видеть, что есть местоположение 40.000 10.000

Мне также удалось получить местоположение в эмуляторе, используя getAttribute(), но используя android.media.ExifInterface вместо android.support.media.ExifInterface; Повторите, что это работает на телефоне, но не только на эмуляторе.

Мой файл Gradle также имеет зависимость com.android.support:exifinterface:28.0.0. Версии Android на эмуляторе были 9.0.0 и 8.0.0.

UPDATE Получить все изображения с помощью EasyImage. Вот что я делаю в своем MainActivity.java

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    EasyImage.handleActivityResult(requestCode, resultCode, data, this, new DefaultCallback() {
        @Override
        public void onImagePickerError(Exception e, EasyImage.ImageSource source, int type) {
            //Some error handling
            e.printStackTrace();
        }

        @Override
        public void onImagesPicked(@NonNull List<File> imageFiles, EasyImage.ImageSource source, int type) {
            onPhotosReturned(imageFiles);
            adapter.onPhotosReturned(imageFiles, recyclerView);
        }

        @Override
        public void onCanceled(EasyImage.ImageSource source, int type) {
            //Cancel handling, you might wanna remove taken photo if it was canceled
            if (source == EasyImage.ImageSource.CAMERA) {
                File photoFile = EasyImage.lastlyTakenButCanceledPhoto(MainActivity.this);
                if (photoFile != null) photoFile.delete();
            }
        }
    });
}

private void onPhotosReturned(List<File> returnedPhotos) {
    addImageElements(returnedPhotos);
}

private void addImageElements(List<File> returnedPhotos) {
    for (File file : returnedPhotos) {
        Picture element = new Picture(file.getAbsolutePath(), file.getName());
        viewModel.getRepository().insert(element);
    }
}

А в PictureAdapter.java

private List<Picture> pictures = new ArrayList<>();
private static List<Picture> allPictures = new ArrayList<>();

void setPictures(List<Picture> pictures) {
    this.pictures = pictures;
    notifyDataSetChanged();
}

static void setAllPictures(List<Picture> allPictures) {
    PictureAdapter.allPictures = allPictures;
}

void onPhotosReturned(List<File> returnedPhotos, RecyclerView recyclerView) {
    pictures.addAll(getImageElements(returnedPhotos));
    setPictures(pictures);
}

private List<Picture> getImageElements(List<File> returnedPhotos) {
    List<Picture> imageElementList = new ArrayList<>();
    for (File file : returnedPhotos) {
        Picture element = new Picture(file.getAbsolutePath(), file.getName());
        imageElementList.add(element);
    }
    return imageElementList;
}
...