为什么写这篇文章是因为今早有个需求需要获取图片拍照时的时间进行一些处理,有些方法参数名忘记了,所以谷歌百度了一下,Android 图片 时间,Android 图片 拍照 时间,这几个关键字居然无法搜索到,那么就在这里留一个印记给需要的人吧。

前言

做过相册的小伙伴应该知道有一个功能是根据照片的拍照时间去排序照片,可以直接从ContentProvider中获取到图片的一些信息,那么直接给你一张图片,你要如何获取图片的信息呢?这就要用到ExifInterface类了。看名字也知道这个类应该分成两段,即"Exif","Interface",也就是说这个类应该是Android对Exif的实现,那么Exif是什么呢?

Exif简介

Exif是一种图像文件格式,它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及GPS全球定位系统数据、缩略图等。你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能处理Exif信息。

ps:以上简介来着百科

ExifInterface简介

ExifInterface是Android下一个操作Exif信息的实现类,是媒体库的功能实现类。

构造函数

/**

* Reads Exif tags from the specified JPEG file.

*/

public ExifInterface(String filename) throws IOException {

if (filename == null) {

throw new IllegalArgumentException("filename cannot be null");

}

mFilename = filename;

loadAttributes();

}

构造函数接收一个字符串形式的图片地址:

/storage/emulated/0/DCIM/P60626-135914.jpg

使用方法

初始化后,系统会把解析好的图片Exif信息使用键值对的方式存储在private HashMap mAttributes;中,这时我们使用getAttribute(String tag)方法就可以获取到相应的值了。

其中主要方法有:

/**

* Returns the value of the specified tag or {@code null} if there

* is no such tag in the JPEG file.

*

* @param tag the name of the tag.

*/

public String getAttribute(String tag) {

return mAttributes.get(tag);

}

public double getAttributeDouble(String tag, double defaultValue) {

...

}

public double getAttributeInt(String tag, double defaultValue) {

...

}

/**

* Set the value of the specified tag.

*

* @param tag the name of the tag.

* @param value the value of the tag.

*/

public void setAttribute(String tag, String value) {

mAttributes.put(tag, value);

}

public void saveAttributes() throws IOException {

...

}

getAttributeDouble()和getAttributeDouble()的实现只是调用getAttribute()后进行一些转换而已。

这里我们主要看一下saveAttributes()方法的源码:

public void saveAttributes() throws IOException {

// format of string passed to native C code:

// "attrCnt attr1=valueLen value1attr2=value2Len value2..."

// example:

// "4 attrPtr ImageLength=4 1024Model=6 FooImageWidth=4 1280Make=3 FOO"

StringBuilder sb = new StringBuilder();

int size = mAttributes.size();

if (mAttributes.containsKey("hasThumbnail")) {

--size;

}

sb.append(size + " ");

for (Map.Entry iter : mAttributes.entrySet()) {

String key = iter.getKey();

if (key.equals("hasThumbnail")) {

// this is a fake attribute not saved as an exif tag

continue;

}

String val = iter.getValue();

sb.append(key + "=");

sb.append(val.length() + " ");

sb.append(val);

}

String s = sb.toString();

synchronized (sLock) {

saveAttributesNative(mFilename, s);

commitChangesNative(mFilename);

}

}

可以看出,先是entrySet遍历了所以的属性值,确实是使用的键值对的方式进行存储Exif信息的。

常用的Exif支持的tag有:

TAG_APERTURE:光圈值

TAG_DATETIME:拍摄时间(取决于设备设置的时间)

TAG_EXPOSURE_TIME:曝光时间

TAG_FLASH:闪光灯

TAG_FOCAL_LENGTH:焦距

TAG_IMAGE_LENGTH:图片高度

TAG_IMAGE_WIDTH:图片宽度

TAG_ISO:ISO

TAG_MAKE:设备

TAG_MODEL:设备型号

TAG_ORIENTATION:旋转角度

