Android: ExifInterface 数据为空
Android: ExifInterface data null
我正在尝试从画廊的图像中提取 Exif 数据,如下所示:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data.getData() != null) {
Uri uri = data.getData();
String file = uri.getPath();
try {
ExifInterface exif = new ExifInterface(file);
Integer property = exif.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, 9); //is always 0
Log.d("width", property.toString());
String date = exif.getAttribute(ExifInterface.TAG_GPS_DATESTAMP); //is always null
} catch (Exception e) {
e.printStackTrace();
}
}
}
但所有值要么为空,要么为 0。
正确的做法是什么?
String file = uri.getPath();
这在大多数情况下是没有用的。充其量,如果 Uri
有一个 file
方案,该路径将是对文件系统上文件的有效引用,但您可能无权访问它。它对任何其他方案都将完全无用,而且大多数时候你会有一个 content
.
的方案
您有两个选择:
使用不同的 EXIF 解析器,可以处理 InputStream
。在这种情况下,您可以使用 ContentResolver
和 openInputStream()
在 Uri
指向的内容上获得 InputStream
。 AOSP 中的 Mms 应用程序中的 EXIF 代码是我为此使用的代码。
使用ContentResolver
和openInputStream()
得到Uri
指向的内容的InputStream
。然后,使用 Java I/O 将这些字节复制到您控制的某个文件中。然后,将您的 ExifInterface
代码用于新创建的文件。
我正在尝试从画廊的图像中提取 Exif 数据,如下所示:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data.getData() != null) {
Uri uri = data.getData();
String file = uri.getPath();
try {
ExifInterface exif = new ExifInterface(file);
Integer property = exif.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, 9); //is always 0
Log.d("width", property.toString());
String date = exif.getAttribute(ExifInterface.TAG_GPS_DATESTAMP); //is always null
} catch (Exception e) {
e.printStackTrace();
}
}
}
但所有值要么为空,要么为 0。 正确的做法是什么?
String file = uri.getPath();
这在大多数情况下是没有用的。充其量,如果 Uri
有一个 file
方案,该路径将是对文件系统上文件的有效引用,但您可能无权访问它。它对任何其他方案都将完全无用,而且大多数时候你会有一个 content
.
您有两个选择:
使用不同的 EXIF 解析器,可以处理
InputStream
。在这种情况下,您可以使用ContentResolver
和openInputStream()
在Uri
指向的内容上获得InputStream
。 AOSP 中的 Mms 应用程序中的 EXIF 代码是我为此使用的代码。使用
ContentResolver
和openInputStream()
得到Uri
指向的内容的InputStream
。然后,使用 Java I/O 将这些字节复制到您控制的某个文件中。然后,将您的ExifInterface
代码用于新创建的文件。