logo_background

来源:技术人生 责任编辑:栏目编辑 发表时间:2013-07-01 12:37 点击:
如下就是一个工具类,其作用是采用递归扫描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","未安装该应用,可以
	

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • Android 完全退出程序
      • 原创:Android应用开发-Andorid歌词秀,含源码
      • android 屏幕保护
      • Android手机软件汉化教程---第四课 dex文件汉化
      • 众多Android 开源项目推荐,给力工作给力学习
      • Android Audio代码分析4
      • Android得到已安装的应用程序信息!
      • Android开发者指南(29) —— USB Host and Accessory
      • Android成长的幕后推手:工程师鲁宾
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1