ps:全部tag查看ExifInterface的源码吧,还挺多的。

简单的Demo演示

mImageView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

try {

String path = (String) v.getTag();

Log.i(TAG, "path:" + path);

ExifInterface exifInterface = new ExifInterface(path);

String TAG_APERTURE = exifInterface.getAttribute(ExifInterface.TAG_APERTURE);

String TAG_DATETIME = exifInterface.getAttribute(ExifInterface.TAG_DATETIME);

String TAG_EXPOSURE_TIME = exifInterface.getAttribute(ExifInterface.TAG_EXPOSURE_TIME);

String TAG_FLASH = exifInterface.getAttribute(ExifInterface.TAG_FLASH);

String TAG_FOCAL_LENGTH = exifInterface.getAttribute(ExifInterface.TAG_FOCAL_LENGTH);

String TAG_IMAGE_LENGTH = exifInterface.getAttribute(ExifInterface.TAG_IMAGE_LENGTH);

String TAG_IMAGE_WIDTH = exifInterface.getAttribute(ExifInterface.TAG_IMAGE_WIDTH);

String TAG_ISO = exifInterface.getAttribute(ExifInterface.TAG_ISO);

String TAG_MAKE = exifInterface.getAttribute(ExifInterface.TAG_MAKE);

String TAG_MODEL = exifInterface.getAttribute(ExifInterface.TAG_MODEL);

String TAG_ORIENTATION = exifInterface.getAttribute(ExifInterface.TAG_ORIENTATION);

String TAG_WHITE_BALANCE = exifInterface.getAttribute(ExifInterface.TAG_WHITE_BALANCE);

Log.i(TAG, "光圈值:" + TAG_APERTURE);

Log.i(TAG, "拍摄时间:" + TAG_DATETIME);

Log.i(TAG, "曝光时间:" + TAG_EXPOSURE_TIME);

Log.i(TAG, "闪光灯:" + TAG_FLASH);

Log.i(TAG, "焦距:" + TAG_FOCAL_LENGTH);

Log.i(TAG, "图片高度:" + TAG_IMAGE_LENGTH);

Log.i(TAG, "图片宽度:" + TAG_IMAGE_WIDTH);

Log.i(TAG, "ISO:" + TAG_ISO);

Log.i(TAG, "设备品牌:" + TAG_MAKE);

Log.i(TAG, "设备型号:" + TAG_MODEL);

Log.i(TAG, "旋转角度:" + TAG_ORIENTATION);

Log.i(TAG, "白平衡:" + TAG_WHITE_BALANCE);

/*

Date date = UtilsTime.stringTimeToDate(TAG_DATETIME, new SimpleDateFormat("yyyy:MM:dd HH:mm:ss", Locale.getDefault()));

String FStringTime = UtilsTime.dateToStringTime(date, new SimpleDateFormat("yyyy年MM月dd日", Locale.getDefault()));

mTextView.setText("TAG_DATETIME = " + TAG_DATETIME + "\n" + "FStringTime = " + FStringTime);

*/

} catch (Exception e) {

e.printStackTrace();

}

}

});

}

Log

Whitelaning

It's very easy to be different but very difficult to be better

来自:文/白一辰(简书)

(责任编辑:ioter)

