Xamarin Android中获取VersionName的替代方案咨询(原方法已弃用)
获取Xamarin Android应用VersionName的替代方案
针对你遇到的PackageManager.GetPackageInfo(PackageName, 0)被弃用的问题,以下是两种无需依赖Xamarin Essentials的原生解决方案:
方法一:适配新版PackageManager API
Android 11(API 30)起弃用了int类型flags的GetPackageInfo重载,需改用PackageInfoFlags枚举;Android 12(API 31)进一步弃用PackageInfo.VersionName,可根据系统版本做兼容处理:
using Android.Content.PM; using Android.OS; // 获取PackageInfo实例 PackageInfo packageInfo; if (Build.VERSION.SdkInt >= BuildVersionCodes.Tiramisu) // API 33及以上 { packageInfo = PackageManager.GetPackageInfo(PackageName, PackageManager.PackageInfoFlags.None); } else if (Build.VERSION.SdkInt >= BuildVersionCodes.R) // API 30-32 { packageInfo = PackageManager.GetPackageInfo(PackageName, PackageInfoFlags.Of(0)); } else // API 29及以下 { packageInfo = PackageManager.GetPackageInfo(PackageName, 0); } // 获取版本名称 string versionName; if (Build.VERSION.SdkInt >= BuildVersionCodes.S) // API 31及以上 { // VersionCodeName对应AndroidManifest中android:versionCode的字符串形式 // 若需原显示用版本字符串,可在AndroidManifest的<application>中添加<meta-data>字段后读取 versionName = packageInfo.VersionCodeName; } else { versionName = packageInfo.VersionName; }
方法二:从程序集直接读取
如果项目Assembly版本与AndroidManifest配置的versionName保持同步,可直接从程序集获取版本信息,无需调用PackageManager:
using System.Reflection; var assembly = typeof(MainActivity).Assembly; var assemblyVersion = assembly.GetName().Version; var versionName = $"{assemblyVersion.Major}.{assemblyVersion.Minor}.{assemblyVersion.Build}";
注:使用此方法需确保项目属性的Assembly版本与AndroidManifest的
android:versionName完全一致,避免版本信息不匹配。
内容的提问来源于stack exchange,提问作者Jim Wilcox
相关产品推荐
相关产品推荐

