数据API 案例 开发者 关于
掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

ExifInterface 支持库简介

随着 25.1.0 支持库的发布,支持库大家庭迎来了一名新成员:ExifInterface 支持库。由于 Android 7.1 引入了对框架 ExifInterface 的重大改进,因此只有通过支持库的 ExifInterface 让所有 API 9 以上的设备都能利用这些改进才有意义。

基本功能仍然相同:对嵌入图片文件的 Exif 标记进行读写的功能:现已包含 140 个不同的属性(其中近 100 个是 Android 7.1/该支持库新增的!),包括有关相机本身、相机设置、屏幕方向以及 GPS 坐标的信息。

相机应用:写入 Exif 属性

对相机应用而言,写入功能可能是最重要的 - 属性写入仍仅限于 JPEG 图片文件。现在,在实际使用相机拍照时,通常不需要使用该功能 - 您可以改为调用 Camera2 API CaptureRequest.Builder.set(),调用时使用 JPEG_ORIENTATION、JPEG_GPS_LOCATION 或 Camera1 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 无法处理远程 InputStream,例如从 HttpURLConnection 返回的输入流。强烈建议只使用它来处理 content:// 或 file:// URI。

对于大多数属性,您只需视情况使用 getAttributeInt()、getAttributeDouble() 或 getAttribute()(适用于字符串)。

就显示图片而言,其中一个最重要的属性是图片方向,存储该信息的 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() 检查其是否存在,然后通过 getThumbnail()提取缩略图的 byte[] 表示形式 - 后者最适合用来向 BitmapFactory.decodeByteArray() 传递数据。

使用 Exif:一切都可随意选择

对于 Exif 数据,必须要了解的一点是,不存在任何必需标记:每一个标记都是可选项 - 一些服务甚至会明确删除 Exif 数据。因此,在整个代码中,应该始终对没有 Exif 数据的情况进行处理,缺少 Exif 数据不是因为特定属性没有数据,就是因为某种图片格式根本不支持 Exif 数据(例如,无所不在的 PNG 或 WebP 图片)。

将 ExifInterface 支持库添加到项目中时附带以下依赖项:

compile "com.android.support:exifinterface:25.1.0"


但如果您恰好需要某个 Exif 属性来防止应用内的图片旋转方向出错,那么 ExifInterface 支持库正合乎您 #BuildBetterApps 的需要。

原文来自:谷歌开发者

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务
ExifInterface 支持库简介
发布:2017-01-18

随着 25.1.0 支持库的发布,支持库大家庭迎来了一名新成员:ExifInterface 支持库。由于 Android 7.1 引入了对框架 ExifInterface 的重大改进,因此只有通过支持库的 ExifInterface 让所有 API 9 以上的设备都能利用这些改进才有意义。

基本功能仍然相同:对嵌入图片文件的 Exif 标记进行读写的功能:现已包含 140 个不同的属性(其中近 100 个是 Android 7.1/该支持库新增的!),包括有关相机本身、相机设置、屏幕方向以及 GPS 坐标的信息。

相机应用:写入 Exif 属性

对相机应用而言,写入功能可能是最重要的 - 属性写入仍仅限于 JPEG 图片文件。现在,在实际使用相机拍照时,通常不需要使用该功能 - 您可以改为调用 Camera2 API CaptureRequest.Builder.set(),调用时使用 JPEG_ORIENTATION、JPEG_GPS_LOCATION 或 Camera1 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 无法处理远程 InputStream,例如从 HttpURLConnection 返回的输入流。强烈建议只使用它来处理 content:// 或 file:// URI。

对于大多数属性,您只需视情况使用 getAttributeInt()、getAttributeDouble() 或 getAttribute()(适用于字符串)。

就显示图片而言,其中一个最重要的属性是图片方向,存储该信息的 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() 检查其是否存在,然后通过 getThumbnail()提取缩略图的 byte[] 表示形式 - 后者最适合用来向 BitmapFactory.decodeByteArray() 传递数据。

使用 Exif:一切都可随意选择

对于 Exif 数据,必须要了解的一点是,不存在任何必需标记:每一个标记都是可选项 - 一些服务甚至会明确删除 Exif 数据。因此,在整个代码中,应该始终对没有 Exif 数据的情况进行处理,缺少 Exif 数据不是因为特定属性没有数据,就是因为某种图片格式根本不支持 Exif 数据(例如,无所不在的 PNG 或 WebP 图片)。

将 ExifInterface 支持库添加到项目中时附带以下依赖项:

compile "com.android.support:exifinterface:25.1.0"


但如果您恰好需要某个 Exif 属性来防止应用内的图片旋转方向出错,那么 ExifInterface 支持库正合乎您 #BuildBetterApps 的需要。

原文来自:谷歌开发者

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

选择想要的接口, 看看能免费获取多少次调用 选择(单选)或填写想要的接口
  • 短信API服务
  • 银行卡四元素检测[简]
  • 身份证实名认证
  • 手机状态查询
  • 三网手机实名制认证[简]
  • 身份证OCR识别
  • 风险信息查询
  • 企业工商信息
短信API服务
  • 短信API服务
  • 银行卡四元素检测[简]
  • 身份证实名认证
  • 手机状态查询
  • 三网手机实名制认证[简]
  • 身份证OCR识别
  • 风险信息查询
  • 企业工商信息
  • 确定
选择您的身份
请选择寻找接口的目的
预计每月调用量
请选择预计每月调用量
产品研发的阶段
请选择产品研发的阶段
×

前往领取
×
企业用户认证,
可获得1000次免费调用
注册登录 > 企业账户认证 > 领取接口包
企业用户认证领取接口包 立即领取
× 企业用户认证,
可获得1000次免费调用,立即领取>
数 据 驱 动 未 来
Data Drives The Future