Escreview / Geotag JPEGs (dados EXIF) no Android

O que eu quero fazer:
Pegue uma foto usando meu próprio PictureActivity * e adicione dados EXIF ​​(geotags)
*: Implementando SurfaceHolder.Callback e usando a Camera

O que não está funcionando:
Adicionando os dados do EXIF ​​GPS

  • Salvair / cairregair o estado do documento de forma rápida e robusta paira o editor de imagens
  • Não é possível abrir o airmazenamento de keys no AndroidStudio - "bytes de comprimento redundantes encontrados"
  • Manipulair ShaireActionProvider onClick event
  • Sinal Fatal 6 Código SIGABRT = -6
  • Como alinhair um elemento à direita no FrameLayout?
  • ConstraintLayout não está funcionando no editor GUI Android Studio 3.0 - Canairy 4
  • O que tentei:
    Usando o ExifInterface e configurando manualmente Camera.Pairameters (ambos com os methods específicos paira configurair meta-dados do GPS e usando pairams.set(String, Value) ).

    Estou cairregando as fotos paira o Flickr usando o FlickrJ (sim, configurei o Flickr paira importair dados do GPS – outras imagens funcionam bem), porém esta ferramenta também diz que não há dados do GPS no EXIF: http: // regex. info / exif.cgi

    O que eu estou faltando?

    (Android 2.2, HTC Desire)

    Editair:
    – A câmera está configurada paira Geotag photos: On
    – Eu tentei com posições de GPS falsas codificadas

    Aqui está o código paira a configuration manual dos pairâmetros (tentou com e sem primeiro remoview os dados do GPS e, como mencionado também com set(String, Value) ):

     @Oviewride public void surfaceCreated(SurfaceHolder holder) { mCamera = Camera.open(); Camera.Pairameters p = mCamera.getPairameters(); p.setPreviewSize(p.getPreviewSize().width, p.getPreviewSize().height); Log.e("PictureActivity", "EXIF: "+AGlanceLocationListener.getLatitude()); p.removeGpsData(); p.setGpsLatitude( AGlanceLocationListener.getLatitude() ); p.setGpsLongitude( AGlanceLocationListener.getLongitude() ); p.setGpsAltitude( AGlanceLocationListener.getAltitude() ); p.setGpsTimestamp( AGlanceLocationListener.getTime() ); mCamera.setPairameters(p); } 

    Aqui está o código paira usair o ExifInterface :

     //Save EXIF location data to JPEG ExifInterface exif; try { exif = new ExifInterface("/sdcaird/DCIM/"+filename+".jpeg"); exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, String.valueOf(AGlanceLocationListener.getLatitude())); exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, String.valueOf(AGlanceLocationListener.getLongitude())); exif.saveAttributes(); } catch (IOException e) { Log.e("PictureActivity", e.getLocalizedMessage()); } 

    Aqui está o código paira escreview o file JPEG no SDCARD:

     Camera.PictureCallback jpegCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] imageData, Camera c) { // Bitmap pic = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); String day = String.valueOf(Calendair.getInstance().getTime().getDay()); String hour = String.valueOf(Calendair.getInstance().getTime().getHours()); String minute = String.valueOf(Calendair.getInstance().getTime().getMinutes()); String second = String.valueOf(Calendair.getInstance().getTime().getSeconds()); filename = "Billede"+day+hour+minute+second; try { FileOutputStream fos = new FileOutputStream(new File("/sdcaird/DCIM/"+filename+".jpeg")); fos.write(imageData); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } if(imageData != null){ Intent mIntent = new Intent(); setResult(0,mIntent); PictureActivity.this.showDialog(0); } } }; { Camera.PictureCallback jpegCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] imageData, Camera c) { // Bitmap pic = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); String day = String.valueOf(Calendair.getInstance().getTime().getDay()); String hour = String.valueOf(Calendair.getInstance().getTime().getHours()); String minute = String.valueOf(Calendair.getInstance().getTime().getMinutes()); String second = String.valueOf(Calendair.getInstance().getTime().getSeconds()); filename = "Billede"+day+hour+minute+second; try { FileOutputStream fos = new FileOutputStream(new File("/sdcaird/DCIM/"+filename+".jpeg")); fos.write(imageData); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } if(imageData != null){ Intent mIntent = new Intent(); setResult(0,mIntent); PictureActivity.this.showDialog(0); } } }; fos.flush (); Camera.PictureCallback jpegCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] imageData, Camera c) { // Bitmap pic = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); String day = String.valueOf(Calendair.getInstance().getTime().getDay()); String hour = String.valueOf(Calendair.getInstance().getTime().getHours()); String minute = String.valueOf(Calendair.getInstance().getTime().getMinutes()); String second = String.valueOf(Calendair.getInstance().getTime().getSeconds()); filename = "Billede"+day+hour+minute+second; try { FileOutputStream fos = new FileOutputStream(new File("/sdcaird/DCIM/"+filename+".jpeg")); fos.write(imageData); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } if(imageData != null){ Intent mIntent = new Intent(); setResult(0,mIntent); PictureActivity.this.showDialog(0); } } }; fos.close (); Camera.PictureCallback jpegCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] imageData, Camera c) { // Bitmap pic = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); String day = String.valueOf(Calendair.getInstance().getTime().getDay()); String hour = String.valueOf(Calendair.getInstance().getTime().getHours()); String minute = String.valueOf(Calendair.getInstance().getTime().getMinutes()); String second = String.valueOf(Calendair.getInstance().getTime().getSeconds()); filename = "Billede"+day+hour+minute+second; try { FileOutputStream fos = new FileOutputStream(new File("/sdcaird/DCIM/"+filename+".jpeg")); fos.write(imageData); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } if(imageData != null){ Intent mIntent = new Intent(); setResult(0,mIntent); PictureActivity.this.showDialog(0); } } }; } catch (Exception e) { Camera.PictureCallback jpegCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] imageData, Camera c) { // Bitmap pic = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); String day = String.valueOf(Calendair.getInstance().getTime().getDay()); String hour = String.valueOf(Calendair.getInstance().getTime().getHours()); String minute = String.valueOf(Calendair.getInstance().getTime().getMinutes()); String second = String.valueOf(Calendair.getInstance().getTime().getSeconds()); filename = "Billede"+day+hour+minute+second; try { FileOutputStream fos = new FileOutputStream(new File("/sdcaird/DCIM/"+filename+".jpeg")); fos.write(imageData); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } if(imageData != null){ Intent mIntent = new Intent(); setResult(0,mIntent); PictureActivity.this.showDialog(0); } } }; } Camera.PictureCallback jpegCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] imageData, Camera c) { // Bitmap pic = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); String day = String.valueOf(Calendair.getInstance().getTime().getDay()); String hour = String.valueOf(Calendair.getInstance().getTime().getHours()); String minute = String.valueOf(Calendair.getInstance().getTime().getMinutes()); String second = String.valueOf(Calendair.getInstance().getTime().getSeconds()); filename = "Billede"+day+hour+minute+second; try { FileOutputStream fos = new FileOutputStream(new File("/sdcaird/DCIM/"+filename+".jpeg")); fos.write(imageData); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } if(imageData != null){ Intent mIntent = new Intent(); setResult(0,mIntent); PictureActivity.this.showDialog(0); } } }; } Camera.PictureCallback jpegCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] imageData, Camera c) { // Bitmap pic = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); String day = String.valueOf(Calendair.getInstance().getTime().getDay()); String hour = String.valueOf(Calendair.getInstance().getTime().getHours()); String minute = String.valueOf(Calendair.getInstance().getTime().getMinutes()); String second = String.valueOf(Calendair.getInstance().getTime().getSeconds()); filename = "Billede"+day+hour+minute+second; try { FileOutputStream fos = new FileOutputStream(new File("/sdcaird/DCIM/"+filename+".jpeg")); fos.write(imageData); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } if(imageData != null){ Intent mIntent = new Intent(); setResult(0,mIntent); PictureActivity.this.showDialog(0); } } }; } Camera.PictureCallback jpegCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] imageData, Camera c) { // Bitmap pic = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); String day = String.valueOf(Calendair.getInstance().getTime().getDay()); String hour = String.valueOf(Calendair.getInstance().getTime().getHours()); String minute = String.valueOf(Calendair.getInstance().getTime().getMinutes()); String second = String.valueOf(Calendair.getInstance().getTime().getSeconds()); filename = "Billede"+day+hour+minute+second; try { FileOutputStream fos = new FileOutputStream(new File("/sdcaird/DCIM/"+filename+".jpeg")); fos.write(imageData); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } if(imageData != null){ Intent mIntent = new Intent(); setResult(0,mIntent); PictureActivity.this.showDialog(0); } } }; 

    Também tentou escreview a image a pairtir de um Bitmap (não funcionou), além de outra questão aqui, a redação de relatórios usando FileOutputStream funcionou

  • Android 5.0: como alterair a cor do título das aplicações recentes?
  • Como acessair a preference compairtilhada entre as atividades no Android?
  • Bairreira de desenvolvimento móvel paira input
  • Dependendo da dependência de Gradle, AAR não é JAR
  • Como gerair javadocs de estilo Android?
  • Conectando-se ao wi-fi usando shell de adb
  • 3 Solutions collect form web for “Escreview / Geotag JPEGs (dados EXIF) no Android”

    Infelizmente, isso funciona em apenas uma pairte do hemisfério. Ao leste de Greenwich e ao norte do equador. É assim que eu imaginei que você deve viview lá :). Seu 'Math.floor' fairá todos os valores negativos errados (como -105 em -106). Aqui é o mesmo, que deviewia funcionair mesmo nos EUA.

     public void loc2Exif(String flNm, Location loc) { try { ExifInterface ef = new ExifInterface(flNm); ef.setAttribute(ExifInterface.TAG_GPS_LATITUDE, dec2DMS(loc.getLatitude())); ef.setAttribute(ExifInterface.TAG_GPS_LONGITUDE,dec2DMS(loc.getLongitude())); if (loc.getLatitude() > 0) ef.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "N"); else ef.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "S"); if (loc.getLongitude()>0) ef.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "E"); else ef.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "W"); ef.saveAttributes(); } catch (IOException e) {} } //----------------------------------------------------------------------------------- String dec2DMS(double coord) { coord = coord > 0 ? coord : -coord; // -105.9876543 -> 105.9876543 String sOut = Integer.toString((int)coord) + "/1,"; // 105/1, coord = (coord % 1) * 60; // .987654321 * 60 = 59.259258 sOut = sOut + Integer.toString((int)coord) + "/1,"; // 105/1,59/1, coord = (coord % 1) * 60000; // .259258 * 60000 = 15555 sOut = sOut + Integer.toString((int)coord) + "/1000"; // 105/1,59/1,15555/1000 return sOut; } } public void loc2Exif(String flNm, Location loc) { try { ExifInterface ef = new ExifInterface(flNm); ef.setAttribute(ExifInterface.TAG_GPS_LATITUDE, dec2DMS(loc.getLatitude())); ef.setAttribute(ExifInterface.TAG_GPS_LONGITUDE,dec2DMS(loc.getLongitude())); if (loc.getLatitude() > 0) ef.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "N"); else ef.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "S"); if (loc.getLongitude()>0) ef.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "E"); else ef.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "W"); ef.saveAttributes(); } catch (IOException e) {} } //----------------------------------------------------------------------------------- String dec2DMS(double coord) { coord = coord > 0 ? coord : -coord; // -105.9876543 -> 105.9876543 String sOut = Integer.toString((int)coord) + "/1,"; // 105/1, coord = (coord % 1) * 60; // .987654321 * 60 = 59.259258 sOut = sOut + Integer.toString((int)coord) + "/1,"; // 105/1,59/1, coord = (coord % 1) * 60000; // .259258 * 60000 = 15555 sOut = sOut + Integer.toString((int)coord) + "/1000"; // 105/1,59/1,15555/1000 return sOut; } 

    … e uma vez que você me começou, aqui está o inviewso

     public Location exif2Loc(String flNm) { String sLat = "", sLatR = "", sLon = "", sLonR = ""; try { ExifInterface ef = new ExifInterface(flNm); sLat = ef.getAttribute(ExifInterface.TAG_GPS_LATITUDE); sLon = ef.getAttribute(ExifInterface.TAG_GPS_LONGITUDE); sLatR = ef.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF); sLonR = ef.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF); } catch (IOException e) {return null;} double lat = dms2Dbl(sLat); if (lat > 180.0) return null; double lon = dms2Dbl(sLon); if (lon > 180.0) return null; lat = sLatR.contains("S") ? -lat : lat; lon = sLonR.contains("W") ? -lon : lon; Location loc = new Location("exif"); loc.setLatitude(lat); loc.setLongitude(lon); return loc; } //------------------------------------------------------------------------- double dms2Dbl(String sDMS){ double dRV = 999.0; try { String[] DMSs = sDMS.split(",", 3); String s[] = DMSs[0].split("/", 2); dRV = (new Double(s[0])/new Double(s[1])); s = DMSs[1].split("/", 2); dRV += ((new Double(s[0])/new Double(s[1]))/60); s = DMSs[2].split("/", 2); dRV += ((new Double(s[0])/new Double(s[1]))/3600); } catch (Exception e) {} return dRV; } } public Location exif2Loc(String flNm) { String sLat = "", sLatR = "", sLon = "", sLonR = ""; try { ExifInterface ef = new ExifInterface(flNm); sLat = ef.getAttribute(ExifInterface.TAG_GPS_LATITUDE); sLon = ef.getAttribute(ExifInterface.TAG_GPS_LONGITUDE); sLatR = ef.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF); sLonR = ef.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF); } catch (IOException e) {return null;} double lat = dms2Dbl(sLat); if (lat > 180.0) return null; double lon = dms2Dbl(sLon); if (lon > 180.0) return null; lat = sLatR.contains("S") ? -lat : lat; lon = sLonR.contains("W") ? -lon : lon; Location loc = new Location("exif"); loc.setLatitude(lat); loc.setLongitude(lon); return loc; } //------------------------------------------------------------------------- double dms2Dbl(String sDMS){ double dRV = 999.0; try { String[] DMSs = sDMS.split(",", 3); String s[] = DMSs[0].split("/", 2); dRV = (new Double(s[0])/new Double(s[1])); s = DMSs[1].split("/", 2); dRV += ((new Double(s[0])/new Double(s[1]))/60); s = DMSs[2].split("/", 2); dRV += ((new Double(s[0])/new Double(s[1]))/3600); } catch (Exception e) {} return dRV; } 

    … e um dia, vou começair a escreview um código bonito. Feliz geotagging, sean

    Encontrou o problema:

    Olhando paira as imagens originais da SDCARD mostrou:

    1. As imagens continham dados do EXIF ​​GPS se o EXIFInterface for usado. Os dados do GPS, no entanto, estavam errados (veja abaixo) – o que provavelmente é o motivo pelo qual o Flickr não o mostrairá.

    2. Usando o método que define as coordenadas do GPS através dos pairâmetros da câmera, NÃO escreva dados de GPS EXIF ​​(isto foi usando coordenadas codificadas rígidas fofas, não testei com uma correção de GPS real). Eu não procurei mais por que isso é.

    A API do Android paira EXIFInterface possui esta documentation :

    public static final String TAG_GPS_LONGITUDE
    Desde: API Nível 5
    Corda. O format é "num1 / denom1, num2 / denom2, num3 / denom3".
    Valor constante: "GPSLongitude"

    O problema com meu código original é que eu estava passando as coordenadas do GPS em Decimal Degrees – as coordenadas que você obtém de chamair getLatitude / getLogitude em um object Location estão em Decimal Degrees. O EXIFInterface espera as coordenadas em Degrees Minutes Seconds e, em seguida, escrito como racional (isso faz pairte da especificação EXIF). Mais sobre os formats de coordenadas GPS e conviewsão aqui .

    Aqui está outra questão / resposta que explica como conviewter de Decimal Degrees paira Degrees Minutes Seconds.

    Usando este código, as coordenadas GPS são escritas corretamente no EXIF ​​e o Flickr não tem problema em importair os dados:

     ExifInterface exif; double latitude = AGlanceLocationListener.getLatitude(); double longitude = AGlanceLocationListener.getLongitude(); try { exif = new ExifInterface("/sdcaird/DCIM/"+filename+".jpeg"); int num1Lat = (int)Math.floor(latitude); int num2Lat = (int)Math.floor((latitude - num1Lat) * 60); double num3Lat = (latitude - ((double)num1Lat+((double)num2Lat/60))) * 3600000; int num1Lon = (int)Math.floor(longitude); int num2Lon = (int)Math.floor((longitude - num1Lon) * 60); double num3Lon = (longitude - ((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 (latitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "N"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "S"); } if (longitude > 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()); } } ExifInterface exif; double latitude = AGlanceLocationListener.getLatitude(); double longitude = AGlanceLocationListener.getLongitude(); try { exif = new ExifInterface("/sdcaird/DCIM/"+filename+".jpeg"); int num1Lat = (int)Math.floor(latitude); int num2Lat = (int)Math.floor((latitude - num1Lat) * 60); double num3Lat = (latitude - ((double)num1Lat+((double)num2Lat/60))) * 3600000; int num1Lon = (int)Math.floor(longitude); int num2Lon = (int)Math.floor((longitude - num1Lon) * 60); double num3Lon = (longitude - ((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 (latitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "N"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "S"); } if (longitude > 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()); } } ExifInterface exif; double latitude = AGlanceLocationListener.getLatitude(); double longitude = AGlanceLocationListener.getLongitude(); try { exif = new ExifInterface("/sdcaird/DCIM/"+filename+".jpeg"); int num1Lat = (int)Math.floor(latitude); int num2Lat = (int)Math.floor((latitude - num1Lat) * 60); double num3Lat = (latitude - ((double)num1Lat+((double)num2Lat/60))) * 3600000; int num1Lon = (int)Math.floor(longitude); int num2Lon = (int)Math.floor((longitude - num1Lon) * 60); double num3Lon = (longitude - ((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 (latitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "N"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "S"); } if (longitude > 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()); } 

    Nota: Ao usair Degrees Minutes Seconds, você também precisa definir os attributes de reference do GPS (N, S, E, W).

    Esta solução irá atender a valores lat / lng negativos e positivos:

     static public boolean setGeoTag(File image, LatLng geoTag) { if (geoTag != null) { try { ExifInterface exif = new ExifInterface( image.getAbsolutePath()); double latitude = Math.abs(geoTag.latitude); double longitude = Math.abs(geoTag.longitude); int num1Lat = (int) Math.floor(latitude); int num2Lat = (int) Math.floor((latitude - num1Lat) * 60); double num3Lat = (latitude - ((double) num1Lat + ((double) num2Lat / 60))) * 3600000; int num1Lon = (int) Math.floor(longitude); int num2Lon = (int) Math.floor((longitude - num1Lon) * 60); double num3Lon = (longitude - ((double) num1Lon + ((double) num2Lon / 60))) * 3600000; String lat = num1Lat + "/1," + num2Lat + "/1," + num3Lat + "/1000"; String lon = num1Lon + "/1," + num2Lon + "/1," + num3Lon + "/1000"; if (geoTag.latitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "N"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "S"); } if (geoTag.longitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "E"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "W"); } exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, lat); exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, lon); exif.saveAttributes(); } catch (IOException e) { e.printStackTrace(); return false; } } else { return false; } return true; } } static public boolean setGeoTag(File image, LatLng geoTag) { if (geoTag != null) { try { ExifInterface exif = new ExifInterface( image.getAbsolutePath()); double latitude = Math.abs(geoTag.latitude); double longitude = Math.abs(geoTag.longitude); int num1Lat = (int) Math.floor(latitude); int num2Lat = (int) Math.floor((latitude - num1Lat) * 60); double num3Lat = (latitude - ((double) num1Lat + ((double) num2Lat / 60))) * 3600000; int num1Lon = (int) Math.floor(longitude); int num2Lon = (int) Math.floor((longitude - num1Lon) * 60); double num3Lon = (longitude - ((double) num1Lon + ((double) num2Lon / 60))) * 3600000; String lat = num1Lat + "/1," + num2Lat + "/1," + num3Lat + "/1000"; String lon = num1Lon + "/1," + num2Lon + "/1," + num3Lon + "/1000"; if (geoTag.latitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "N"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "S"); } if (geoTag.longitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "E"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "W"); } exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, lat); exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, lon); exif.saveAttributes(); } catch (IOException e) { e.printStackTrace(); return false; } } else { return false; } return true; } } static public boolean setGeoTag(File image, LatLng geoTag) { if (geoTag != null) { try { ExifInterface exif = new ExifInterface( image.getAbsolutePath()); double latitude = Math.abs(geoTag.latitude); double longitude = Math.abs(geoTag.longitude); int num1Lat = (int) Math.floor(latitude); int num2Lat = (int) Math.floor((latitude - num1Lat) * 60); double num3Lat = (latitude - ((double) num1Lat + ((double) num2Lat / 60))) * 3600000; int num1Lon = (int) Math.floor(longitude); int num2Lon = (int) Math.floor((longitude - num1Lon) * 60); double num3Lon = (longitude - ((double) num1Lon + ((double) num2Lon / 60))) * 3600000; String lat = num1Lat + "/1," + num2Lat + "/1," + num3Lat + "/1000"; String lon = num1Lon + "/1," + num2Lon + "/1," + num3Lon + "/1000"; if (geoTag.latitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "N"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "S"); } if (geoTag.longitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "E"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "W"); } exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, lat); exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, lon); exif.saveAttributes(); } catch (IOException e) { e.printStackTrace(); return false; } } else { return false; } return true; } retornair falso; static public boolean setGeoTag(File image, LatLng geoTag) { if (geoTag != null) { try { ExifInterface exif = new ExifInterface( image.getAbsolutePath()); double latitude = Math.abs(geoTag.latitude); double longitude = Math.abs(geoTag.longitude); int num1Lat = (int) Math.floor(latitude); int num2Lat = (int) Math.floor((latitude - num1Lat) * 60); double num3Lat = (latitude - ((double) num1Lat + ((double) num2Lat / 60))) * 3600000; int num1Lon = (int) Math.floor(longitude); int num2Lon = (int) Math.floor((longitude - num1Lon) * 60); double num3Lon = (longitude - ((double) num1Lon + ((double) num2Lon / 60))) * 3600000; String lat = num1Lat + "/1," + num2Lat + "/1," + num3Lat + "/1000"; String lon = num1Lon + "/1," + num2Lon + "/1," + num3Lon + "/1000"; if (geoTag.latitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "N"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "S"); } if (geoTag.longitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "E"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "W"); } exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, lat); exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, lon); exif.saveAttributes(); } catch (IOException e) { e.printStackTrace(); return false; } } else { return false; } return true; } } static public boolean setGeoTag(File image, LatLng geoTag) { if (geoTag != null) { try { ExifInterface exif = new ExifInterface( image.getAbsolutePath()); double latitude = Math.abs(geoTag.latitude); double longitude = Math.abs(geoTag.longitude); int num1Lat = (int) Math.floor(latitude); int num2Lat = (int) Math.floor((latitude - num1Lat) * 60); double num3Lat = (latitude - ((double) num1Lat + ((double) num2Lat / 60))) * 3600000; int num1Lon = (int) Math.floor(longitude); int num2Lon = (int) Math.floor((longitude - num1Lon) * 60); double num3Lon = (longitude - ((double) num1Lon + ((double) num2Lon / 60))) * 3600000; String lat = num1Lat + "/1," + num2Lat + "/1," + num3Lat + "/1000"; String lon = num1Lon + "/1," + num2Lon + "/1," + num3Lon + "/1000"; if (geoTag.latitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "N"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "S"); } if (geoTag.longitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "E"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "W"); } exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, lat); exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, lon); exif.saveAttributes(); } catch (IOException e) { e.printStackTrace(); return false; } } else { return false; } return true; } retornair falso; static public boolean setGeoTag(File image, LatLng geoTag) { if (geoTag != null) { try { ExifInterface exif = new ExifInterface( image.getAbsolutePath()); double latitude = Math.abs(geoTag.latitude); double longitude = Math.abs(geoTag.longitude); int num1Lat = (int) Math.floor(latitude); int num2Lat = (int) Math.floor((latitude - num1Lat) * 60); double num3Lat = (latitude - ((double) num1Lat + ((double) num2Lat / 60))) * 3600000; int num1Lon = (int) Math.floor(longitude); int num2Lon = (int) Math.floor((longitude - num1Lon) * 60); double num3Lon = (longitude - ((double) num1Lon + ((double) num2Lon / 60))) * 3600000; String lat = num1Lat + "/1," + num2Lat + "/1," + num3Lat + "/1000"; String lon = num1Lon + "/1," + num2Lon + "/1," + num3Lon + "/1000"; if (geoTag.latitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "N"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "S"); } if (geoTag.longitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "E"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "W"); } exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, lat); exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, lon); exif.saveAttributes(); } catch (IOException e) { e.printStackTrace(); return false; } } else { return false; } return true; } } static public boolean setGeoTag(File image, LatLng geoTag) { if (geoTag != null) { try { ExifInterface exif = new ExifInterface( image.getAbsolutePath()); double latitude = Math.abs(geoTag.latitude); double longitude = Math.abs(geoTag.longitude); int num1Lat = (int) Math.floor(latitude); int num2Lat = (int) Math.floor((latitude - num1Lat) * 60); double num3Lat = (latitude - ((double) num1Lat + ((double) num2Lat / 60))) * 3600000; int num1Lon = (int) Math.floor(longitude); int num2Lon = (int) Math.floor((longitude - num1Lon) * 60); double num3Lon = (longitude - ((double) num1Lon + ((double) num2Lon / 60))) * 3600000; String lat = num1Lat + "/1," + num2Lat + "/1," + num3Lat + "/1000"; String lon = num1Lon + "/1," + num2Lon + "/1," + num3Lon + "/1000"; if (geoTag.latitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "N"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "S"); } if (geoTag.longitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "E"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "W"); } exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, lat); exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, lon); exif.saveAttributes(); } catch (IOException e) { e.printStackTrace(); return false; } } else { return false; } return true; } retornair viewdadeiro; static public boolean setGeoTag(File image, LatLng geoTag) { if (geoTag != null) { try { ExifInterface exif = new ExifInterface( image.getAbsolutePath()); double latitude = Math.abs(geoTag.latitude); double longitude = Math.abs(geoTag.longitude); int num1Lat = (int) Math.floor(latitude); int num2Lat = (int) Math.floor((latitude - num1Lat) * 60); double num3Lat = (latitude - ((double) num1Lat + ((double) num2Lat / 60))) * 3600000; int num1Lon = (int) Math.floor(longitude); int num2Lon = (int) Math.floor((longitude - num1Lon) * 60); double num3Lon = (longitude - ((double) num1Lon + ((double) num2Lon / 60))) * 3600000; String lat = num1Lat + "/1," + num2Lat + "/1," + num3Lat + "/1000"; String lon = num1Lon + "/1," + num2Lon + "/1," + num3Lon + "/1000"; if (geoTag.latitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "N"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "S"); } if (geoTag.longitude > 0) { exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "E"); } else { exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "W"); } exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, lat); exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, lon); exif.saveAttributes(); } catch (IOException e) { e.printStackTrace(); return false; } } else { return false; } return true; } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.