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

链接: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 {
    private static int INSTALLED = 0 ; // 表示已经安装,且跟现在这个apk文件是一个版本
    private static int UNINSTALLED = 1 ; // 表示未安装
    private static int INSTALLED_UPDATE = 2 ; // 表示已经安装,版本比现在这个版本要低,可以点击按钮更新
    private Context context;
    private List<MyFile> myFiles = new ArrayList<MyFile>();
    public List<MyFile> getMyFiles() {
        return myFiles;
    }
    public void setMyFiles(List<MyFile> myFiles) {
        this .myFiles = myFiles;
    }
    public ApkSearchUtils(Context context) {
        super ();
        this .context = context;
    }
    /**
     * @param args
     *            运用递归的思想,递归去找每个目录下面的apk文件
     */
    public void FindAllAPKFile(File file) {
        // 手机上的文件,目前只判断SD卡上的APK文件
        // file = Environment.getDataDirectory();
        // SD卡上的文件目录
        if (file.isFile()) {
            String name_s = file.getName();
            MyFile myFile = new MyFile();
            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 */
                int versionCode = packageInfo.versionCode;
                myFile.setVersionCode(versionCode);
                /**安装处理类型*/
                int type = 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     要判断应用的版本号
     */
    private int doType(PackageManager pm, String packageName, int versionCode) {
        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" , "已经安装,不用更新,可以卸载该应用" );
                    return INSTALLED;
                } else if (versionCode>pi_versionCode){
                    Log.i( "test" , "已经安装,有更新" );  
                    return INSTALLED_UPDATE;
                }
            }
        }
        Log.i( "test" , "未安装该应用,可以安装" );   
        return UNINSTALLED;
    }
   
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值