最近一直在做VR云会议,使用到了华为云会议的服务,华为云会议服务没有提供Unity版本的SDK,提供了Android版本的native sdk,那就自己只能在Unity中自己封装一层来调用Android接口。在这过程中,碰到了一些问题,做一下总结。
1、获取当前的Application或者当前的Activity
using AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
using AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
using AndroidJavaObject app = currentActivity.Call<AndroidJavaObject>("getApplication");
2、Android库的函数返回ArrayList,c#中如何转换呢?一般先返回AndroidJavaObject,然后把ArrayList转换成AndroidJavaObject[],最后在c#中遍历循环把数组中每个单元转换成你自己的结构体。
public static AttendeeInfo ToAttendeeInfo(AndroidJavaObject attendeeObject)
{
AttendeeInfo attendeeInfo = new AttendeeInfo();
attendeeInfo.setName(attendeeObject.Call<string>("getName"));
}
public List<AttendeeInfo> GetVideoAttendeeList()
{
using AndroidJavaObject attendeeListObj = IConfState.Call<AndroidJavaObject>("getVideoAttendeeList");
if (attendeeListObj == null)
return null;
AndroidJavaObject[] objArray = attendeeListObj.Call<AndroidJavaObject[]>("toArray");
List<AttendeeInfo> attendeeInfos = new List<AttendeeInfo>();
foreach (var obj in objArray)
{
attendeeInfos.Add(AttendeeInfo.ToAttendeeInfo(obj));
}
return attendeeInfos;
}
3、Android接口中,参数中有ArrayList参数,如何做呢?
先生存ArrayList的AndroidJavaObject,然后把C#每项转换成Android接口数组的每一项,调用add接口一个一个往里加。
public SDKERR GeneralWatch(List<GeneralWatchItemParamEx> watchs)
{
using AndroidJavaObject watchList = new AndroidJavaObject("java.util.ArrayList");
foreach (var watch in watchs)
{
watchList.Call<bool>("add", watch.ToXRAndroidJavaObject());
}
return SDKERR.ToSDKERR(IConfCtrl.Call<AndroidJavaObject>("generalWatch", watchList));
}
4、参数中有回调函数,C#中如何传参呢?
在C#中生存一个class,指定继承AndroidJavaProxy。需要注意的是,回调接口在Android中只能是接口Interface,然后javaInterface就是android的路径。还有必须实现回调接口中的每个函数。基本类型可以直接匹配,如果是其他结构体,必须使用AndroidJavaObject。
public class SdkCallback: AndroidJavaProxy
{
public readonly static string DEFALUT_JAVAINTERFACE = "com.huawei.hwmsdk.common.SdkCallback";
public event Action<AndroidJavaObject> OnSuccess;
public event Action OnFailed;
public SdkCallback(string javaInterface) : base(javaInterface)
{
}
public SdkCallback() : base(DEFALUT_JAVAINTERFACE)
{
}
public void onFailed(AndroidJavaObject sdkerr)
{
SDKERR sDKERR = SDKERR.ToSDKERR(sdkerr);
Debug.LogError("SdkCallback onFailed: " + sDKERR.ToString());
OnFailed?.Invoke();
}
public void onSuccess(AndroidJavaObject var1)
{
OnSuccess?.Invoke(var1);
}
}
5、如何调用Android接口中enum类型呢?
AndroidJavaClass statuCodeClass = new AndroidJavaClass("com.huawei.huaweicloud.xrmeeting.rpc.core.RpcStatusCode");
AndroidJavaObject statusCode = statuCodeClass.GetStatic<AndroidJavaObject>("OK");
|