Jon*_*n C 3 c# java android arraylist unity-game-engine
我找不到如何ListArray从AndroidJavaObjectC# 中的an获取变量。
我正在尝试for使用 aCount作为ListArray存储为AndroidJavaObject. 但我需要知道如何让Count从AndroidJavaObject和如何正确使用它。
这是我用来获取变量的方法,还要注意“包”不是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)
我真的很讨厌在这里连续问两个问题,我很抱歉不得不这样做,但这是一个困难且看似尴尬的情况,几乎没有文档(我可以找到)。
首先,关于 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 时,您可以获得静态类型的好处。
| 归档时间: |
|
| 查看次数: |
7047 次 |
| 最近记录: |