我是Android开发的新手,并尝试使用ExifInterface获取图像的元数据。我将图像存储在drawable下并尝试获取元数据,但获取所有字段的空值(日期,图像长度,图像宽度)。我尝试访问图像路径:
String path = "drawable://" + R.drawable.testimage;
并提供了ExifInterface的这条路径。
ExifInterface exif = new ExifInterface(path);
我不知道在drawable下存储图像是否正确,因为当我在模拟器中运行应用程序时,我得到这样的结果:
E/JHEAD﹕ can't open 'drawable://2130837561'
因此,如果这是错误的,请告诉我应该在哪里存储图像以及如何为ExifInterface提供图像路径。 提前谢谢。
答案 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。