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

Xamarin中PackageManager的GetInstalledApplications为何触发NotImplementedException?

解决Xamarin.Android获取已安装应用列表的问题

问题根源

你不需要自行继承PackageManager类——这个抽象类的具体实现由Android系统提供,只需通过应用Context获取实例即可。你自定义的PM2类仅抛出NotImplementedException,自然无法返回有效数据。

修正步骤

  1. 删除无用的PM2类
    直接移除你创建的PM2继承类,无需自行实现PackageManager。

  2. 修改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;
                }
            }
        }
    }
    
  3. 更新接口(可选但推荐)
    为了直接检测目标应用,给MyApp\Services\IHelperService.cs添加对应方法:

    using Android.Content.PM;
    
    namespace MyApp.Services
    {
        public interface IHelperService
        {
            IList<ApplicationInfo> PM();
            // 用于检测指定包名的应用是否安装
            bool IsAppInstalled(string packageName);
        }
    }
    
  4. 调用优化
    如果你只需检测应用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:00:28