logo_background

以下就是一個工具類,其做用是採用遞歸掃描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;
	}
	
}
 
若是有人看到而且指出上述代碼不足支出,很是感謝! 
   
   
   
   
   
   
本站公眾號
   歡迎關注本站公眾號,獲取更多信息