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

Android进阶之路 - apk静默安装、卸载 关于apk静默安装、卸载的方式,网上有很多类似的文章,包含内容都基本一致,我之所以还会写这样的Blog,只是想减少你不必要浪费的时间 ~ Look Here : 首先静默功能一般是被系统所禁止的!如果你的应用不是系统应用,使用的设备也没有root过的话,就不必要看下面的实现方式了,因为系统没有为你开放权限! 基础配置7.0适配8.0适配9.0适配 - 正常实现9.0适配 - 工具封装 基础配置 关于静默安装的方式 shell 调用 pm 命令 反射调用 PackageManager 的 instal. 阅读详情

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

/**
 * 获取手机上apk文件信息类,主要是判断是否安装再手机上了,安装的版本比较现有apk版本信息
 * <a href="http://my.oschina.net/arthor" target="_blank" rel="nofollow">@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;
	}
	
}
来自本人的OSChina



KEIL MDK 生成bin文件实战:C51与ARM双平台配置指南 本文详细介绍了在KEIL MDK开发环境中,为C51和ARM双平台自动生成BIN文件的实战方法。针对C51平台,通过srec_cat.exe工具编写批处理脚本并集成到KEIL;针对ARM平台,则利用fromelf.exe工具直接配置。文章还提供了通用脚本方案和路径、变量、版本兼容性等常见问题的避坑指南,帮助开发者高效完成嵌入式程序部署。 阅读详情

相关推荐

三维重建之条纹投影结构光(三)——相高模型标定

接上面两文: 三维重建之条纹投影结构光(一)https://blog.csdn.net/beyond951/article/details/123361852?spm=1001.2014.3001.5501三维重建之条纹投影结构光(二)——四步相移+三频外差法https://blog.csdn.net/beyond951/article/details/123769596?spm=1001.2014.3001.5501接下来对相高模型进行标定,其推导过程如下图所示 ...

beyond951的博客 4876

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

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34281537的博客 268

S7-PLCSIM Advanced V3.0虚拟PLC组态下载失败?手把手教你解决IP地址冲突问题

本文针对S7-PLCSIM Advanced V3.0组态下载失败问题,深入剖析了IP地址冲突的根本原因。通过对比博途项目PLC、虚拟网卡及本机物理网卡的IP配置,提供了清晰的排查流程与标准化解决方案,帮助用户快速修复网络可达性问题,确保虚拟PLC仿真顺利进行。

weixin_29306261的博客 193

android 根据apk文件获取包名等信息 已经判断 指定 这个apk 是否安装过

http://blog.163.com/benben_long/blog/static/1994582432014219104154971/ 比如sd卡里有一个apk文件,可以根据这个apk文件得到他的包名及版本等一切信息。 package com.example.test; import com.example.androidgametest.R; import

mengzhengjie的专栏 3919

Coze工作流实战:Coze一键生成沉浸式历史故事视频

【coze工作流实战】一键生成火爆的沉浸式历史故事视频!短短3分钟,顶替你3天的工作量!

bickys的博客 1004

【个人学习总结】CRC校验原理及实现

CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 ..................

星Yeah 的博客 7967

android packagemanagerservice目录,Android重学系列 PackageManagerService的启动与安装(下)

前言PMS installStage PMS中的安装步骤void installStage(String packageName, File stagedDir,IPackageInstallObserver2 observer, PackageInstaller.SessionParams sessionParams,String installerPackageName, int instal...

weixin_28991019的博客 848

【PINN物理信息网络】基于PINN物理信息网络求解瞬态薛定谔方程(python)

【PINN物理信息网络】基于PINN物理信息网络求解瞬态薛定谔方程(python)

k8291121的博客 2723

Android获取应用的安装包路径

获取当前应用的安装包路径 context.getPackageResourcePath(); 获取其他应用的安装包路径 getPackageManager().getApplicationInfo(packageName, 0).sourceDir;

TE28093163的专栏 9379

解锁机器人动态平衡算法:从原理到实践

机器人的动态平衡,是指机器人在运动过程中,面对各种复杂的动态变化和外界干扰,依然能够维持稳定状态,不发生倾倒或失去控制的能力。它就像是一位技艺精湛的舞者,在舞台上翩翩起舞时,无论做出多么复杂的动作,都能巧妙地调整身体姿态,始终保持平衡,展现出优美的舞姿。在实际应用中,机器人的动态平衡对于其稳定运行起着至关重要的作用。以双足机器人为例,当它行走在不平整的地面上时,地面的起伏会使机器人的重心不断发生变化。如果没有良好的动态平衡能力,机器人就很容易因为重心偏移而摔倒,无法完成行走任务。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 3838

液态神经网络(LNN):打破AI“静态快照”的连续动力学革命---AI大模型系统从零开始0029

MIT研究团队受秀丽隐杆线虫神经系统的启发,开发出革命性的液态神经网络(LNN)。该技术通过连续微分方程建模神经元动态,实现输入响应速度的自适应调节,解决了传统AI模型静态化、高能耗和低解释性的痛点。LNN具有三大突破性优势:仅需少量神经元(如20个)即可完成复杂任务;能处理非均匀时序数据;在自动驾驶、医疗监测等领域展现出卓越的适应性和鲁棒性。这项将生物智能与数学建模完美融合的技术,有望成为下一代AI的核心架构,目前已在无人机导航等场景验证了其高效性,被预测为2026年最具潜力的AI突破方向。

添柴程序猿的专栏 372

C语言scanf函数

文章目录一、数据输入二、断章取义三、scanf输入1、输入整数2、输入字符3、输入浮点数4、输入字符串5、输入多个内容6、示例(book13.c)四、注意事项五、版权声明 一、数据输入 编写程序的主要目的就是为了处理数据。数据从哪里来?数据的来源有很多种方式,如从磁盘文件中读取数据、从数据库中读取数据、从网页中抓取数据等,还有一种原始的方式就是从键盘输入数据。 在C语言中,有三个函数可以从键盘获得...

C语言技术网 7120

SAP_MM模块库存概览俄罗斯报表简介

本文介绍了SAP MM模块中"库存概览俄罗斯报表"的功能与应用。该报表主要用于查看物料在不同库存地点和类型的库存情况,并满足俄罗斯当地法规要求。文章解释了"俄罗斯报表"可能指代本地化合规库存报表或客户自定义报表,详细说明了事务代码J3RFLVMOBVEDH的操作步骤,包括公司代码、物料编码、日期范围等查询条件,并解释了报表中各字段含义如期初期末库存数量与价值。最后强调在物料分类账处理完成后使用该报表可获得实际库存价值,为SAP用户提供了实用的库存管理参考。

我小时候很黑的博客 1087

【C语言指南】scanf()函数详解

scanf()函数是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。对于scanf()函数的掌握是使用C语言的一门必修课

倔强的石头的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【C语言】scanf函数

【C语言】scanf函数

XJ2536877903的博客 2116

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【C语言】scanf 函数的深入解析与应用案例

在C语言编程中,scanf函数因其强大的格式化输入功能而被广泛使用。本文将深入解析scanf函数的工作原理、格式说明符、常见问题及其解决方案,并结合实际案例进行详细说明。此外,我们也会探讨scanf_s和fgets这两个函数,它们在某些编程环境下被推荐用于提高程序的安全性和健壮性。除了每次在项目中定义外,有一种方法可以一次性解决所有新创建的C++文件中的宏定义问题。下载并安装 Everything:Everything 是一款高效的文件搜索工具,可以帮助你快速找到系统中的文件。搜索。

ajiasha1的博客 4242

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ARM汇编调用C语言中的scanf函数

ARM汇编实现输入两个数求和在输出 | ARM汇编调用C语言中的scanf函数 | ARM汇编调用printf函数 | ARM汇编新模板

GRT609的博客 3821

c语言-scanf/scanf_s函数的用法

scanf()如果缓冲区中无内容,则出现堵塞,在运行窗口要求用户输入;输入的格式有:各种字符,如字符串,单字符和数字等。

诊断协议那些事儿's blog 2030

C语言|scanf输入函数

可以看到我们输入的时候打了一个23就要打一个enter,再打入44,按一个enter才会输出s的值44但是---------当我们在第一行输入2344,中间不加enter,系统就会默认n的值是2344,当我们第二次输入enter,再输入数字1的时候,s的值才是1【如下图】在C语言中,scanf_s函数用于从标准输入(通常是键盘)读取格式化的输入。当你调用时,程序会暂停并等待用户输入两个整数,这两个整数之间可以用空格、制表符或其他空白字符分隔。用户必须按下键来表示输入的结束,这样scanf_s。

weixin_52998380的博客 3402

【C语言】 scanf输入函数

在C语言中,使用scanf函数可以从标准输入设备读取数据,并根据指定的格式进行输入。下面是一些关键的小知识点,帮助你更好地理解和记忆scanfscanf函数基本语法scanf函数返回成功匹配并赋值的输入项数目。格式字符串中的占位符需要与要读取的数据类型精确匹配。处理分隔符scanf函数会自动忽略输入中的空白字符,直到遇到下一个非空白字符。可以使用非空白字符作为分隔符来精确读取数据,确保输入中包含指定的分隔符。检查scanf的返回值通过检查scanf函数的返回值,可以验证输入的格式是否匹配。

weixin_62688213的博客 1996

C语言中scanf函数与空格回车

scanf()函数有返回值,且返回值是正确读取的个数 scanf("%d%d", &x, &y); 若是x,y都被正确读取了,则返回值是2; 若只有x被正确读取了,则返回值是1;(不存在x没有被正确读取,但是y被正确读取的情况) 若x,y都没有被读取,则返回值为0; 若是遇到错误或者文件末尾,则返回-1,这个-1就是常见的E0F(end of file),他俩等价; scanf是从缓存区读取数据的 每成功读取就会把缓存区的该数据删掉; 若是需要读取但是缓存区还没有值,scanf..

I_AM_KK的博客 2587

c语言scanf()函数的原理

scanf()函数的原理 想象输入设备(键盘)连接着一个叫“缓冲”的东西,把缓冲认为是一个字符数组。 当你的程序执行到scanf时,会从你的缓冲区读东西,如果缓冲区是空的,就阻塞住,等待你从键盘输入。 现在假设你的缓冲区里有:abcd\n1234\n (其中\n是回车符)执行:scanf("%s",name);的时候,由于scanf是读数据直到看见空白符(空白符:指空格符、制表符、回车符)就停止...

辉小歌的博客 2728

C语言中的scanf函数

C语言scanf函数讲解

Xz_HAN的博客 3894

C 语言: scanf 函数详解

在 C 语言编程中,scanf函数是一个非常重要的输入函数,它允许用户从标准输入(通常是键盘)读取数据并存储到变量中。本文将深入探讨 C 语言中scanf函数的用法、特点以及一些需要注意的事项。

2301_76297596的博客 1785

c语言scanf不起作用,C语言中关于scanf()易错的几个问题

/* 转自:http://blog.csdn.net/wayne92/archive/2006/01/04/570487.aspx */曾经错的几个地方:(xpsp2,vc6.0环境下)1.空白符问题#includemain(){int a;printf("input the data/n");scanf("%d/n",&a);// 这里多了一个回车符/nprintf("%d",a);re...

weixin_42566072的博客 8573

C语言中的scanf的使用

感谢大家分享,今天在查阅了一些资料之后,终于直观的搞懂了C语言中的scanf的工作机制,以及经常遇到的各种奇葩问题。 scanf的工作机制 了解其工作机制,才能知晓其外表下的内在原因,总是有道理的。 scanf()函数的工作过程可以简单描述为如下过程: 只有当输入回车键的时候,scanf()才开始工作。 文字描述为: 为了提高存储器访问效率,操作系统的缓冲区管理机制,键盘输入的

nature_XD的专栏 1万+
上一篇: Android回调机制
下一篇: Android异步从网络下载图片并且缓存图片到本地的demo
月氏女神
博客等级 码龄14年 5粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值