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

来源:互联网 发布:淘宝晒单怎么晒 编辑:程序博客网 时间:2024/05/21 11:38

链接:http://www.cnblogs.com/lsck/archive/2012/09/10/2679029.html

相关:http://wenku.baidu.com/view/d0e6953a5727a5e9856a61b5.html

http://bbs.csdn.net/topics/380128653

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

?
/**
* 获取手机上apk文件信息类,主要是判断是否安装再手机上了,安装的版本比较现有apk版本信息
* <A href="http://my.oschina.net/arthor" rel=nofollow target=_blank>@author</A>  Dylan
*/
public class ApkSearchUtils {
    privatestaticint INSTALLED = 0; // 表示已经安装,且跟现在这个apk文件是一个版本
    privatestaticint UNINSTALLED = 1; // 表示未安装
    privatestaticint INSTALLED_UPDATE =2;// 表示已经安装,版本比现在这个版本要低,可以点击按钮更新
    privateContext context;
    privateList<MyFile> myFiles =newArrayList<MyFile>();
    publicList<MyFile> getMyFiles() {
        return myFiles;
    }
    publicvoidsetMyFiles(List<MyFile> myFiles) {
        this.myFiles = myFiles;
    }
    publicApkSearchUtils(Context context) {
        super();
        this.context = context;
    }
    /**
     * @param args
     *            运用递归的思想,递归去找每个目录下面的apk文件
     */
    publicvoidFindAllAPKFile(File file) {
        // 手机上的文件,目前只判断SD卡上的APK文件
        // file = Environment.getDataDirectory();
        // SD卡上的文件目录
        if (file.isFile()) {
            String name_s = file.getName();
            MyFile myFile = newMyFile();
            String apk_path = null;
            // MimeTypeMap.getSingleton()
            if (name_s.toLowerCase().endsWith(".apk")) {
               apk_path = file.getAbsolutePath();// apk文件的绝对路劲
               // System.out.println("----" + file.getAbsolutePath() + "" +
               // name_s);
               PackageManager pm = context.getPackageManager();
               PackageInfo packageInfo = pm.getPackageArchiveInfo(apk_path, PackageManager.GET_ACTIVITIES);
               ApplicationInfo appInfo = packageInfo.applicationInfo;
               
                /**获取apk的图标 */
               appInfo.sourceDir = apk_path;
               appInfo.publicSourceDir = apk_path;
               Drawable apk_icon = appInfo.loadIcon(pm);
               myFile.setApk_icon(apk_icon);
               /** 得到包名 */
               String packageName = packageInfo.packageName;
               myFile.setPackageName(packageName);
               /** apk的绝对路劲 */
               myFile.setFilePath(file.getAbsolutePath());
               /** apk的版本名称 String */
               String versionName = packageInfo.versionName;
               myFile.setVersionName(versionName);
               /** apk的版本号码 int */
               intversionCode = packageInfo.versionCode;
               myFile.setVersionCode(versionCode);
               /**安装处理类型*/
               inttype = doType(pm, packageName, versionCode);
               myFile.setInstalled(type);
               
               Log.i("ok","处理类型:"+String.valueOf(type)+"\n"+"------------------我是纯洁的分割线-------------------");
               myFiles.add(myFile);
            }
            // String apk_app = name_s.substring(name_s.lastIndexOf("."));
        } else {
            File[] files = file.listFiles();
            if (files != null&& files.length >0) {
               for(File file_str : files) {
                   FindAllAPKFile(file_str);
               }
            }
        }
    }
    /*
     * 判断该应用是否在手机上已经安装过,有以下集中情况出现
     * 1.未安装,这个时候按钮应该是“安装”点击按钮进行安装
     * 2.已安装,按钮显示“已安装” 可以卸载该应用
     * 3.已安装,但是版本有更新,按钮显示“更新” 点击按钮就安装应用
     */
   
    /**
     * 判断该应用在手机中的安装情况
     * @param pm                   PackageManager 
     * @param packageName  要判断应用的包名
     * @param versionCode     要判断应用的版本号
     */
    privateintdoType(PackageManager pm, String packageName,intversionCode) {
        List<PackageInfo> pakageinfos = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
        for (PackageInfo pi : pakageinfos) {
            String pi_packageName = pi.packageName;
            int pi_versionCode = pi.versionCode;
            //如果这个包名在系统已经安装过的应用中存在
            if(packageName.endsWith(pi_packageName)){
               //Log.i("test","此应用安装过了");
               if(versionCode==pi_versionCode){
                   Log.i("test","已经安装,不用更新,可以卸载该应用");
                   returnINSTALLED;
               }elseif(versionCode>pi_versionCode){
                   Log.i("test","已经安装,有更新");  
                   returnINSTALLED_UPDATE;
               }
            }
        }
        Log.i("test","未安装该应用,可以安装");   
        return UNINSTALLED;
    }
   
}

原创粉丝点击