You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 14:03:00