Android下异步扫描视频文件缩略图
写这个文章是因为在实际应用中,由于手机中的视频文件较多50个以上时,会出现读取视频文件信息时间加长,ui显示就会变黑不显示。故而将截图改为异步方式,也有一些技术贴是将网络请求的图片变为异步加载。这两种方式的技术原理是大同小异的。结果如图
其中包括三个部分,一个是截图加载器,一个更新UI的反馈接口,另一个是界面部分使用。
1、截图加载器
/** * @title 异步加载图片 * @author LiYa * @verson 1.0 Jan 30, 2012 10:44:41 AM */ public final class PictureLoader { private Map<string mediametavo="">> caches = new HashMap</string><string mediametavo="">>(); /** * 从sdcard中加载缩略图 * * @param path * 文件路径 * @param callback * 回调 * @return MediaMetaVo */ public MediaMetaVo loadBitmap(final String path, final PictureLoaderCallback callback) { if (caches.containsKey(path)) { MediaMetaVo metaVo = caches.get(path).get(); if (metaVo != null) { return (metaVo); } } final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { callback.bitmapCallback((MediaMetaVo) msg.obj); } }; new Thread() { public void run() { MediaMetaVo vo = loadFormPath(path); caches.put(path, new SoftReference<mediametavo>(vo)); handler.sendMessage(handler.obtainMessage(0, vo)); }; }.start(); return null; } /** * 从路径加载图片 * * @param path * @return MediaMetaVo */ protected MediaMetaVo loadFormPath(String path) { MediaMetadataRetriever retriver = null; MediaMetaVo vo = new MediaMetaVo(); try { retriver = new MediaMetadataRetriever(); if (path.endsWith(SysUtils.MP3_SUFFIX)) { if (getSdk() < 9) { retriver.setMode(MediaMetadataRetriever.MODE_GET_METADATA_ONLY); } retriver.setDataSource(path); String duration = retriver .extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); vo.duration = duration; } else if (path.endsWith(SysUtils.MP4_SUFFIX)) { if (getSdk() < 9) { retriver.setMode(MediaMetadataRetriever.MODE_GET_METADATA_ONLY | MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY); retriver.setDataSource(path); String duration = retriver .extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); vo.duration = duration; Bitmap bit = retriver.captureFrame(); Bitmap nBitmap = Bitmap.createScaledBitmap(bit, SysUtils.PICTURE_WIDTH_DEFAULT, SysUtils.PICTURE_HEIGHT_DEFAULT, false); vo.coverPic = nBitmap; bit.recycle(); } else { retriver.setDataSource(path); String duration = retriver .extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); vo.duration = duration; Bitmap bitmap = retriver.getFrameAtTime(); Bitmap nBitmap = Bitmap.createScaledBitmap(bitmap, SysUtils.PICTURE_WIDTH_DEFAULT, SysUtils.PICTURE_HEIGHT_DEFAULT, false); vo.coverPic = nBitmap; bitmap.recycle(); } } } catch (Exception e) { e.printStackTrace(); } return (vo); } /* ================================================ */ /** * 得到系统版本 * * @return */ public static float SysVersion() { String ver = VERSION.RELEASE; if (ver.length() > 3) ver = ver.substring(0, 3); float verF = Float.valueOf(ver); return verF; } public int getSdk() { float ver = SysVersion(); if (ver < = 1.6f) return Integer.valueOf(VERSION.SDK); else { VERSION_16 ver16 = new VERSION_16(); return ver16.getSdk(); } } private class VERSION_16 { public VERSION_16() { } public int getSdk() { return VERSION.SDK_INT; } } /* ================================================ */ } </mediametavo></string>
二、接口
/** * @title * @author LiYa * @verson 1.0 Jan 30, 2012 10:29:47 AM */ public interface PictureLoaderCallback { /** * 更新ui状态 * @param bitmap */ public void bitmapCallback(MediaMetaVo bitmap); }