Многим приходится работать с Java sdk из Unity3d либо используя самописные плагины, либо, если достаточно базовых возможностей sdk, с помощью юнитишных классов AndroidJavaClass
и AndroidJavaObject
.
Кто работал с этими классами знает, насколько ужасно выглядит код. Меня это тоже достало и решил для текущего проекта небольшую библиотеку сделать. Чуток причесал и залил на гитхаб. Постепенно буду расширять возможности библиотеки.
Допустим вам нужно получить версию и имя текущего билда. Вы бы делали это так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public static int GetVersionCode() { AndroidJavaClass contextCls = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject context = contextCls.GetStatic<AndroidJavaObject>("currentActivity"); AndroidJavaObject packageMngr = context.Call<AndroidJavaObject>("getPackageManager"); string packageName = context.Call<string>("getPackageName"); AndroidJavaObject packageInfo = packageMngr.Call<AndroidJavaObject>("getPackageInfo", packageName, 0); return packageInfo.Get<int>("versionCode"); } public static string GetVersionName() { AndroidJavaClass contextCls = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject context = contextCls.GetStatic<AndroidJavaObject>("currentActivity"); AndroidJavaObject packageMngr = context.Call<AndroidJavaObject>("getPackageManager"); string packageName = context.Call<string>("getPackageName"); AndroidJavaObject packageInfo = packageMngr.Call<AndroidJavaObject>("getPackageInfo", packageName, 0); return packageInfo.Get<string>("versionName"); } |
Не очень красиво. У меня глаза кровоточат, когда приходится что-то такое писать. С помощью этой библиотеки эта задача решается так:
1 2 3 4 5 |
var activity = Internal.GetCurrentActivity(); var pm = activity.GetPackageManager(); var pi = pm.GetPackageInfo(activity.GetPackageName(), 0); int code = pi.VersionCode; string name = pi.VersionName; |
Чтоб показать Toast
:
1 |
Toast.MakeText(activity, "Hello there", Toast.LENGTH_LONG); |
Пример посложнее, где надо отфильтровать интенты, показать полученный отфильтрованный список на открытие и стартануть новую Activity
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
public static void Share(string body, string subject, string mimeType = "text/plain", string chooserTitle = "Choose application") { Intent intent = new Intent(Intent.ACTION_SEND); intent.SetType(mimeType) .PutExtra(Intent.EXTRA_SUBJECT, subject) .PutExtra(Intent.EXTRA_TEXT, body); var intentList = new List<Intent>(); var activity = Internal.GetCurrentActivity(); var pm = activity.GetPackageManager(); var resInfo = pm.QueryIntentActivities(intent, 0); for (int i = 0; i < resInfo.Count; i++) { ResolveInfo ri = resInfo[i]; string packageName = ri.ActivityInfo.GetPackageName(); if (packageName.Contains("vkontakte") || packageName.Contains("instagram") || packageName.Contains("skype")) { Intent newIntent = new Intent(Intent.ACTION_SEND); newIntent.SetPackage(packageName) .PutExtra(Intent.EXTRA_SUBJECT, subject) .PutExtra(Intent.EXTRA_TEXT, body) .SetType(mimeType); intentList.Add(newIntent); } } Intent intentt = intentList[0]; intentList.RemoveAt(0); Parcelable[] extraIntents = new Parcelable[intentList.Count]; for (int i = 0; i < intentList.Count; i++) { extraIntents[i] = intentList[i]; } var chooser = Intent.CreateChooser(intentt, chooserTitle); chooser.PutExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents); activity.StartActivity(chooser); } |