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="">&gt; caches = new HashMap</string><string mediametavo="">&gt;();
 
    /**
     * 从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() &lt; 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() &lt; 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() &gt; 3)
            ver = ver.substring(0, 3);
        float verF = Float.valueOf(ver);
        return verF;
    }
 
    public int getSdk() {
        float ver = SysVersion();
        if (ver &lt; = 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);
}

 

 

posted @ 2012-07-03 10:01  xianyuan  阅读(506)  评论(0编辑  收藏  举报