如何使用 Unity3D 从 AndroidJavaObject 获取变量到 C# 类中

Jon*_*n C 3 c# java android arraylist unity-game-engine

我找不到如何ListArrayAndroidJavaObjectC# 中的an获取变量。
我正在尝试for使用 aCount作为ListArray存储为AndroidJavaObject. 但我需要知道如何让CountAndroidJavaObject和如何正确使用它。
这是我用来获取变量的方法,还要注意“包”不是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);
Run Code Online (Sandbox Code Playgroud)

在这一点上它是非常基本的,但是它的工作要归功于这个如何使用 Unity3D 获取已安装的应用程序列表的一些帮助

到目前为止,在获取图标方面的进展停滞不前,其他一切都完美无缺,我需要一种方法来以某种方式获取string链接到图标的链接,或者链接到图标的链接Texture2D
另一种选择是使用AndroidJavaObject包含 a 的 adrawable就好像它是一个 Texture2D 一样。我不知道如何完成这些。
我的另一个想法是将它转换为另一个变量,就像byte[]可以传输和转换回来一样,但我还没有找到一种在这种情况下有效的方法。

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++;
    }

}
Run Code Online (Sandbox Code Playgroud)

我真的很讨厌在这里连续问两个问题,我很抱歉不得不这样做,但这是一个困难且看似尴尬的情况,几乎没有文档(我可以找到)。

Rad*_*iță 5

首先,关于 Unity3D 和 Android 之间互操作的文档充其量是稀缺的。

最重要的是 Unity 公开的与 java 对象一起工作的唯一接口是AndroidJavaObject该接口仅定义了几个方法。你只能使用那些,而且只能使用那些。

这意味着Count在使用 java 数组时您不会获得对象,并且您仍将使用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
}
Run Code Online (Sandbox Code Playgroud)

我知道这很冗长,编写这样的代码很难测试,您需要制作和 apk 并将其部署到设备以检查它是否运行。

可能更快的方法是创建自己的 java 类,在 java 端执行所有这些操作,并公开一个从 Unity 端调用的方法。这样,至少在制作要添加到Plugins/Android文件夹中的 jar 时,您可以获得静态类型的好处。