Eu tenho feito conferências em nuvem VR recentemente e usei o serviço de conferência em nuvem Huawei. O serviço de conferência em nuvem Huawei não fornece o SDK da versão Unity, mas o SDK nativo da versão Android, então só posso encapsular uma camada no Unity para chamar a interface Android. No processo, alguns problemas foram encontrados, então vamos fazer um resumo.
1. Obtenha o aplicativo atual ou a atividade atual
using AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
using AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
using AndroidJavaObject app = currentActivity.Call<AndroidJavaObject>("getApplication");
2. A função da biblioteca Android retorna ArrayList, como converter em c#? Geralmente, primeiro retorne AndroidJavaObject, depois converta ArrayList para AndroidJavaObject[] e, finalmente, percorra o loop em C# para converter cada unidade na matriz em sua própria estrutura.
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. Na interface do Android existem parâmetros ArrayList nos parâmetros, como fazer?
Primeiro salve o AndroidJavaObject do ArrayList, depois converta cada item de C# em cada item da matriz de interface do Android e chame a interface add para adicioná-lo um por um.
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. Existe uma função callback nos parâmetros Como passar parâmetros em C#?
Existe uma classe em C# que especifica a herança do AndroidJavaProxy. Deve-se notar que a interface de retorno de chamada só pode ser a interface Interface no Android, e então javaInterface é o caminho do android. Além disso, todas as funções na interface de retorno de chamada devem ser implementadas. O tipo básico pode ser correspondido diretamente. Se for outras estruturas, AndroidJavaObject deve ser usado.
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. Como chamar o tipo enum na interface do Android?
AndroidJavaClass statuCodeClass = new AndroidJavaClass("com.huawei.huaweicloud.xrmeeting.rpc.core.RpcStatusCode");
AndroidJavaObject statusCode = statuCodeClass.GetStatic<AndroidJavaObject>("OK");