Создание приложения, которое должно извлекать 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;
}