我找不到如何从c中的ListArray
获取AndroidJavaObject
变量。
我正在尝试使用for
来创建一个Count
函数,该函数用于存储ListArray
中的项目数。但我需要知道如何从AndroidJavaObject
中获取Count
以及如何正确使用它。
这是我用来获取变量的,还要注意“packages”不是AndroidJavaObject
。
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = jc.GetStatic<AndroidJavaObject>("currentActivity");
int flag = new AndroidJavaClass("android.content.pm.PackageManager").GetStatic<int>("GET_META_DATA");
AndroidJavaObject pm = currentActivity.Call<AndroidJavaObject>("getPackageManager");
AndroidJavaObject packages = pm.Call<AndroidJavaObject>("getInstalledApplications", flag);
在这一点上它是非常初级的,但是它的工作要感谢来自How to get installed apps list with Unity3D?的一些帮助。
到目前为止,在获取图标方面进展缓慢,其他一切都很好,我需要一种方法来获取一个以某种方式链接到图标的
AndroidJavaObject[]
,或者获取图标的string
。另一种选择是使用一个Texture2D
包含一个AndroidJavaObject
的方法,就好像它是一个纹理2d一样。我不知道如何实现这一点。我的另一个想法是把它转换成另一个变量,比如drawable
可以被传输和转换回来,但是我还没有找到一种方法在这种情况下工作。int count = packages.Call<int>("size");
AndroidJavaObject[] links = new AndroidJavaObject[count];
string[] names = new string[count];
Texture2D[] icons = new Texture2D[count];
int ii =0;
for(int i=0; ii<count;){
//get the object
AndroidJavaObject currentObject = packages.Call<AndroidJavaObject>("get", ii );
try{
//try to add the variables to the next entry
links[i] = pm.Call<AndroidJavaObject>("getLaunchIntentForPackage", currentObject.Get<AndroidJavaObject>("processName"));
names[i] = pm.Call<string>("getApplicationLabel", currentObject);
icons[i] = pm.Call<Texture2D>("getApplicationIcon", currentObject);
Debug.Log ("(" + ii + ") " + i +" "+ names[i]);
//go to the next app and entry
i++;
ii++;
}
catch
{
//if it fails, just go to the next app and try to add to that same entry.
Debug.Log("skipped "+ ii);
ii++;
}
}
我真的不想在这里连续问两个问题,我很抱歉不得不这样做,但这是一个困难和似乎尴尬的情况,几乎没有文件(我可以找到)。
最佳答案
首先,unity3d和android之间的互操作文档充其量是很少的。
最重要的是,unity所公开的用于java对象的唯一接口是AndroidJavaObject
,并且该接口只有两个方法defined。你只能用那些而且只能用那些。
这意味着您在使用Java数组时没有得到Count
对象,并且您仍将使用AndroidJavaObject
。
int count = packages.Call<int>("size"); //getting the size of the array
for( int i = 0; i < count; i++ )
{
//getting the object at location i
AndroidJavaObject currentObject = packages.Call("get", i );
//use currentObject using the same methods as before: Call, CallStatic, Get, GetStatic
}
我知道这是冗长的,编写这样的代码很难测试,您需要制作和apk并将其部署到设备上以检查它是否运行。
可能一个更快的方法是创建自己的java类,在java端完成所有这些,并公开一个从unity端调用的方法。这样至少可以在制作jar时获得静态类型的好处,并将其添加到
Plugins/Android
文件夹中。