c# - 如何使用 Unity3D 获取已安装的应用程序列表?

标签 c# android unity3d

我正在尝试使用 C# 中的 Unity3D 制作一个 android 启动器,除了检测已安装的应用程序外,一切都已就绪。

我尝试了很多不同的方法,但它们都卡在同一个地方,访问 PackageManager 中的 getInstalledApplications

我想我已经成功地在 C# 中复制了 ApplicationInfo 类,至少在变量存储方面,通过研究 android 源代码,所以我认为这不是问题,至少现在不是。 ..

简单地说,我需要 URI(或我可以用来打开应用程序的东西)、应用程序的名称和应用程序的图标(指向其位置的字符串,或 Texture2D 本身),我尝试使用 ApplicationInfo,因为它拥有所有这些,然后还有一些,但如果我必须单独或通过其他方法获取它们,那完全没问题。

这是我现在正在做的一个例子。 无论我使用类还是对象,都会发生这种情况。

void Start () {
                AndroidJavaClass pluginClass = new AndroidJavaClass("android.content.pm.PackageManager");

            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = jc.GetStatic<AndroidJavaObject>("currentActivity");
        Debug.Log(currentActivity.Call<string>("getPackageName"));
        int flag = pluginClass.GetStatic<int>("GET_META_DATA");
        AndroidJavaClass syspackage = currentActivity.Call<AndroidJavaClass>("getPackageManager");

这是我得到的错误

AndroidJavaException: Java.lang.NoSuchMethodError: no method with name = 'getInstalledApplications' signature=Ljava/lang/Class;' in class Lcom.unity3d/player/UnityPlayerActivity;

我如何使它起作用?或者你能告诉/展示另一种可以实现目标的方法吗?

//编辑 好吧,我花了 HOURS 时间尝试了所有可能的组合,然后我明白了。

AndroidJavaClass pluginClass = new AndroidJavaClass("android.content.pm.PackageManager");
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = jc.GetStatic<AndroidJavaObject>("currentActivity");
int flag = pluginClass.GetStatic<int>("GET_META_DATA");
AndroidJavaObject pm = currentActivity.Call<AndroidJavaObject>("getPackageManager");
AndroidJavaObject syspackages = pm.Call<AndroidJavaObject>("getInstalledApplications", flag);

现在我只需要弄清楚如何将我需要的字符串和整数从 Java 对象中获取到 C# 字符串和整数中,这是一个与这完全不同的问题....

最佳答案

您传递的是字符串而不是整数作为 getInstalledApplications 的参数。

您需要获得 PackageManager 的实例,为此您需要获得一个Activity,幸运的是,Unity 可以为您提供。

AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = jc.GetStatic<AndroidJavaObject>("currentActivity");

AndroidJavaObject packageManager = currentActivity.Call<AndroidJavaObject>("getPackageManager");

int flag = pluginClass.GetStatic<int>("GET_META_DATA");

AndroidJavaObject[] arrayOfAppInfo = packageManager.Call<AndroidJavaObject[]>("getInstalledApplications", flag);

关于c# - 如何使用 Unity3D 获取已安装的应用程序列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31155974/

相关文章:

c# - 我怎样才能在播放模式下沿特定轴获取播放器的位置?

c# - MVVM 将 View 绑定(bind)到 TabControlItems - View 不显示

android - 如何在android中更改展示 View 圆圈大小

java - exoplayer 2.11.* 版本在 android 5.0/5.1(Lollipop) 设备中引发渲染器错误

android - 如何在 Android 的 VerticalGridFragment 类中获取选定/聚焦的项目或其索引?

c# - Unity 在 Library/PackageCache/com.unity.collab-proxy@1.2.16 处缺少引用

c# - 删除具有一对一可选关系的实体时出现 EntityFramework 错误

c# - 序列化列表<string>时如何选择内部xml标签?

c# - 猜4位数字游戏收集正确数字的数量

javascript - 具有统一面的程序圆形网格