我正在尝试列出与图库中的图像相关联的所有exif属性。每个getAttribute()都返回null。当我调试并检查ExifInterface时它有一个有效的文件,当我展开“mAttributes”节点时,“Table”包含我正在寻找的所有EXIF数据,但是“values”,“keySet”和“valuescollection” “是空的。知道我哪里错了吗?
编辑:问题可能在于我如何获取文件名?我已经更新了下面的代码,以提供更完整的图片。
//create an array of thumbnail IDs
String[] ids = {MediaStore.Images.Thumbnails._ID};
//this pulls the file locations
cursor = managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, ids, null, null, MediaStore.Images.Thumbnails.IMAGE_ID);
colIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);
//at this point we need to target the gridview.
GridView gallery = (GridView) findViewById(R.id.gridView1);
//borrowed an adapter provided in the tutorial at http://mihaifonoage.blogspot.com/2009/09/displaying-images-from-sd-card-in.html
gallery.setAdapter(new ImageAdapter(this));
//now we attach a listener to our gridview.
gallery.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView parent, View v, int position, long id)
{
String[] ids = {MediaStore.Images.Media.DATA};
cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, ids, null, null, null);
colIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToPosition(position);
String image = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
ExifInterface clicked = null;
try {
clicked = new ExifInterface(image);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(clicked==null)
{
Toast.makeText(getApplicationContext() , "We were not able to load the file." , Toast.LENGTH_LONG).show();
}
else
{
TextView tv = (TextView) findViewById(R.id.messageCenter);
String message;
message = "Latitude: " + clicked.getAttribute(ExifInterface.TAG_GPS_LATITUDE) + "\n";
message += "Longitude: " + clicked.getAttribute(ExifInterface.TAG_GPS_LONGITUDE) + "\n";
message += "Make: " + clicked.getAttribute(ExifInterface.TAG_MAKE) + "\n";
message += "Model: " + clicked.getAttribute(ExifInterface.TAG_MODEL) + "\n";
message += "Date/Time: " + clicked.getAttribute(ExifInterface.TAG_DATETIME) + "\n";
message += "Flash: " + clicked.getAttribute(ExifInterface.TAG_FLASH) + "\n";
message += "Flocal Length: " + clicked.getAttribute(ExifInterface.TAG_FOCAL_LENGTH) + "\n";
message += "White Balance: " + clicked.getAttribute(ExifInterface.TAG_WHITE_BALANCE);
tv.setText(message);
}
}
});
这是在运行时点击的内容
编辑:我发现调用表中列出的值有效。但是,如果我展开mAttributes.table。[0] .value.value,我正在寻找的其他信息列在char数组中。为什么这些信息不会被传递?
答案 0 :(得分:2)
您必须对用于编辑图像的任何软件持怀疑态度。即使它只是一个“查看器”,您用它来以不同的格式保存它。有些人会破坏EXIF,有些人会把它全部剥掉。此外,即使你认为EXIF是一个标准,制造商之间的差异也很大,它们是如何精确地实现和命名标签的。有一个名为ExifTool的工具,您不仅可以使用它来转储EXIF,还可以修改和标准化它。也许您可以将其嵌入到流程中,或者从代码中调用它。
答案 1 :(得分:1)
有些图片工作正常 - 问题是数据,而不是类或我的代码。我怀疑某些设备/应用程序以ExifInterface无法解析的非标准方式编码其exif数据。