我正在尝试用Unity3D在C#上制作一个安卓启动程序,除了检测安装的应用程序之外,一切都已经就绪。
我尝试过很多不同的东西,但是它们都被困在同一个地方,在PackageManager.中访问getInstalledApplications
。
我想我已经通过研究android源代码在C#中复制了C#类,至少是变量存储方面的,所以我不认为这是个问题,至少现在还不是。
简单地说,我需要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对象中获取我需要的字符串和int,并将其转化为C#字符串和int,这是一个完全不同的问题.
发布于 2015-07-01 00:45:53
您正在传递一个字符串作为getInstalledApplications的param,而不是整数。
要做到这一点,您需要掌握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);
https://stackoverflow.com/questions/31155974
复制