我正在尝试用C#制作一个带有Unity3D的Android启动器,除了检测已安装的应用程序外,一切都已到位。
我尝试了很多不同的事情,但是他们都被困在同一个地方,访问 PackageManager 中的getInstalledApplications
。
我想我已经设法通过研究android源代码来复制C#中的ApplicationInfo
类,至少是变量存储,所以我不认为这是一个问题,至少还没有... < / p>
简单地说,我需要URI(或者我可以用来打开应用程序的东西),应用程序的名称和应用程序的图标(字符串到其位置,或Texture2D
本身),我尝试ApplicationInfo
,因为它具有所有这些,然后是一些,但如果我必须单独或通过其他方法获得它们,那就完全没问了。
这是我现在正在做的一个例子。 无论我使用的是Class还是Object,都会发生这种情况。
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#字符串和整数,这是一个完全不同的问题....
答案 0 :(得分:3)
您正在传递一个字符串作为getInstalledApplications的参数而不是整数。
您需要开始使用 PackageManager 的实例,为此,您需要获得活动,幸运的是,Unity可以为您提供。< / p>
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);