在.NET MAUI(C#)中实现Android应用内更新时遇到ERROR_API_NOT_AVAILABLE错误
嘿,我看你在用Xamarin.Google.Android.Play.Core库做Android应用内更新的时候,碰到了ERROR_API_NOT_AVAILABLE(错误码-3)的问题,导致更新弹窗出不来,task.IsSuccessful还一直是false。结合你描述的测试场景和代码,我整理了几个可能的原因和解决办法,你可以挨个排查试试:
设备/系统不满足API要求
应用内更新API对设备环境有硬性要求:- 设备必须安装Google Play商店应用,而且版本得足够新(至少16.0.0以上,最好更到最新版);
- 系统版本得是Android 5.0(API 21)及以上;
- 最重要的是,设备得完整安装Google移动服务(GMS),国内有些定制系统没有预装GMS,或者GMS不完整,就会直接触发这个错误。
你可以先检查测试设备的Play商店版本,或者在设置里看看GMS服务是否正常运行,必要时更新Play商店到最新版。
Internal App Sharing的测试流程有问题
用Internal App Sharing测更新的时候,步骤不能太急:
当你打开2.0版本的分享链接后,别直接切回1.0的应用,先让Google Play商店识别到有可用更新——哪怕你不点击安装,也要等Play商店加载出“更新”按钮,确保它同步到了新版本的信息。另外,Internal App Sharing的更新检测可能有延迟,你可以等个几分钟,或者去Play商店的「我的应用和游戏」页面下拉刷新一下更新状态,再回到旧应用测试。库版本或项目配置的坑
你用的是Xamarin.Google.Android.Play.Core1.10.3.15版本,虽然不算特别旧,但可以试试升级到最新稳定版,有时候旧库和某些设备的Play服务会有兼容性问题。另外,记得检查你的Android项目目标SDK版本,建议设为API 33或更高,同时确保AndroidManifest.xml里没有禁用任何和Play服务相关的组件。代码里可以优化的地方
看你的代码,获取AppUpdateInfo的方式可以调整一下,避免类型转换出错:var appUpdateInfo = task.Result.JavaCast<AppUpdateInfo>();另外,建议在启动更新流之前加个异常捕获,这样能拿到更具体的错误信息:
if (appUpdateInfo.UpdateAvailability() == UpdateAvailability.UpdateAvailable && appUpdateInfo.IsUpdateTypeAllowed(AppUpdateType.Immediate)) { try { appUpdateManager.StartUpdateFlowForResult( appUpdateInfo, AppUpdateType.Immediate, this, 123); } catch (Java.Lang.Exception ex) { System.Diagnostics.Debug.WriteLine($"启动更新失败:{ex.Message}"); } }模拟器测试的限制
如果是用模拟器测试,一定要选带Google Play的系统镜像(比如「Google Play Intel x86 Atom_64」这种),而且要登录Google账号。普通的模拟器镜像没有完整的GMS服务,肯定会触发这个错误。
先从设备环境和测试流程入手排查,这些是最常见的原因,希望能帮你解决问题!
备注:内容来源于stack exchange,提问作者Meghna Singh

