user1122549
user1122549

Reputation: 738

Android ExifInterface not saving attribute

Below is my code-

try {
  InputStream inputStream = getAssets().open("thumbnail.jpg");
  exifInterface = new ExifInterface(inputStream);
  exifInterface.setAttribute(ExifInterface.TAG_ARTIST,"TEST INPUT");
  exifInterface.saveAttributes();
} catch (IOException e) {
  e.printStackTrace();
}

On the exifInterface.saveAttributes() line I get the following error -

java.io.IOException: ExifInterface does not support saving attributes for the current input.

I am not sure if the error is due to the image file or due to the attribute. I'm trying to save. Also I looked online for possible solutions (eg. Sanselan) but not sure if it will solve this.

Can somebody explain how to fix this?

Thanks!

Upvotes: 4

Views: 4623

Answers (3)

Leandro Borges Ferreira
Leandro Borges Ferreira

Reputation: 12782

You can't do attribute mutation using Input Stream.

You can check the code of ExifInterface, it says that:

/**
     * Reads Exif tags from the specified image input stream. Attribute mutation is not supported
     * for input streams. The given input stream will proceed its current position. Developers
     * should close the input stream after use. This constructor is not intended to be used with
     * an input stream that performs any networking operations.
     */
    public ExifInterface(InputStream inputStream) throws IOException {
   /* Irrelevant code here */

So, if you would like to write in the meta data of your file, you need to pass the file in the constructor. Otherwise it is going to fail. You can also see the code that will always fail (with InputStream) in the class:

public void saveAttributes() throws IOException {
        if (!mIsSupportedFile || mMimeType != IMAGE_TYPE_JPEG) {
            throw new IOException("ExifInterface only supports saving attributes on JPEG formats.");
        }
        if (mFilename == null) {
            throw new IOException(
                    "ExifInterface does not support saving attributes for the current input.");
        }

 //Irrelevant code

So use ExifInterface(file) and you'll be able to make your code work.

Happy coding!

Upvotes: 8

greenapps
greenapps

Reputation: 11214

ExifInterface does not support saving attributes for the current input.

The current input is an InputStream. One cannot save data to an InputStream. Only to an OutputStream.

A second problem is that the file in assets is read only. Hence you could not even open an OutputStream if you had tried that. So impossible.

Upvotes: 4

Pradeep Kumar Kushwaha
Pradeep Kumar Kushwaha

Reputation: 2239

What I think might be the issue is : you are trying to add attribute to read only assets placed inside app during the zip of app is created.

And adding attribute to files inside zip is still not supported by exifInterface. Howsoever you can easily add attributes to other files that exist outside say in SDCard.

Upvotes: 0

Related Questions