Xamarin项目中PackageInfo始终返回空的问题求助
Xamarin Android 获取PackageInfo为空的解决方案
问题诊断
你的代码核心问题有两点:
- 错误实例化PackageManager:你在
PM()方法中创建了自定义的PM2类实例,这不是Android系统提供的PackageManager,无法获取系统安装的应用信息。 - 权限缺失: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
相关产品推荐
相关产品推荐

