我正在尝试使用 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/