如何在Kotlin中获取其他应用的版本号与版本代码?
如何在Kotlin中获取其他应用的版本号与版本代码?
嘿,这个问题我熟!你要在自己的Kotlin应用里获取其他App的版本号和版本代码,核心就是靠Android系统提供的PackageManager工具类,它能帮我们拿到设备上已安装应用的包信息。下面我一步步给你讲清楚怎么做:
一、先搞清楚关键前提:目标应用的包名
每个Android应用都有唯一的包名,这是我们定位目标应用的核心标识。你可以通过这些方式拿到包名:
- 查看目标应用的
AndroidManifest.xml文件(如果能拿到源码的话) - 用ADB命令查询:
adb shell pm list packages,会列出设备上所有App的包名 - 在应用市场的应用详情页URL里找(比如Google Play的链接里通常会包含包名)
二、适配Android版本的权限配置
如果你的App目标SDK版本是30(Android 11)及以上,需要先配置对应的查询权限,不然会拿不到信息:
- 方式一(仅查询特定App,更合规):在
AndroidManifest.xml里添加<queries>标签,声明你要查询的目标包名<queries> <!-- 替换成你要查询的目标应用包名 --> <package android:name="com.example.target.app" /> </queries> - 方式二(查询所有已安装App):添加全局查询权限,不过这种方式在Google Play审核时可能需要说明理由
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />
三、具体的Kotlin代码实现
我给你写了一个封装好的扩展函数,直接就能用,还处理了不同Android版本的适配和异常情况:
import android.content.Context import android.content.pm.PackageManager import android.os.Build import android.util.Log // 传入目标应用的包名,返回版本号(String)和版本代码(Int)的Pair,无结果时返回null fun Context.getAppVersionInfo(targetPackageName: String): Pair<String?, Int?> { return try { // 获取PackageManager实例 val packageManager = this.packageManager // 适配Android 13及以上的API,避免方法过时 val packageInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { packageManager.getPackageInfo( targetPackageName, PackageManager.PackageInfoFlags.of(0) ) } else { @Suppress("DEPRECATION") packageManager.getPackageInfo(targetPackageName, 0) } // 处理版本代码:Android 9及以上版本用longVersionCode val versionCode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { packageInfo.longVersionCode.toInt() } else { @Suppress("DEPRECATION") packageInfo.versionCode } // 返回版本号和版本代码 Pair(packageInfo.versionName, versionCode) } catch (e: PackageManager.NameNotFoundException) { // 目标应用未安装时触发 Log.e("VersionError", "目标应用未安装:${e.message}") Pair(null, null) } catch (e: SecurityException) { // 权限不足时触发 Log.e("VersionError", "权限不足,无法获取应用信息:${e.message}") Pair(null, null) } }
调用示例
在Activity或者Fragment里直接调用这个扩展函数就行:
// 替换成你要查询的目标应用包名 val targetPackage = "com.example.target.app" val (versionName, versionCode) = getAppVersionInfo(targetPackage) versionName?.let { Log.d("AppVersion", "目标应用版本号:$it") } ?: run { Log.d("AppVersion", "未获取到目标应用版本号") } versionCode?.let { Log.d("AppVersion", "目标应用版本代码:$it") } ?: run { Log.d("AppVersion", "未获取到目标应用版本代码") }
小提醒
对了,你之前说用Build.serial获取自己App的版本是个小误区哦~Build.serial是设备的序列号,自己App的版本信息应该用BuildConfig.VERSION_NAME(版本号)和BuildConfig.VERSION_CODE(版本代码)才对!
内容来源于stack exchange
相关产品推荐
相关产品推荐