android 图片拍照,Android获取图片拍照时间相关推荐

  1. Android基础进阶 - 调用拍照、获取图片

    本篇给大家带来的是拍照回传的初级使用,用的同样是数据回传的方式,首先 startActivityForResult 确定 Action.requestCode,之后重写 onActivityResul ...

  2. android通过BitmapFactory.decodeFile获取图片bitmap报内存溢出的解决办法

    android通过BitmapFactory.decodeFile获取图片bitmap报内存溢出的解决办法 原方法: public static Bitmap getSmallBitmap(Strin ...

  3. android 根据文件Uri获取图片url

    今天,简单讲讲android里如何通过文件的Uri获取文件的路径url. 昨天,我讲了如何调用手机的文件管理器获取文件资源,但是文件管理器返回的是文件的Uri,我们需要通过Uri获取文件的url才可以 ...

  4. Android通过网络URL获取图片并显示

    1.布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:to ...

  5. springboot获取静态图片路径_Springboot通过图片路径形式获取图片

    Springboot通过图片路径形式获取图片 一致以来都是用 http://127.0.0.1:8888/getPhoto?imgUrl=1.jpg 的形式获取数据,今天突然要 http://127. ...

  6. Java通过图片url地址获取图片base64位字符串的两种方式

    工作中遇到通过图片的url获取图片base64位的需求.一开始是用网上的方法,通过工具类Toolkit,虽然实现的代码比较简短,不过偶尔会遇到图片转成base64位不正确的情况,至今不知道为啥. 之后 ...

  7. android 调用相机并获取图片地址,Android 7.0使用FileProvider获取相机拍照的图片路径...

    这里主要是基于Android 7.0,Nougat 实现一个获取相机拍照的图片后,使用FileProvider把图片转换为实际的路径. 首先需要在AndroidManifest.xml声明调用相机的权 ...

  8. Android 相机 或者 相册 获取图片裁剪 适用6.0/7.0

    随着Android 的版本更新迭代.本来以前代码很简单的打开相册或者相机  获取图片裁剪 给Unity3D 使用的过程 挺简单的.但是随着 Android 版本的 更新 和 安全 的加强 .有几点 和 ...

  9. android从本地相册获取图片uri三星手机适配问题

    启动系统相册intent Intent intentFromGallery = new Intent(); if (android.os.Build.VERSION.SDK_INT >= and ...

  10. 完美调用系统相机拍照,获取图片进行压缩并本地保存

    在android开发中,调用相机的功能的频幕可谓相当之高,尤其在当前社交应用五花八门的情况下,相机的功能被开发的相当丰富,如美颜相机,美拍,微拍和最早的360相机等,可是制造多少"美女&qu ...

最新文章

  1. Myeclipse快捷键的使用
  2. 交通部:将从五方面推进京津冀暨雄安新区交通建设
  3. fiddler抓取https请求
  4. shiro的简单使用
  5. Web服务之四:httpd虚拟主机
  6. 庖丁解牛-图解MySQL 8.0优化器查询解析篇
  7. java xml 合并_Java中合并XML文档的设计与实现
  8. 前端学习(2749):uniapp项目目录结构介绍
  9. 线程间通信的几种方法_并发编程中的线程间通信
  10. 渗透测试学习 十一、 其他注入漏洞汇总
  11. python画羊_羊车门作业 Python版
  12. linux notifier chains机制
  13. Failed to create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container..
  14. android集成环信客服云_2019.6.12
  15. Python 爬虫篇-利用urllib库下载网页中的图片实例演示
  16. Xilinx FPGA bit文件和MCS下载流程
  17. html中字符间距怎么写,html段落内文字设置字间距间隔
  18. oracle 版本演进,【比较】Oracle不同版本中关于ALTER TABLESPACE的功能演进
  19. 斑马无线打印服务器,斑马打印机网络中文打印实例(亲测可用)
  20. c语言 2059 语法错误,关于CUDA C 项目中“ error C2059: 语法错误:“” ”问题的解决方法...

热门文章

  1. 生成特定分布随机数的方法
  2. 跨业自学党的第一次面试
  3. ansible安装和基本使用
  4. Java并发/多线程教程——1
  5. 探究foreach对于迭代变量的封装性的研究
  6. Entity Framework 4.3尝试体会
  7. 【动画技巧】GIF动画转SWF小技巧
  8. 计算机打不出汉字怎么办,电脑打不出字怎么办,教您电脑打不出字怎么解决
  9. matlab设计凸轮轮廓代码_机械设计基础之什么是凸轮机构,分类和常用运动规律是怎么样的?...
  10. java cfg_如何使用antlr生成Java CFG(控制流图)?