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

Xamarin项目中PackageInfo始终返回空的问题求助

Xamarin Android 获取PackageInfo为空的解决方案

问题诊断

你的代码核心问题有两点:

  1. 错误实例化PackageManager:你在PM()方法中创建了自定义的PM2类实例,这不是Android系统提供的PackageManager,无法获取系统安装的应用信息。
  2. 权限缺失:Android 11(API 30)及以上版本对应用查询其他应用的权限做了限制,未声明权限会导致无法获取应用列表。

修正步骤

1. 配置Android权限

根据你的需求选择以下一种方式:

  • 仅检测特定应用(推荐,符合隐私规范):在AndroidManifest.xml中添加<queries>标签,指定目标包名:
<manifest ...>
    <queries>
        <!-- 替换成你需要检测的目标应用包名 -->
        <package android:name="com.your.company.targetapp" />
    </queries>
    ...
</manifest>
  • 获取所有已安装应用:添加QUERY_ALL_PACKAGES权限(仅在必要时使用):
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

2. 修正Android端HelperService实现

替换原有的PM()方法,使用系统提供的PackageManager:

using Android.App;
using Android.Content.PM;
using YourAppNamespace.Services; // 替换为你的实际命名空间

[assembly: Xamarin.Forms.Dependency(typeof(HelperService))]
namespace YourAppNamespace.Droid.Services
{
    public class HelperService : IHelperService
    {
        // 通过Application Context获取系统PackageManager
        private PackageManager _packageManager => Application.Context.PackageManager;

        public IList<ApplicationInfo> PM()
        {
            // 使用MatchAll标志获取所有应用的基础信息
            var flags = PackageInfoFlags.MatchAll;
            // 直接返回系统方法结果,无需强制类型转换
            return _packageManager.GetInstalledApplications(flags);
        }

        // 实现抽象类的GetInstalledApplications方法(如果需要)
        public override IList<ApplicationInfo> GetInstalledApplications(PackageInfoFlags flags)
        {
            return _packageManager.GetInstalledApplications(flags);
        }

        // 新增高效检测目标应用的方法(推荐替代获取全量列表)
        public bool IsAppInstalled(string packageName)
        {
            try
            {
                // 尝试获取目标包信息,不存在则抛出NameNotFoundException
                _packageManager.GetPackageInfo(packageName, PackageInfoFlags.MatchAll);
                return true;
            }
            catch (PackageManager.NameNotFoundException)
            {
                return false;
            }
        }

        // 以下保留你的原有接口方法实现
        public void OpenMPOS(string reference, string value)
        {
            // 你的现有代码逻辑
        }

        public bool ScreenOn(bool OnOff)
        {
            // 你的现有代码逻辑
            return false;
        }

        public void ToastLong(string message, string title)
        {
            // 你的现有代码逻辑
        }

        public void ToastShort(string message, string title)
        {
            // 你的现有代码逻辑
        }
    }
}

3. 优化调用逻辑

不需要获取全量应用列表,直接调用新增的IsAppInstalled方法检测目标应用:

// 在PaymentMethods.xaml.cs中调用
bool targetAppExists = DependencyService.Get<IHelperService>().IsAppInstalled("com.your.company.targetapp");

补充说明

  • 避免强制类型转换:GetInstalledApplications返回的IList<ApplicationInfo>可直接使用,无需转换为List<ApplicationInfo>。
  • 跨平台兼容:如果UWP分支也需要检测应用,可在UWP端的HelperService实现对应的检测逻辑(通过PackageManager或AppListEntry)。

内容的提问来源于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 08:24:54