id="@+id/size"
android:
layout_width="fill_parent"
android:
layout_height="wrap_content"
/>
2.编写MainActivity,实现文件的遍历,并获得数据
packagecom.miki;
importjava.io.File;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.os.Environment;
importandroid.util.Log;
importandroid.widget.ListView;
importandroid.widget.SimpleAdapter;
publicclassMainActivityextendsActivity{
privatestaticfinalStringTAG="MainActivity";
privateContextmContext;
privateArrayListlistItem;
privateStringsdcardDirectory=android.os.Environment.getExternalStorageDirectory()+"/test/";
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
ListViewlistView=newListView(this);
mContext=this;
//生成动态数组,加入数据
listItem=getFiles();
Log.i(TAG,"listItem="+listItem.size());
//构造适配器,指明数据源字段与listitem中子控件的对应关系
ApkInfoAdapteradapter=newApkInfoAdapter(this,listItem);
//添加适配器,进行绑定
listView.setAdapter(adapter);
setContentView(listView);
}
publicArrayListgetFiles(){
ArrayListlist=newArrayList();
Filefile=newFile(sdcardDirectory);
Filefiles[]=file.listFiles();
for(Filef:
files){
Log.i(TAG,"files.path="+f.getPath());
Log.i(TAG,"files.isDirEctory="+f.isDirectory());
Log.i(TAG,"files.name="+f.getName().toString().contains(".apk"));
if(f.isFile()&&f.getName().toString().endsWith(".apk")){
Log.i(TAG,"files.path="+f.getPath());
list.add(newGetIcon(mContext).showAPKIcon(f));
}
}
returnlist;
}
}
3.构造Adapter
packagecom.miki;
importjava.util.List;
importandroid.content.Context;
importandroid.util.Log;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.BaseAdapter;
importandroid.widget.ImageView;
importandroid.widget.TextView;
publicclassApkInfoAdapterextendsBaseAdapter{
privatestaticfinalStringTAG="ApkInfoAdapter";
privateLayoutInflaterlayoutInflater;//用于从xml文件加载listview的layout
privateContextcontext;//容器activity
privateListinfos;
publicApkInfoAdapter(Contextcontext,Listlist){
this.context=context;
this.infos=list;
//Log.i(TAG,"infos="+infos.get(0).fileName);
layoutInflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
publicintgetCount(){
//TODOAuto-generatedmethodstub
returninfos.size();
}
@Override
publicObjectgetItem(intposition){
//TODOAuto-generatedmethodstub
returnposition;
}
@Override
publiclonggetItemId(intposition){
//TODOAuto-generatedmethodstub
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
//TODOAuto-generatedmethodstub
ViewHolderholder=null;
if(convertView==null){
convertView=layoutInflater.inflate(R.layout.list,null);//通过flater初始化行
holder=newViewHolder();//并将行视图的3个子视图引用放到tag中
holder.pictrue=(ImageView)convertView.findViewById(R.id.photo);
holder.name=(TextView)convertView.findViewById(R.id.name);
holder.size=(TextView)convertView.findViewById(R.id.size);
convertView.setTag(holder);
}else{
holder=(ViewHolder)convertView.getTag();//若行已初始化,直接从tag属性获得子视图的引用
}
ApkInfoinfo=infos.get(position);//获得行数据(模型)
//根据模型数据,设置行视图的控件值
holder.pictrue.setImageDrawable(info.getIcon());
holder.name.setText(info.getApkName());
holder.size.setText(info.getFsize());
returnconvertView;
}
staticclassViewHolder{
ImageViewpictrue;
TextViewname;
TextViewsize;
}
}
4.创建实体类,即apk文件的相关信息
packagecom.miki;
importandroid.graphics.drawable.Drawable;
publicclassApkInfo{
publicStringapkName;//包中包含的apk名称
publicStringpackageName;//包名
publicDrawableicon;//图片
publicStringfsize;//文件
publicStringpath;//文件的绝对路径
publicbooleanpackageStates;//安装状态
publicStringvername;//版本号
publicStringoldvername;//已安装的版本号
publicStringfileName;//文件在T卡中的文件名
publicStringfilepath;//文件在T卡中的位置
publicintcomparestates;
publicStringgetApkName(){
returnapkName;
}
publicvoidsetApkName(StringapkName){
this.apkName=apkName;
}
publicStringgetPackageName(){
returnpackageName;
}
publicvoidsetPackageName(StringpackageName){
this.packageName=packageName;
}
publicDrawablegetIcon(){
returnicon;
}
publicvoidsetIcon(Drawableicon){
this.icon=icon;
}
publicStringgetFsize(){
returnfsize;
}
publicvoidsetFsize(Stringfsize){
this.fsize=fsize;
}
publicStringgetPath(){
returnpath;
}
publicvoidsetPath(Stringpath){
this.path=path;
}
publicbooleanisPackageStates(){
returnpackageStates;
}
publicvoidsetPackageStates(booleanpackageStates){
this.packageStates=packageStates;
}
publicStringgetVername(){
returnvername;
}
publicvoidsetVername(Stringvername){
this.vername=vername;
}
publicStringgetOldvername(){
returnoldvername;
}
publicvoidsetOldvername(Stringoldvername){
this.oldvername=oldvername;
}
publicStringgetFileName(){
returnfileName;
}
publicvoidsetFileName(StringfileName){
this.fileName=fileName;
}
publicStringgetFilepath(){
returnfilepath;
}
publicvoidsetFilepath(Stringfilepath){
this.filepath=filepath;
}
publicintgetComparestates(){
returncomparestates;
}
publicvoidsetComparestates(intcomparestates){
parestates=comparestates;
}
}
5.返回每一个apk文件的详细信息的类
packagecom.miki;
importjava.io.File;
importjava.lang.reflect.Constructor;
importjava.lang.reflect.Field;
importjava.lang.reflect.Method;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.content.pm.ApplicationInfo;
importandroid.content.pm.PackageInfo;
importandroid.content.pm.PackageManager;
importandroid.content.pm.PackageManager.NameNotFoundException;
importandroid.content.res.Resources;
importandroid.graphics.drawable.Drawable;
importandroid.os.Bundle;
importandroid.util.DisplayMetrics;
importandroid.util.Log;
importandroid.view.View;
importandroid.widget.ImageView;
publicclassGetIcon{
privateContextmcontext;
publicGetIcon(Contextc){
this.mcontext=c;
}
/**
*用于保存file的包名,图片,文件名,大小的类
*@authorli_k
*
*/
/**
*用来获取文件的包名,icon图片,包中包含的文件名,文件大小
*@paramfileFile类型文件
*@return返回一个ApkInfo类的数据,包含包名等4个属性
*/
publicApkInfoshowAPKIcon(Filefile){
StringapkPath=file.getPath();
StringPATH_PackageParser="android.content.pm.PackageParser";
StringPATH_AssetManager="android.content.res.AssetManager";
try{
//apk包的文件路径
//这是一个Package解释器,是隐藏的
//构造函数的参数只有一个,apk文件的路径
//PackageParserpackageParser=newPackageParser(apkPath);
ClasspkgParserCls=Class.forName(PATH_PackageParser);
Class[]typeArgs=newClass[1];
typeArgs[0]=String.class;
ConstructorpkgParserCt=pkgParserCls.getConstructor(typeArgs);
Object[]valueArgs=newObject[1];
valueArgs[0]=apkPath;
ObjectpkgParser=pkgParserCt.newInstance(valueArgs);
//Log.d("ANDROID_LAB","pkgParser:
"+pkgParser.toString());
//这个是与显示有关的,里面涉及到一些像素显示等等,我们使用默认的情况
DisplayMetricsmetrics=newDisplayMetrics();
metrics.setToDefaults();
//PackageParser.PackagemPkgInfo=packageParser.parsePackage(new
//File(apkPath),apkPath,
//metrics,0);
typeArgs=newClass[4];
typeArgs[0]=File.class;
typeArgs[1]=String.class;
typeArgs[2]=DisplayMetrics.class;
typeArgs[3]=Integer.TYPE;
MethodpkgParser_parsePackageMtd=pkgParserCls.getDeclaredMethod("parsePackage",
typeArgs);
valueArgs=newObject[4];
valueArgs[0]=newFile(apkPath);
valueArgs[1]=apkPath;
valueArgs[2]=metrics;
valueArgs[3]=0;
ObjectpkgParserPkg=pkgParser_parsePackageMtd.invoke(pkgParser,valueArgs);
//应用程序信息包,这个公开的,不过有些函数,变量没公开
//ApplicationInfoinfo=mPkgInfo.applicationInfo;
FieldappInfoFld=pkgParserPkg.getClass().getDeclaredField("applicationInfo");
ApplicationInfoinfo=(ApplicationInfo)appInfoFld.get(pkgParserPkg);
//uid输出为"-1",原因是未安装,系统未分配其Uid。
//ResourcespRes=getResources();
//AssetManagerassmgr=newAssetManager();
//assmgr.addAssetPath(apkPath);
//Resourcesres=newResources(assmgr,pRes.getDisplayMetrics(),
//pRes.getConfiguration());
ClassassetMagCls=Class.forName(PATH_AssetManager);
ConstructorassetMagCt=assetMagCls.getConstructor((Class[])null);
ObjectassetMag=assetMagCt.newInstance((Object[])null);
typeArgs=newClass[1];
typeArgs[0]=String.class;
MethodassetMag_addAssetPathMtd=assetMagCls.getDeclaredMethod("addAssetPath",
typeArgs);
valueArgs=newObject[1];
valueArgs[0]=apkPath;
assetMag_addAssetPathMtd.invoke(assetMag,valueArgs);
Resourcesres=mcontext.getResources();
typeArgs=newClass[3];
typeArgs[0]=assetMa