如何使用Unity3D获取已安装的应用列表?
我正在尝试在C#中使用Unity3D制作一个Android启动器,除了检测已安装的应用程序外,一切都已到位。
我尝试了很多不同的东西,但它们都被卡在同一个地方,在PackageManager中访问getInstalledApplications
。
我想我已经设法通过研究android源码来复制C#中的ApplicationInfo
类,至少是变量存储,所以我不认为这是一个问题,至少还没有……
简单地说,我需要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("currentActivity"); Debug.Log(currentActivity.Call("getPackageName")); int flag = pluginClass.GetStatic("GET_META_DATA"); AndroidJavaClass syspackage = currentActivity.Call("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("currentActivity"); int flag = pluginClass.GetStatic("GET_META_DATA"); AndroidJavaObject pm = currentActivity.Call("getPackageManager"); AndroidJavaObject syspackages = pm.Call("getInstalledApplications", flag);
现在我只想弄清楚如何从Java对象中获取我需要的字符串和整数以及C#字符串和整数,这是一个完全不同的问题….
您正在传递一个字符串作为getInstalledApplications的参数而不是整数。
你需要得到一个PackageManager实例,为此你需要得到一个Activity ,幸运的是,Unity可以给你。
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject currentActivity = jc.GetStatic("currentActivity"); AndroidJavaObject packageManager = currentActivity.Call ("getPackageManager"); int flag = pluginClass.GetStatic("GET_META_DATA"); AndroidJavaObject[] arrayOfAppInfo = packageManager.Call("getInstalledApplications", flag);