Я не могу найти, как получить ListArray
переменных из AndroidJavaObject
в C#.
Я пытаюсь сделать функцию for
с использованием Count
для количества элементов в ListArray
, который хранится как AndroidJavaObject
. Но мне нужно знать, как получить Count
от AndroidJavaObject
и как правильно его использовать.
Это то, что я использую для получения переменных, также обратите внимание, что «пакеты» не являются AndroidJavaObject[]
.Как получить переменные из AndroidJavaObject в класс C#, используя Unity3D
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
.
Другой альтернативой было бы использовать AndroidJavaObject
, который содержит drawable
, как если бы это 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++;
}
}
Ненавижу задать два вопроса подряд здесь, и я извиняюсь за то, чтобы сделать это, но это трудно, и, казалось бы, неуклюжим обстоятельство, что имеет мало никакой документации (что я могу найти) ,
Метод, который вы описываете для получения счета, не работает, к сожалению, я попробовал получить и вызвать статичный и нет, капитал и не. Я привык к повторному развертыванию после каждого небольшого изменения на данный момент, ха-ха. Я не против работать с 'AndroidJavaObject', пока я получаю переменные, которые мне нужны в долгосрочной перспективе. чтобы сделать это java side, мне бы, вероятно, пришлось сделать вызов, который ничего не возвращает, а вместо этого, через java, сохраняет переменные в файл, который я могу проанализировать с помощью C#, мне также нужно будет изучить Java, Eclipse и т. п. У меня нет опыта в обоих. Я отредактирую сообщение, чтобы использовать ваш пример. –
Я обновил свой ответ, метод, который вам нужно назвать, - это размер –
. Кажется, он работает идеально, имел/имел проблемы с получением переменных, должен был стать творческим с получением имен, выполнив 'pm.Call (« getApplicationLabel ", currentObject)'. Я думаю, мне нужно изменить строку ссылки на «AndroidJavaObject», чтобы я мог сохранить намерение запуска, чтобы позже узнать, как использовать 'something.Call (« startActivity », intent). Я уточню сообщение о том, как это происходит до сих пор, если у вас есть идеи, я был бы рад их услышать, но утром я должен снова проверить. –