Проблемы с использованием программируемого голоса Twilio в библиотеке привязок Xamarin Android
Я создал проект библиотеки связываний, чтобы иметь возможность запускать Android-программируемый голосовой SDK Twilio (версия 2.0.5 - ссылка для загрузки файла.aar).
Я добавил эти строки кода в Metadata.xml, чтобы исправить некоторые ошибки:
<!-- solving: Error CS0102 The type 'ErrorEventArgs' already contains a definition for 'P0' TwilioBindings C:\...\TwilioBindings\obj\Debug\generated\src\Com.Twilio.Voice.IRegistrationListener.cs -->
<attr path="/api/package[@name='com.twilio.voice']/interface[@name='RegistrationListener']/method[@name='onError']" name="managedName">RegistrationListenerOnError</attr>
<attr path="/api/package[@name='com.twilio.voice']/interface[@name='UnregistrationListener']/method[@name='onError']" name="managedName">UnregistrationListenerOnError</attr>
<!-- Error CS0234 The type or namespace name 'InternalCall' does not exist in the namespace 'Com.Twilio.Voice' (are you missing an assembly reference?) TwilioBindings C:\...\TwilioBindings\obj\Debug\generated\src\Com.Twilio.Voice.Call.cs -->
<attr path="/api/package[@name='com.twilio.voice']/class[@name='InternalCall']" name="visibility">public</attr>
<!-- Error CS0115 'Call.OnWarning(IDictionary)': no suitable method found to override TwilioBindings C:\...\TwilioBindings\obj\Debug\generated\src\Com.Twilio.Voice.Call.cs -->
<attr path="/api/package[@name='com.twilio.voice']/class[@name='Call']/method[@name='onWarning' and count(parameter)=1 and parameter[1][@type='java.util.HashMap']]/parameter[1]" name="type">java.util.HashMap<java.lang.String, java.lang.Object></attr>
Он успешно компилируется, но когда я вызываю Voice.Call(), метод ничего не возвращает, и если я вызываю его в потоке пользовательского интерфейса, пользовательский интерфейс застревает навсегда. Я приостановил отладчик, чтобы увидеть, какая часть кода была запущена, и он ожидает возврата следующей строки в Com.Twilio.Voice.Voice:
global::Com.Twilio.Voice.Call __ret = global::Java.Lang.Object.GetObject<global::Com.Twilio.Voice.Call> (JNIEnv.CallStaticObjectMethod (class_ref, id_call_Landroid_content_Context_Ljava_lang_String_Ljava_util_Map_Lcom_twilio_voice_Call_Listener_, __args), JniHandleOwnership.TransferLocalRef);
Мой намек на то, что, вероятно, некоторые из строк, которые я добавил в Metadata.xml, неверны, или мне нужно добавить еще несколько.
У меня есть несколько предупреждений, которые могут помочь в решении проблемы:
Warning Type com.getkeepsafe.relinker.ReLinker: FxDG naming violation: Type name 'ReLinker' matches namespace part 'Relinker'. RelinkerBindings C:\...\RelinkerBindings\BINDINGSGENERATOR
Warning Skipping Com.Getkeepsafe.Relinker.ReLinkerInstance.Force, due to a duplicate field, method or nested type name. RelinkerBindings C:\...\RelinkerBindings\BINDINGSGENERATOR
Warning Type com.getkeepsafe.relinker.ReLinker: FxDG naming violation: Type name 'ReLinker' matches namespace part 'Relinker'. RelinkerBindings C:\...\RelinkerBindings\BINDINGSGENERATOR
Warning ignoring option UseSplitVerifier; support was removed in 8.0 RelinkerBindings C:\...\RelinkerBindings\JARTOXML
Warning CS0108 'Call.IInternalListener.OnConnectFailure(Call, CallException)' hides inherited member 'Call.IListener.OnConnectFailure(Call, CallException)'. Use the new keyword if hiding was intended. TwilioBindings C:\...\TwilioBindings\obj\Debug\generated\src\Com.Twilio.Voice.Call.cs 17 Active
Warning CS0108 'Call.IInternalListener.OnConnected(Call)' hides inherited member 'Call.IListener.OnConnected(Call)'. Use the new keyword if hiding was intended. TwilioBindings C:\...\TwilioBindings\obj\Debug\generated\src\Com.Twilio.Voice.Call.cs 21 Active
Warning CS0108 'Call.IInternalListener.OnDisconnected(Call, CallException)' hides inherited member 'Call.IListener.OnDisconnected(Call, CallException)'. Use the new keyword if hiding was intended. TwilioBindings C:\...\TwilioBindings\obj\Debug\generated\src\Com.Twilio.Voice.Call.cs 29 Active
Warning CS0108 'Event.GetType()' hides inherited member 'object.GetType()'. Use the new keyword if hiding was intended. TwilioBindings C:\...\TwilioBindings\obj\Debug\generated\src\Com.Twilio.Voice.Impl.Session.Event.cs 222 Active
Warning IDE0006 Error encountered while loading the project. Some project features, such as full solution analysis for the failed project and projects that depend on it, have been disabled. TwilioBindings 1 Active
Warning For type Com.Twilio.Voice.InternalCall, base interface com.twilio.voice.RTCMonitorCommand.Listener is invalid. TwilioBindings C:\...\TwilioBindings\BINDINGSGENERATOR
Warning For type Com.Twilio.Voice.InternalCall, base interface com.twilio.voice.EventPublisher.EventPublisherListener is invalid. TwilioBindings C:\...\TwilioBindings\BINDINGSGENERATOR
Warning Type com.twilio.voice.Voice: FxDG naming violation: Type name 'Voice' matches namespace part 'Voice'. TwilioBindings C:\...\TwilioBindings\BINDINGSGENERATOR
Warning Type com.twilio.voice.Voice: FxDG naming violation: Type name 'Voice' matches namespace part 'Voice'. TwilioBindings C:\...\TwilioBindings\BINDINGSGENERATOR
Warning Invalid parameter type com.twilio.voice.EventPayload.WarningName in method OnWarningCleared in managed type Com.Twilio.Voice.InternalCall. TwilioBindings C:\...\TwilioBindings\BINDINGSGENERATOR
Warning Invalid parameter type com.twilio.voice.EventPayload.WarningName in method OnWarningCleared in managed type Com.Twilio.Voice.Call. TwilioBindings C:\...\TwilioBindings\BINDINGSGENERATOR
Warning ignoring option UseSplitVerifier; support was removed in 8.0 TwilioBindings C:\...\TwilioBindings\JARTOXML
Примечание. Поскольку Android-программируемый голосовой SDK Twilio имеет зависимость (ReLinker 1.2.2 ( ссылка на скачивание.aar-файла)), мне пришлось создать другой проект библиотеки привязок (RelinkerBindings), содержащий эту зависимость, а затем я ссылался на него в проекте привязок Twilio.
Я никогда не делал никаких проектов привязки в xamarin, поэтому я немного новичок в этом.
Кто-нибудь знает, как решить эту проблему?
Заранее спасибо.
РЕДАКТИРОВАТЬ:
Я видел логи logcat, и вот что происходит, когда я вызываю Voice.Call():
04-27 10:17:00.118 7208 7247 E CallCommandHandlerImpl: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/getkeepsafe/relinker/ReLinker;
04-27 10:17:00.118 7208 7247 E CallCommandHandlerImpl: at com.twilio.voice.UserAgent.loadLibrary(UserAgent.java:261)
04-27 10:17:00.118 7208 7247 E CallCommandHandlerImpl: at com.twilio.voice.UserAgent.<init>(UserAgent.java:57)
04-27 10:17:00.118 7208 7247 E CallCommandHandlerImpl: at com.twilio.voice.UserAgent.get(UserAgent.java:107)
04-27 10:17:00.118 7208 7247 E CallCommandHandlerImpl: at com.twilio.voice.CallCommandHandlerImpl.run(CallCommandHandlerImpl.java:50)
04-27 10:17:00.118 7208 7247 E CallCommandHandlerImpl: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.getkeepsafe.relinker.ReLinker" on path: DexPathList[[zip file "/data/app/com.globalactone.ecare-1/base.apk"],nativeLibraryDirectories=[/data/app/com.globalactone.ecare-1/lib/x86, /system/fake-libs, /data/app/com.globalactone.ecare-1/base.apk!/lib/x86, /system/lib, /vendor/lib]]
04-27 10:17:00.118 7208 7247 E CallCommandHandlerImpl: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
04-27 10:17:00.118 7208 7247 E CallCommandHandlerImpl: at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
04-27 10:17:00.118 7208 7247 E CallCommandHandlerImpl: at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
04-27 10:17:00.118 7208 7247 E CallCommandHandlerImpl: ... 4 more
1 ответ
Я добавил ссылку на проект RelinkerBindings, который содержит зависимость проекта Twilio, но каким-то образом в журналах было показано, что RelinkerBindings не был найден, поэтому я удалил ссылку на проект и добавил ссылку на файл Relinker dll и работает сейчас. Не знаю, почему это не сработало, когда в нем была ссылка на проект.