最近有项需求是获取应用的缩略,用于在动画时显示。因此就对此块知识简要了解了一下。
创新互联于2013年成立,是专业互联网技术服务公司,拥有项目成都网站制作、成都做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元南山做网站,已为上家服务,为南山各地企业和个人服务,联系电话:13518219792
在android中获取视频文件的缩略图有三种方法:
1.从媒体库中查询
新视频增加后需要SDCard重新扫描才能给新增加的文件添加缩略图,灵活性差,而且不是很稳定,适合简单应用
2. android 2.2以后使用ThumbnailUtils类获取
实现简单,但2.2以前的版本不支持
3.调用jni文件,实现MediaMetadataRetriever类
实现复杂,但比较灵活,推荐使用
那么Android 中如何获取最近应用的缩略图,这块也有现成的函数,不过都被 @hide 掉了,所以需要利用java reflect 反射才能使用
核心代码如下:
package com.example.testondraw;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.app.ActivityManager;
import android.graphics.Bitmap;
import android.util.Log;
/**
* 调用隐藏方法的助手类
*/public class HideExploder {
static final String TAG = "HideExploder";
private final static Object refLock = new Object();
private static Method getTaskThumbnails = null;
private static Field taskThumbnailsBitmap = null;
@SuppressWarnings("rawtypes")
public static void listAllObject(String classFullName) {
try {
Log.i(TAG, "listAllObject classFullName: " + classFullName);
Class? clazz = Class.forName(classFullName);
// 反射属性字段
Field[] fields = clazz.getDeclaredFields();
// 反射方法字段
Method[] methods = clazz.getDeclaredMethods();
// 反射构造器
Constructor[] constuctors = clazz.getDeclaredConstructors();
Log.i(TAG, "FIELD========");
for (Field f : fields) {
Log.i(TAG, "TYPE: " + f.getType() + " NAME: " + f.getName());
}
Log.i(TAG, "METHOD========");
for (Method m : methods) {
Log.i(TAG, "METHOD NAME: " + m.getName());
}
Log.i(TAG, "CONSTUCTOR========");
for (Constructor c : constuctors) {
Log.i(TAG, "NAME:" + c.getName());
Class[] clss = c.getParameterTypes();
Object o = null;
// 产生实例
try {
if (clss.length == 0)
o = c.newInstance();
else if (clss.length 0) {
// TODO
}
Log.i(TAG, "object: " + o);
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static Bitmap getTaskThumbnailsBitmap(ActivityManager am, int id) {
synchronized (refLock) {
try {
if (getTaskThumbnails == null) {
getTaskThumbnails = am.getClass().getDeclaredMethod(
"getTaskThumbnails", int.class);
}
if (getTaskThumbnails != null) {
Object thumbnails = getTaskThumbnails.invoke(am,
Integer.valueOf(id));
if (thumbnails != null) {
if (taskThumbnailsBitmap == null)
taskThumbnailsBitmap = thumbnails.getClass()
.getField("mainThumbnail");
if (taskThumbnailsBitmap != null) {
return (Bitmap) taskThumbnailsBitmap
.get(thumbnails);
}
}
}
} catch (Exception e) {
Log.w(TAG, "getTaskThumbnailsBitmap error:" + e);
e.printStackTrace();
}
}
return null;
}
}
从Android2.2开始系统新增了一个缩略图ThumbnailUtils类,位于framework的android.media.ThumbnailUtils位置,可以帮助我们从mediaprovider中获取系统中的视频或图片文件的缩略图,该类提供了三种静态方法可以直接调用获取。
1.
static
Bitmap
createVideoThumbnail(String
filePath,
int
kind)
//获取视频文件的缩略图,第一个参数为视频文件的位置,比如/sdcard/android123.3gp,而第二个参数可以为MINI_KIND或MICRO_KIND最终和分辨率有关
2.
static
Bitmap
extractThumbnail(Bitmap
source,
int
width,
int
height,
int
options)
//直接对Bitmap进行缩略操作,最后一个参数定义为OPTIONS_RECYCLE_INPUT,来回收资源
3.
static
Bitmap
extractThumbnail(Bitmap
source,
int
width,
int
height)
//
这个和上面的方法一样,无options选项
ThumbnailUtils类是API
Level从8或更高才开始支持的。
Android缩略图类源代码
Android
2.2开始新增的缩略图类ThumbnailUtils的主要方法是静态的,对于Android
2.2或API
Level8以下的工程可以直接使用,本类相对于我们常规的缩略图类考虑更周全,除了尺寸比例优化外,针对OOM的内存管理方面有更周全的处理方式.
基本思路:
就是通过选择图片,生成保存好2种图片,一个是缩略图,一个是大图,点击相对应的图片,把大图传递过去
大图容易引用OOM,引用了一个开源库
获取View的缩略图很有用,比如需要展示树形目录每个节点的内容的时候,将每个节点的布局显示通过缩略图抠取出来,通过每个布局的缩略图就可以了解每个页面的大概内容。、
实现代码如下:
private Bitmap getViewBitmap( View view ){
view.setDrawingCacheEnabled( true );
Bitmap bitmap = null;
try{
if( null != view.getDrawingCache( ) ){
bitmap = Bitmap.createScaledBitmap( view.getDrawingCache( ), 256, 192, false );
}else{
Bitmap bitmapTmp =( ( BitmapDrawable )( getResources( ).getDrawable( R.drawable.syncompdetailcontent_background ) ) ).getBitmap( );
}
}catch( OutOfMemoryError e ){
e.printStackTrace( );
}finally{
view.setDrawingCacheEnabled( false );
view.destroyDrawingCache( );
}
return bitmap;
}
1.一般手机都有清理垃圾的软件什么的,勾选清理缩略图就好了,推荐使用猎豹清理大师。
2.如果没有此类软件,你也可以直接用文件管理器,开启显示隐藏文件,进入文件夹DCIM,把里面的.thumbnails文件夹直接删除就可以了。
3.最难的一种,电脑上D盘新建一个a.txt文件,"开始"-"运行",输入cmd,输入copy d:\a.txt d:\.thumbnails,把a.txt重命名为.thumbnails文件,然后将.thumbnails文件复制到手机DCIM文件夹下