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

如下就是一个工具类,其作用是采用递归扫描SD卡上的apk文件,判断该应用是否在手机上安装过,如果安装过再去判断是否可以升级。具体代码如下:

/**

* 获取手机上apk文件信息类,主要是判断是否安装再手机上了,安装的版本比较现有apk版本信息

* @author 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 myFiles = new ArrayList();

public List getMyFiles() {

return myFiles;

}

public void setMyFiles(List 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 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;

}

}

如果有人看到并且指出上述代码不足支出,非常感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值