我找不到如何从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文件夹中。

07-26 03:00