Android ExifInterface不保存属性

时间:2017-01-11 09:08:15

标签: android

以下是我的代码 -

        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();
        }

在exifInterface.saveAttributes()行中,我收到以下错误 -

java.io.IOException:ExifInterface不支持保存当前输入的属性。

我不确定错误是由于图像文件还是由于我想要保存的属性。我也在网上寻找可能的解决方案(例如Sanselan),但不确定它是否会解决这个问题。

有人可以解释如何解决这个问题吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

您无法使用输入流进行属性变异。

您可以查看ExifInterface的代码,它说:

/**
     * 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 */

因此,如果您想要写入文件的元数据,则需要在构造函数中传递该文件。否则就会失败。您还可以在类中看到始终失败的代码(使用InputStream):

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

因此,使用ExifInterface(文件),您将能够使您的代码工作。

快乐的编码!

答案 1 :(得分:2)

ExifInterface does not support saving attributes for the current input.

当前输入为InputStream。无法将数据保存到InputStream。仅限OutputStream

第二个问题是assets中的文件是只读的。因此,如果你尝试过,你甚至无法打开OutputStream。太不可能了。

答案 2 :(得分:0)

我认为可能存在的问题是:在创建应用程序的压缩过程中,您尝试将属性添加到只读资源内的资源。

exifInterface仍然不支持在zip文件中添加属性。无论如何,您都可以轻松地将属性添加到SDCard中存在的其他文件中。