/** * 獲取手機上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; } }
若是有人看到而且指出上述代碼不足支出,很是感謝!