在android中提取图像的exif信息

时间:2015-05-17 02:30:04

标签: android image exif

我是Android开发的新手,并尝试使用ExifInterface获取图像的元数据。我将图像存储在drawable下并尝试获取元数据,但获取所有字段的空值(日期,图像长度,图像宽度)。我尝试访问图像路径:

          String path = "drawable://" + R.drawable.testimage;

并提供了ExifInterface的这条路径。

          ExifInterface exif = new ExifInterface(path);

我不知道在drawable下存储图像是否正确,因为当我在模拟器中运行应用程序时,我得到这样的结果:

          E/JHEAD﹕ can't open 'drawable://2130837561'

因此,如果这是错误的,请告诉我应该在哪里存储图像以及如何为ExifInterface提供图像路径。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

为了得到一个可绘制的,你可以使用这个片段:

  Drawable drawable = getResources().getDrawable(android.R.drawable.your_drawable);

我不确定你的方式是否正确,因为我从来没有见过这样。您是否真的需要图像的路径才能在ExifInterface类上使用它?

好的,我做了一些挖掘并找到this question,这导致我this one。看起来,您可以从apk中的资源获取绝对路径。一个很好的解决方案是将它作为文件保存在外部存储器上,然后就可以得到你想要的路径。

首先,将其添加到AndroidManifest.xml中,以便您的应用可以写入手机内存:

<uses-permission
 android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

好的,要保存它,你可以试试这个,首先从你的drawable资源创建一个位图:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.your_drawable);

然后获取要保存图像的路径,并将其放在String上。关于here

的更多信息

Android文档就如何获取路径有一个很好的例子。你可以看到它here

为了简单起见,我会复制并粘贴文档中的代码段。

    void createExternalStoragePrivateFile() {
    // Create a path where we will place our private file on external
    // storage.
    File file = new File(getExternalFilesDir(null), "DemoFile.jpg");

    try {
        // Very simple code to copy a picture from the application's
        // resource into the external file.  Note that this code does
        // no error checking, and assumes the picture is small (does not
        // try to copy it in chunks).  Note that if external storage is
        // not currently mounted this will silently fail.
        InputStream is = getResources().openRawResource(R.drawable.balloons);
        OutputStream os = new FileOutputStream(file);
        byte[] data = new byte[is.available()];
        is.read(data);
        os.write(data);
        is.close();
        os.close();
    } catch (IOException e) {
        // Unable to create file, likely because external storage is
        // not currently mounted.
        Log.w("ExternalStorage", "Error writing " + file, e);
    }
}

void deleteExternalStoragePrivateFile() {
    // Get path for the file on external storage.  If external
    // storage is not currently mounted this will fail.
    File file = new File(getExternalFilesDir(null), "DemoFile.jpg");
    if (file != null) {
        file.delete();
    }
}

boolean hasExternalStoragePrivateFile() {
    // Get path for the file on external storage.  If external
    // storage is not currently mounted this will fail.
    File file = new File(getExternalFilesDir(null), "DemoFile.jpg");
    if (file != null) {
        return file.exists();
    }
    return false;
}

之后,获取保存在外部存储器中的文件的路径,并按照您的意愿执行。

我也会保留旧的例子。您可以使用getExternalStorageDirectory()方法获取路径,或getExternalCacheDir()。之后,您可以使用名为getAbsolutePath()File方法获取String

String path = (...) // (you can choose where to save here.)
File file = new File(path, "your_drawable.png");
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); // You can change the quality from 0 to 100 here, and the format of the file. It can be PNG, JPEG or WEBP. 
out.flush();
out.close();

有关Bitmap类的详细信息,请查看the docs

如果您需要更多信息,请告诉我,我会尝试展示更多样品。

编辑:我看到了你的链接,那里有这个片段:

    //change with the filename & location of your photo file
        String filename = "/sdcard/DSC_3509.JPG";
        try {
   ExifInterface exif = new ExifInterface(filename);
   ShowExif(exif);
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   Toast.makeText(this, "Error!", 
     Toast.LENGTH_LONG).show();
  }

正如您所看到的,如果您真的想要查看内部图像资源的exif数据,您必须将其保存在其他位置,然后您可以尝试获取该文件的绝对路径,然后,调用方法来显示exif。