0

Looking to add GPS location data to an image as it saves, as far as i'm aware this needs to be done after the outputStream closes. I've written the code and implemented it however no GPS location data is written. As far as i'm aware i have prepared all the relevant data that would be required for the EXIF Data.

GPS Converting Code

    public String getLon(Location location) {

    if (location == null) return "0/1,0/1,0/1000";
    String[] degMinSec = Location.convert(location.getLongitude(), Location.FORMAT_SECONDS).split(":");
    return degMinSec[0] + "/1," + degMinSec[1] + "/1," + degMinSec[2] + "/1000";

}
public String getLat(Location location) {

    if (location == null) return "0/1,0/1,0/1000";
    String[] degMinSec = Location.convert(location.getLatitude(), Location.FORMAT_SECONDS).split(":");
    return degMinSec[0] + "/1," + degMinSec[1] + "/1," + degMinSec[2] + "/1000";
}

Code to save the Image

            file = new File(Environment.getExternalStorageDirectory() + "/DCIM/GeoVista/" + UUID.randomUUID().toString() + ".jpg");
        ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader imageReader) {
                Image image = null;
                try {
                    image = reader.acquireLatestImage();
                    ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                    byte[] bytes = new byte[buffer.capacity()];
                    buffer.get(bytes);
                    save(bytes);
                    storeGeoCoordsToImage(bytes);
                    save(bytes);

                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    {
                        if (image != null)
                            image.close();
                    }
                }
            }


            private void save(byte[] bytes) throws IOException {
                OutputStream outputStream = null;

                try {
                    outputStream = new FileOutputStream(file);
                    outputStream.write(bytes);

                } finally {
                    if (outputStream != null)
                        outputStream.close();
                }
            }
        };

EXIF DATA CODE

                public boolean storeGeoCoordsToImage(File file, Location location) {

                // Avoid NullPointer
                if (file == null || location == null) return false;

                try {
                    ExifInterface exif = new ExifInterface(file.getAbsolutePath());
                    exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, getLat(location));
                    exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, location.getLatitude() < 0 ? "S" : "N");
                    exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, getLon(location));
                    exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, location.getLongitude() < 0 ? "W" : "E");
                    exif.saveAttributes();
                } catch (IOException e) {
                    // do something
                    return false;
                }

                // Data was likely written. For sure no NullPointer. 
                return true;
            }

Any Input would be greatly appreciated.

Minuit
  • 15
  • 1
  • 9
  • `, as far as i'm aware this needs to be done after the outputStream closes. ` ???? If you close an outputstream you cannot write to it anymore. So what do you have in mind? – greenapps Apr 22 '18 at 08:24
  • `storeGeoCoordsToImage(bytes);` AND `public boolean storeGeoCoordsToImage(File file, Location location) ` do not match. – greenapps Apr 22 '18 at 08:29
  • yep, i hadnt changed them correctly but there was a thread here that said it could not be written whilst the picture is being captured and would need to be done after fileOtputstream unless i was using a 3rd party library – Minuit Apr 22 '18 at 18:32

0 Answers0