gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:34:54 27 4
gpt4 key购买 nike

我找不到如何从 C# 中的 AndroidJavaObject 获取 ListArray 变量。
我正在尝试使用 CountListArray 中存储为 AndroidJavaObject 的项目数创建一个 for 函数。但我需要知道如何从 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? 的一些帮助,它可以正常工作

到目前为止的进展 在获取图标时停滞不前,其他一切都很完美,我需要一种方法来获取以某种方式链接到图标的 string,或者图标的 Texture2D
另一种选择是使用包含 drawableAndroidJavaObject,就好像它是 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++;
}

}

我真的很讨厌在这里连续问两个问题,对于不得不这样做我深表歉意,但这是一个困难且看似尴尬的情况,几乎没有文件(我能找到)。

最佳答案

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

最重要的是,Unity 公开的与 java 对象一起工作的唯一接口(interface)是 AndroidJavaObject,并且该接口(interface)只有几个方法 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 端调用的方法。这样至少在制作要添加到 Plugins/Android 文件夹中的 jar 时,您可以获得静态类型的好处。

关于java - 如何使用 Unity3D 将变量从 AndroidJavaObject 获取到 C# 类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31235444/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com