Настройка данных Exif на изображении всегда возвращает ошибку на Android 7

Мне нужно установить данные exif на моем изображении. в Android 8 мой код работает нормально, но в Android 7 он сообщает об ошибке ниже, и после этого данные exif не сохраняются на изображении:

W/ExifInterface: значение данного тега (GPSLatitude) не соответствует одному из ожидаемых форматов: URATIONAL (предположительно: STRING)

Это мой код:

    public void geoTag(String filename, double lng, double lat){
    ExifInterface exif;

    try {
        exif = new ExifInterface(filename);
        int num1Lat = (int)Math.floor(lat);
        int num2Lat = (int)Math.floor((lat - num1Lat) * 60);
        double num3Lat = (lat - ((double)num1Lat+((double)num2Lat/60))) * 3600000;

        int num1Lon = (int)Math.floor(lng);
        int num2Lon = (int)Math.floor((lng - num1Lon) * 60);
        double num3Lon = (lng - ((double)num1Lon+((double)num2Lon/60))) * 3600000;

        exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, num1Lat+"/1,"+num2Lat+"/1,"+num3Lat+"/1000");
        exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, num1Lon+"/1,"+num2Lon+"/1,"+num3Lon+"/1000");
   ...........

person Magobin    schedule 18.03.2018    source источник
comment
num1Lat+"/1,"+num2Lat+"/1,"+num3Lat+"/1000") Извините. Мы не знаем, что вы хотите установить. Укажите значение строки. Публикуйте воспроизводимый код.   -  person greenapps    schedule 18.03.2018
comment
Привет, я хочу установить долготу и широту для изображения, которое у меня есть в галерее. Код выше и он работает, но только с Android Oreo (api 26). Смотрите мой ответ ниже... для строкового значения, но повторюсь, это очень странно.   -  person Magobin    schedule 19.03.2018
comment
Вы только повторились. Мы знали это все. Вы не дали информацию, которую я просил. Тогда мы не можем помочь.   -  person greenapps    schedule 19.03.2018


Ответы (2)


Я была такая же проблема. Исправление заключается в использовании long вместо double для num3Lat и num3Lon. Приведение к длинному и все отлично работает

person Alexander Korolchuk    schedule 24.12.2020

@greenapps.... спасибо за ваше время. В основном у меня есть код, который извлекает позицию с карты и сохраняет SharedPref :

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="LatLng">11.812703;42.081890</string>
</map>

После этого у меня есть метод, который разделяет эту строку на долготу и широту:

    public final void notifyMediaStoreScanner(final File file,Activity mainActivityCatched) {
    double longituderetrieve;
    double latituderetrieve;
    try {
        MediaStore.Images.Media.insertImage(mainActivityCatched.getContentResolver(),
                file.getAbsolutePath(), file.getName(), null);
        mainActivityCatched.sendBroadcast(new Intent(
                Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

  //  SharedPref getPosition = new SharedPref(mainActivityCatched);
    SharedPreferences getLatLng = mainActivityCatched.getSharedPreferences("settingModeLatLng",MODE_PRIVATE);
    String LatLngShared = getLatLng.getString("LatLng","currentLatLng");
    latituderetrieve = Double.parseDouble(LatLngShared.substring(0,LatLngShared.indexOf(";")));
    longituderetrieve = Double.parseDouble(LatLngShared.substring(LatLngShared.indexOf(";")+1));

    try {
        geoTag(file.getAbsolutePath(),longituderetrieve,latituderetrieve);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

... наконец, я передаю все значения другому методу, чтобы установить позицию в данных exif. Мой исходный код был:

 public void geoTag(String filename, double longi, double lati) throws IOException {


         ExifInterface exif;
 try {
        exif = new ExifInterface(filename);
        int num1Lat = (int)Math.floor(lat);
        int num2Lat = (int)Math.floor((lat - num1Lat) * 60);
        double num3Lat = (lat - ((double)num1Lat+((double)num2Lat/60))) * 3600000;

        int num1Lon = (int)Math.floor(lng);
        int num2Lon = (int)Math.floor((lng - num1Lon) * 60);
        double num3Lon = (lng - ((double)num1Lon+((double)num2Lon/60))) * 3600000;

        exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, num1Lat+"/1,"+num2Lat+"/1,"+num3Lat+"/1000");
        exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, num1Lon+"/1,"+num2Lon+"/1,"+num3Lon+"/1000");


        if (lat > 0) {
            exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "N");
        } else {
            exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "S");
        }

        if (lng > 0) {
            exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "E");
        } else {
            exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "W");
        }

        exif.saveAttributes();
    } catch (IOException e) {
        Log.e("PictureActivity", e.getLocalizedMessage());
    }

Странная вещь с моим кодом в Android api26 работает... Любое предложение очень ценится! Алекс

person Magobin    schedule 19.03.2018