我正在尝试使用C#在Unity3D中制作Android启动器,除了检测已安装的应用程序之外,一切都就绪。
我尝试了很多不同的方法,但它们都卡在同一个地方,即访问PackageManager中的getInstalledApplications
。
我认为我已经成功复制了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;
我该怎么让这个工作?或者你能告诉/展示给我另一种可以达成目标的方法吗?
//编辑 好的,我试了几个小时尝试了每种可能的组合,终于搞定了。
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#字符串和整数,这是一个完全不同的问题....
Exception: JNI: unknown signature type 'System.Collections.Generic.List'1[ApplicationInfo]' (obj = System.Collections.Generic.List'1[ApplicationInfo] equal
。我猜这意味着我没有正确地创建 Application Info 类?还是这是一个新的问题? - Jonathan C