zoukankan      html  css  js  c++  java
  • Android获取SD卡上的APK文件,并且判断是否安装过、是否可以更新到新版本的工具类

    如下就是一个工具类,其作用是采用递归扫描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;
    	}
    	
    }
    
  • 相关阅读:
    A.2.5输入年,月,判断本月有多少天?
    A.1.2九九乘法表
    运算原理有点复杂,不懂。啊!求解释?
    A.1.1第一个输出程序“Hello World!”
    什么是 MVC ?
    要么滚回去,要么拼命
    创建Android的Hello World应用程序
    转载华硕2008年Java面试题
    Java 计算器实现
    Java 使用execute方法执行Sql语句
  • 原文地址:https://www.cnblogs.com/lsck/p/2679029.html
Copyright © 2011-2022 走看看