一:系统提供的一个从数据库中获得缩略图的方法

我在这篇使用七牛云存储上传android本地视频并播放博客中使用了下面的android系统提供的api来获取视频的缩略图

bitmap = MediaStore.Video.Thumbnails.getThumbnail(mContentResolver, anInt, MediaStore.Video.Thumbnails.MICRO_KIND, null);

相对这个api,系统还在ThumbnailUtils中提供了一个

public static Bitmap createVideoThumbnail(String filePath, int kind)

但是第二个api因为是临时生成新的图片,因此在获取视频缩略图列表这样的页面中,耗费时间不可取。那么第一个api呢?getThumbnail()根据系统的注释,我们知道他可以检查指定的视频缩略图是否已经存在,如果不存就线程阻塞直到缩略图生成为止。

This method checks if the thumbnails of the specified image (origId) has been created.

It will be blocked until the thumbnails are generated.

二:getThumbnail方法分析

其实这个getThumbnail调用的是下面的这个方法

InternalThumbnails.getThumbnail(cr, origId,

InternalThumbnails.DEFAULT_GROUP_ID, kind, options,

EXTERNAL_CONTENT_URI, true)

而这个方法过长,我们只贴关心的部分

long magic = thumbFile.getMagic(origId);

if (magic != 0) {

if (kind == MICRO_KIND) {

synchronized (sThumbBufLock) {

if (sThumbBuf == null) {

sThumbBuf = new byte[MiniThumbFile.BYTES_PER_MINTHUMB];

}

if (thumbFile.getMiniThumbFromFile(origId, sThumbBuf) != null) {

bitmap = BitmapFactory.decodeByteArray(sThumbBuf, 0, sThumbBuf.length);

if (bitmap == null) {

Log.w(TAG, "couldn't decode byte array.");

}

}

}

return bitmap;

} else if (kind == MINI_KIND) {

String column = isVideo ? "video_id=" : "image_id=";

c = cr.query(baseUri, PROJECTION, column + origId, null, null);

if (c != null && c.moveToFirst()) {

bitmap = getMiniThumbFromFile(c, baseUri, cr, options);

if (bitmap != null) {

return bitmap;

}

}

}

magic是系统根据origId查询得到的缩略图对应的一个标志。我们看到当kind==MINI_KIND的时候,系统开始在缩略图表中查找缩略图。待会我们自己查表看看速度如何。

String column = isVideo ? "video_id=" : "image_id=";

c = cr.query(baseUri, PROJECTION, column + origId, null, null);

三:getThumbnail实际执行耗时

手机中有八个视频,那么看看每个视频执行getThumbnail()方法获取缩略图的耗时,单位为毫秒。

07-24 18:03:11.957 24473-25220/com.dzy E/HSL: ---->totalTime:1169

07-24 18:03:12.451 24473-25220/com.dzy E/HSL: ---->totalTime:494

07-24 18:03:12.981 24473-25220/com.dzy E/HSL: ---->totalTime:530

07-24 18:03:13.701 24473-25220/com.dzy E/HSL: ---->totalTime:720

07-24 18:03:14.334 24473-25220/com.dzy E/HSL: ---->totalTime:633

07-24 18:03:15.663 24473-25220/com.dzy E/HSL: ---->totalTime:1328

07-24 18:03:16.807 24473-25220/com.dzy E/HSL: ---->totalTime:1144

07-24 18:03:18.063 24473-25220/com.dzy E/HSL: ---->totalTime:1256

四:通过thumnail表单独查询速度快

通过MediaStore.Video.Thumbnails.getThumbnail()方法来查询缩略图耗时不可忍受。那么我们单独查表呢?

int id = cursor.getInt(cursor

.getColumnIndex(MediaStore.Video.Media._ID));

thumbCursor = context.getContentResolver().query(

MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI,

thumbColumns, MediaStore.Video.Thumbnails.VIDEO_ID

+ "=" + id, null, null);

if (thumbCursor.moveToFirst()) {

String path = thumbCursor.getString(thumbCursor

.getColumnIndex(MediaStore.Video.Thumbnails.DATA));

long a = System.currentTimeMillis();

Bitmap bitmap= BitmapFactory.decodeFile(path);

bitmapArrayList.add(bitmap);

DebugUtil.error("---> string:"+ path);

DebugUtil.error("----> totalTime:"+(System.currentTimeMillis()-a));

}

我们先查表获得视频id,再通过视频id来查询thumbnail表,获得缩略图,执行耗时如下:

07-24 18:11:27.628 27272-27821/com.dzy E/HSL: ---> string:/storage/emulated/0/DCIM/.thumbnails/1497958474184.jpg

07-24 18:11:27.628 27272-27821/com.dzy E/HSL: ----> totalTime:11

07-24 18:11:27.640 27272-27821/com.dzy E/HSL: ---> string:/storage/emulated/0/DCIM/.thumbnails/1499264404259.jpg

07-24 18:11:27.641 27272-27821/com.dzy E/HSL: ----> totalTime:10

07-24 18:11:27.659 27272-27821/com.dzy E/HSL: ---> string:/storage/emulated/0/DCIM/.thumbnails/1499264401739.jpg

07-24 18:11:27.659 27272-27821/com.dzy E/HSL: ----> totalTime:14

07-24 18:11:27.673 27272-27821/com.dzy E/HSL: ---> string:/storage/emulated/0/DCIM/.thumbnails/1499331534347.jpg

07-24 18:11:27.673 27272-27821/com.dzy E/HSL: ----> totalTime:8

07-24 18:11:27.690 27272-27821/com.dzy E/HSL: ---> string:/storage/emulated/0/DCIM/.thumbnails/1499331534538.jpg

07-24 18:11:27.690 27272-27821/com.dzy E/HSL: ----> totalTime:12

07-24 18:11:27.701 27272-27821/com.dzy E/HSL: ---> string:/storage/emulated/0/DCIM/.thumbnails/1499331534915.jpg

07-24 18:11:27.701 27272-27821/com.dzy E/HSL: ----> totalTime:7

07-24 18:11:27.710 27272-27821/com.dzy E/HSL: ---> string:/storage/emulated/0/DCIM/.thumbnails/1499331535444.jpg

07-24 18:11:27.710 27272-27821/com.dzy E/HSL: ----> totalTime:5

07-24 18:11:27.719 27272-27821/com.dzy E/HSL: ---> string:/storage/emulated/0/DCIM/.thumbnails/1500352336527.jpg

07-24 18:11:27.719 27272-27821/com.dzy E/HSL: ----> totalTime:6

快了何止千百倍,难道是我对getThumbnail()方法理解错误?因为却少环境调试,无法进一步跟踪。

android thumbnail获取图片,系统获取视频缩略图的getThumbnail()真的那么快吗?相关推荐

  1. java 优酷视频缩略图_java获取优酷等视频缩略图

    类型:Android平台大小:6.8M语言:中文 评分:7.2 标签: 立即下载 想获取优酷等视频缩略图,在网上没有找到满意的资料,参考了huangdijia的PHP版工具一些思路,写了下面的JAVA ...

  2. Silverlight学习笔记十七BingMap(六)之获取图片系统的图片信息ImageryService的应用...

    BIngMap的ImageryService服务是一个微软发布的WCF服务,它用来获取图片系统的图片信息.服务地址:http://dev.virtualearth.net/webservices/v1 ...

  3. instagram获取图片地址和视频地址

    instagram 获取图片地址和视频地址 先保持 以后在详细说明 package mainimport ("bufio""encoding/json"&quo ...

  4. android中获取图片、获取图片像素、处理像素等基础知识

    一.android获取图片的主要方法. (1).利用BitmapFactory.decode..各种方式获取资源.sd卡的图片,从这可以看出android都是以位图的形式加载的图片的,jpg.png等 ...

  5. 使用PHP获取优酷网视频缩略图

    function get_youku ( $ url ) { // 这段正则是来获取优酷的id,出处在 /wp-content/languages/zh_CN.php,同样56网.土豆都可以找到   ...

  6. Android 10.0之后系统获取不到IMEI和UUID解决办法

    Android 10.0以后版本无法通过 tm.getDeviceId();获取,所以要通过androidId来代表唯一性,如下: TelephonyManager tm = (TelephonyMa ...

  7. android通过json获取图片,Android-okhttp获取json数据及解析

    Okhttp简介 okhttp是目前android开发中比较流行的一个开源网络请求框架,相比于官网api提供的网络接口有很多优点. android6.0以前,官方sdk提供的是httpUrlConne ...

  8. 从相册获取图片,并获取裁剪后图片(系统自带)

    2019独角兽企业重金招聘Python工程师标准>>> /*此处info 有六个值* UIImagePickerControllerMediaType; // an NSString ...

  9. 从富文本(html字符串)中获取图片,js获取富文本中的第一张图片(正则表达式)

    js获取富文本中的第一张图片url正则公式及去除字符串里面的html标签 后台发来一个富文本字符串里面可能包含了0.1.2.3-个图片标签(img),我们的任务是获取这个字符串里面第一张图片的url, ...

最新文章

  1. CentOS 7 如何按行删除文件内容
  2. 前端参数无法转为后端实体内部类_Java学到什么程度才能叫精通?
  3. 1049. 数列的片段和(20)
  4. POI 方式-excle 表格导出实现-java-poi
  5. 奥拉星插件flash下载手机版下载安装_奥拉星游戏插件
  6. c语言非法字符空格,98行的四则计算器.(支持括号)加入了非法字符的检测
  7. 命令行启动mssqlserver服务
  8. Python开发【第二篇】:初识Python
  9. 阿里云服务器如何升级配置和降低配置?
  10. wegame饥荒一直连接中_英雄联盟手游:腾讯WeGame发布了,可以玩云顶之弈自走棋...
  11. 方形16QAM的C语言仿真
  12. 64 位 Microsoft Windows 驱动程序清单
  13. 大工邮箱收件服务器,Outlook 2010 设置邮箱详细步骤
  14. 用frp开源工具,实现内网穿透(详细教程)
  15. 迁移学习基础知识整理
  16. 字母对应的日期 moment Element JAVA oracle mysql的日期格式
  17. Django.db.utils.OperationalError: (1045, Access denied for user 'root'@'localhost' (using passwo...
  18. VSPD  7.0  虚拟串口创建不成功能,  修复步骤:
  19. Quectel EC20 R2.1 AT指令集(基础部分)
  20. 3DMAX曲柄滑块机构动画制作

热门文章

  1. 基于VHDL的FPGA简易电子琴(实现三音阶切换与弹奏)
  2. python写图,Python实现图片添加文字
  3. AWS白皮书 – 安全性
  4. b站up主是怎么赚钱,b站UP主有哪些赚钱方式,通过什么赚钱?
  5. CMake生成多个.so文件
  6. 【板绘入门】拥有数位板之后第一步该学什么?线条!
  7. 深刻理解RGB色彩空间与HSI色彩空间的转换关系
  8. 微信安卓最新 7.0.22 版本来了,赶紧抢先内测体验吧!美颜,连麦,刷礼物统统来了...
  9. 【超详细教程】Mac如何用QuickTime录屏soundflower录制屏内外声音(附视频演示教程)
  10. “984.5”大学真的打不过985吗?