Android Studio重装App时如何正确获取安装时间?
如何检测Android Studio重装APK后的安装时间?
我原本用这段代码获取App的安装时间:
PackageManager p = this.getPackageManager(); ApplicationInfo apinf = null; apinf = p.getApplicationInfo(this.getPackageName(), 0); String apkFile = apinf.sourceDir; installTime = new File(apkFile).lastModified();
但发现通过Android Studio重新安装APK时,installTime并没有更新;只有手动卸载后再重装,这个时间才会正常刷新。想请教怎么修改代码,才能正确检测到这种覆盖安装的时间?
这个问题我之前也碰到过,核心原因是Android Studio的增量安装不会完全替换整个APK文件,它只会更新修改过的资源或代码片段,所以APK文件本身的lastModified()时间不会改变,自然拿不到最新的安装/更新时间。给你两个靠谱的解决方案:
方法1:使用系统提供的PackageInfo API(优先推荐)
Android系统其实已经内置了获取安装和更新时间的接口,完全不需要自己读取APK文件,而且可靠性拉满:
try { PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0); // 首次安装的时间(卸载重装会重置) long firstInstallTime = packageInfo.firstInstallTime; // 最后一次更新的时间(包括Android Studio覆盖安装、应用市场更新) long lastUpdateTime = packageInfo.lastUpdateTime; // 你需要的覆盖安装时间,直接用lastUpdateTime就可以了 Log.d("InstallTime", "最后更新时间:" + new Date(lastUpdateTime)); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); }
不管是全量覆盖安装还是Android Studio的增量安装,lastUpdateTime都会准确更新,完美解决你的问题。
方法2:读取APK内部签名文件的修改时间(备选方案)
如果因为某些特殊场景不能用PackageInfo的API,可以尝试读取APK包内签名相关文件的修改时间——覆盖安装时这些文件一定会被重新生成,所以时间是最新的:
try { ApplicationInfo appInfo = getPackageManager().getApplicationInfo(getPackageName(), 0); ZipFile zipFile = new ZipFile(appInfo.sourceDir); // 读取MANIFEST.MF文件的修改时间,也可以选其他签名文件比如CERT.RSA ZipEntry manifestEntry = zipFile.getEntry("META-INF/MANIFEST.MF"); long updateTime = manifestEntry.getTime(); zipFile.close(); Log.d("InstallTime", "覆盖安装时间:" + new Date(updateTime)); } catch (IOException | PackageManager.NameNotFoundException e) { e.printStackTrace(); }
不过这个方法需要处理IO异常,代码复杂度更高,还是优先选方法1。
内容的提问来源于stack exchange,提问作者xxx374562
相关产品推荐
相关产品推荐

