Android获取SD卡上的APK文件,并且判断是否安装过、是否可以更新到新版本的工具类

 如下就是一个工具类,其作用是采用递归扫描SD卡上的apk文件,判断该应用是否在手机上安装过,如果安装过再去判断是否可以升级。具体代码如下:

view source
print ?
001 /**
002  * 获取手机上apk文件信息类,主要是判断是否安装再手机上了,安装的版本比较现有apk版本信息
003  * <a href="http://my.oschina.net/arthor" target="_blank" rel="nofollow">@author</a>  Dylan
004  */
005 public class ApkSearchUtils {
006     private static int INSTALLED = 0; // 表示已经安装,且跟现在这个apk文件是一个版本
007     private static int UNINSTALLED = 1; // 表示未安装
008     private static int INSTALLED_UPDATE =2; // 表示已经安装,版本比现在这个版本要低,可以点击按钮更新
009  
010     private Context context;
011     private List<MyFile> myFiles = new ArrayList<MyFile>();
012  
013     public List<MyFile> getMyFiles() {
014         return myFiles;
015     }
016  
017     public void setMyFiles(List<MyFile> myFiles) {
018         this.myFiles = myFiles;
019     }
020  
021     public ApkSearchUtils(Context context) {
022         super();
023         this.context = context;
024     }
025  
026     /**
027      * @param args
028      *            运用递归的思想,递归去找每个目录下面的apk文件
029      */
030     public void FindAllAPKFile(File file) {
031  
032         // 手机上的文件,目前只判断SD卡上的APK文件
033         // file = Environment.getDataDirectory();
034         // SD卡上的文件目录
035         if (file.isFile()) {
036             String name_s = file.getName();
037             MyFile myFile = new MyFile();
038             String apk_path = null;
039             // MimeTypeMap.getSingleton()
040             if (name_s.toLowerCase().endsWith(".apk")) {
041                 apk_path = file.getAbsolutePath();// apk文件的绝对路劲
042                 // System.out.println("----" + file.getAbsolutePath() + "" +
043                 // name_s);
044                 PackageManager pm = context.getPackageManager();
045                 PackageInfo packageInfo = pm.getPackageArchiveInfo(apk_path, PackageManager.GET_ACTIVITIES);
046                 ApplicationInfo appInfo = packageInfo.applicationInfo;
047  
048                  
049                  /**获取apk的图标 */
050                 appInfo.sourceDir = apk_path;
051                 appInfo.publicSourceDir = apk_path;
052                 Drawable apk_icon = appInfo.loadIcon(pm);
053                 myFile.setApk_icon(apk_icon);
054                 /** 得到包名 */
055                 String packageName = packageInfo.packageName;
056                 myFile.setPackageName(packageName);
057                 /** apk的绝对路劲 */
058                 myFile.setFilePath(file.getAbsolutePath());
059                 /** apk的版本名称 String */
060                 String versionName = packageInfo.versionName;
061                 myFile.setVersionName(versionName);
062                 /** apk的版本号码 int */
063                 int versionCode = packageInfo.versionCode;
064                 myFile.setVersionCode(versionCode);
065                 /**安装处理类型*/
066                 int type = doType(pm, packageName, versionCode);
067                 myFile.setInstalled(type);
068                  
069                 Log.i("ok", "处理类型:"+String.valueOf(type)+"\n" + "------------------我是纯洁的分割线-------------------");
070                 myFiles.add(myFile);
071             }
072             // String apk_app = name_s.substring(name_s.lastIndexOf("."));
073         } else {
074             File[] files = file.listFiles();
075             if (files != null && files.length > 0) {
076                 for (File file_str : files) {
077                     FindAllAPKFile(file_str);
078                 }
079             }
080         }
081     }
082  
083     /*
084      * 判断该应用是否在手机上已经安装过,有以下集中情况出现
085      * 1.未安装,这个时候按钮应该是“安装”点击按钮进行安装
086      * 2.已安装,按钮显示“已安装” 可以卸载该应用
087      * 3.已安装,但是版本有更新,按钮显示“更新” 点击按钮就安装应用
088      */
089      
090     /**
091      * 判断该应用在手机中的安装情况
092      * @param pm                   PackageManager 
093      * @param packageName  要判断应用的包名
094      * @param versionCode     要判断应用的版本号
095      */
096     private int doType(PackageManager pm, String packageName, int versionCode) {
097         List<PackageInfo> pakageinfos = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
098         for (PackageInfo pi : pakageinfos) {
099             String pi_packageName = pi.packageName;
100             int pi_versionCode = pi.versionCode;
101             //如果这个包名在系统已经安装过的应用中存在
102             if(packageName.endsWith(pi_packageName)){
103                 //Log.i("test","此应用安装过了");
104                 if(versionCode==pi_versionCode){
105                     Log.i("test","已经安装,不用更新,可以卸载该应用");
106                     return INSTALLED;
107                 }else if(versionCode>pi_versionCode){
108                     Log.i("test","已经安装,有更新");  
109                     return INSTALLED_UPDATE;
110                 }
111             }
112         }
113         Log.i("test","未安装该应用,可以安装");   
114         return UNINSTALLED;
115     }
116      
117 }

你可能感兴趣的:(Android获取SD卡上的APK文件,并且判断是否安装过、是否可以更新到新版本的工具类)