介绍ExifInterface支持库
原标题:Introducing the ExifInterface Support Library
链接:https://android-developers.googleblog.com/2016/12/introducing-the-exifinterface-support-library.html
作者:Ian Lake (开发者倡导者)
翻译:arjinmc
随着25.1.0 Support Library的发布,这个大家庭还有一个新的入口:ExifInterface支持库。在Android 7.1中引入了显著改进框架的ExifInterface,只有通过支持库才能使所有API 9+设备都可用ExifInterface。
基础部分仍然是相同的:阅读和写作能力的Exif嵌入图像文件内的标签:现在有140种不同的属性(对于Android 7.1 /此支持库!有近100个新属性),包括对相机本身的相机设置信息,方向和GPS坐标。
相机应用程序:写入Exif属性
对于Camera应用程序,写入可能是最重要的 - 写入属性仍然局限于JPEG图像文件。现在,通常你会不会需要实际的摄像头捕获本身期间使用这个-你会改为调用API Camera2 CaptureRequest.Builder.set())用JPEG_ORIENTATION,JPEG_GPS_LOCATION或等同Camer1的Camera.Parameters。但是,使用ExifInterface允许你在事实之后对文件进行更改(例如,删除用户请求中的位置信息)。
读取Exif属性
对于我们其他人来说,阅读这些属性将是我们的实用的,这是我们看到最大改善的地方。
首先,你可以从JPEG和原始图像(特别是DNG,CR2,NEF,NRW,ARW,RW2,ORF,PEF,SRW和RAF文件)读取Exif数据。在这之下,这是一个重大的重组,删除所有本地依赖项,并建立一个广泛的测试套件,以确保一切正常工作。
对于使用content://URI可以从其他应用程序接收图像的应用程序(例如,目标为API 24或更高版本的应用程序发送的应用程序),ExifInterface现在可直接使用InputStream; 这使你可以直接从content://你接收的URI中直接提取Exif信息,而无需创建临时文件。
Uri uri; // the URI you've received from the other app
InputStream in;
try {
in = getContentResolver().openInputStream(uri);
ExifInterface exifInterface = new ExifInterface(in);
// Now you can extract any Exif tag you want
// Assuming the image is a JPEG or supported raw format
} catch (IOException e) {
// Handle any errors
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ignored) {}
}
}
注意:ExifInterface不能与远程InputStreams一起使用,比如从那些HttpURLConnection返回的a。强烈建议只使用它们content://或file://URI。
对于大多数的属性,你会简单地使用getAttributeInt()),getAttributeDouble())或getAttribute())(String类型),相应的方法。
显示图像时最重要的属性之一是图像方向,存储在适当的名称TAG_ORIENTATION,它返回一个ORIENTATION_常量。要将其转换为旋转角度,你可以后处理该值。
int rotation = 0;
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
rotation = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotation = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotation = 270;
break;
}
有一些有用的方法可以从特定的Exif标签中提取值。对于位置数据,该getLatLong())方法以浮点形式给出经纬度,而getAltitude())并以米为单位给出高度。一些图片还嵌入了一个小缩略图。你可以检查它的存在,hasThumbnail())然后提取byte[]缩略图的表示getThumbnail())- 完美的传递给BitmapFactory.decodeByteArray())。
使用Exif:一切都是可选的
有一件重要的事情要理解Exif数据是没有必要的标签:每个标签是可选的 - 一些服务甚至专门剥离Exif数据。因此,在整个代码中,应始终处理没有Exif数据的情况,要么是由于没有特定属性的数据,要么是根本不支持Exif数据的图像格式(比如无处不在的PNG或WebP图像)。
使用以下依赖项将ExifInterface支持库添加到你的项目中:
compile "com.android.support:exifinterface:25.1.0"
但是,当Exif属性恰好是在你的应用程序中防止错误旋转的图像,ExifInterface支持库正是你需要的#BuildBetterApps(构建更好的app)