Xamarin中PackageManager的GetInstalledApplications为何触发NotImplementedException?
解决Xamarin.Android获取已安装应用列表的问题
问题根源
你不需要自行继承PackageManager类——这个抽象类的具体实现由Android系统提供,只需通过应用Context获取实例即可。你自定义的PM2类仅抛出NotImplementedException,自然无法返回有效数据。
修正步骤
删除无用的
PM2类
直接移除你创建的PM2继承类,无需自行实现PackageManager。修改Android端服务实现
更新MyApp.Android\Services\HelperService.cs,直接获取系统PackageManager实例:using Android.App; using Android.Content.PM; namespace MyApp.Droid.Services { public class HelperService : IHelperService { public IList<ApplicationInfo> PM() { // 获取系统提供的PackageManager实例 PackageManager pm = Application.Context.PackageManager; // 指定获取所有已安装应用的标志 PackageInfoFlags flags = PackageInfoFlags.MatchAll; // 返回应用列表 return pm.GetInstalledApplications(flags); } // 新增高效检测特定应用的方法(匹配你的需求) public bool IsAppInstalled(string packageName) { try { PackageManager pm = Application.Context.PackageManager; pm.GetPackageInfo(packageName, PackageInfoFlags.MatchAll); return true; } catch (PackageManager.NameNotFoundException) { // 包名不存在,说明应用未安装 return false; } } } }更新接口(可选但推荐)
为了直接检测目标应用,给MyApp\Services\IHelperService.cs添加对应方法:using Android.Content.PM; namespace MyApp.Services { public interface IHelperService { IList<ApplicationInfo> PM(); // 用于检测指定包名的应用是否安装 bool IsAppInstalled(string packageName); } }调用优化
如果你只需检测应用B是否安装,无需获取全部列表,直接调用新增方法更高效:// 替换为应用B的实际包名,例如com.example.appb string targetAppPackage = "com.example.appb"; bool isAppBInstalled = DependencyService.Get<Services.IHelperService>().IsAppInstalled(targetAppPackage); if (!isAppBInstalled) { // 执行你的自定义下载提示逻辑 }
权限验证
你已在AssemblyInfo.cs中配置了QueryAllPackages权限,这是Android 11及以上获取全部应用列表的必要权限,无需额外配置。
内容的提问来源于stack exchange,提问作者Celso
相关产品推荐
相关产品推荐

