#android #kotlin #twilio #twilio-api #twilio-programmable-chat
Вопрос:
Я внедряю Twilio Chat SDK, в котором я добавляю участников в личный канал. Поток идет так, что сначала я проверяю, есть ли канал в моем списке или нет. Если она существует, то я присоединяюсь к ней. И если в моем списке нет канала, я сначала создаю его, а затем присоединяюсь к нему, а затем добавляю участника с уникальным именем. Когда я запускаю свое приложение, создается клиент, и после завершения процесса канала он выходит из строя со следующей ошибкой:
com.twilio.chat.ListenerException: Exception thrown by a listener. Your application might have a problem in listener implementation. Listeners must never throw uncaught exceptions. See 'Caused by:' below for more details.
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
at com.twilio.chat.internal.RethrowingForwarder$RethrowingProxy.invoke(RethrowingForwarder.java:123)
at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
at $Proxy17.onError(Unknown Source)
at com.twilio.chat.internal.StatusListenerForwarder$2.run(StatusListenerForwarder.java:46)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8167)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.twilio.chat.Members.addByIdentity(java.lang.String, com.twilio.chat.StatusListener)' on a null object reference
at com.zofeur.customer.views.fragments.SupportFragment.addMemberInChannel(SupportFragment.kt:259)
at com.zofeur.customer.views.fragments.SupportFragment.access$addMemberInChannel(SupportFragment.kt:22)
at com.zofeur.customer.views.fragments.SupportFragment$joinChannel$1.onError(SupportFragment.kt:249)
Я искал несколько решений, но не смог этого сделать.
Ниже приведен код для моего фрагмента:
Опорный Фрагмент:
private fun createChannel(channelUniqueName: String) {
mViewModel.chatClient?.channels?.getChannel(channelUniqueName,
object : CallbackListener<Channel>() {
override fun onSuccess(channel: Channel?) {
if (channel != null) {
mViewModel.channel = channel
joinChannel(channel)
}
}
override fun onError(errorInfo: ErrorInfo?) {
super.onError(errorInfo)
if (errorInfo?.code == Constants.ERROR_CHANNEL_NOT_FOUND) {
mViewModel.chatClient?.channels?.channelBuilder()
?.withUniqueName(channelUniqueName)
?.withType(Channel.ChannelType.PRIVATE)
?.build(object : CallbackListener<Channel>() {
override fun onSuccess(channel: Channel?) {
requireContext().T("Channel Created $channel")
if (channel != null) {
mViewModel.channel = channel
joinChannel(channel)
}
}
})
} else {
requireContext().T("Channel not created" errorInfo.toString())
}
}
})
}
private fun joinChannel(channel: Channel) {
channel.join(object : StatusListener() {
override fun onSuccess() {
requireContext().T("Channel Joined" channel.uniqueName)
addMemberInChannel(channel, identity)
}
override fun onError(errorInfo: ErrorInfo) {
if (errorInfo.code == Constants.ERROR_MEMBER_ALREADY_EXISTS) {
// already join member
addMemberInChannel(channel, identity)
} else {
requireContext().T("Error joining channel$errorInfo")
}
}
})
}
private fun addMemberInChannel(channel: Channel, identity: String) {
if (mViewModel.channel.createdBy == mViewModel.chatClient.myIdentity) {
channel.members.addByIdentity(identity, object : StatusListener() {
override fun onSuccess() {
requireContext().T("Member added successfully" channel.uniqueName)
}
override fun onError(errorInfo: ErrorInfo?) {
super.onError(errorInfo)
requireContext().T("Channel member added error" errorInfo.toString())
}
})
} else {
requireContext().T("You cannot add member, You don't have rights.")
}
}
Любая помощь была бы очень полезна. Заранее спасибо.
Комментарии:
1. Имеет ли
members
свойство вашегоchannel
класса обнуляемое значение?2. Нет, это не так. И это сгенерированный класс Twilio SDK.
Ответ №1:
Привет, я столкнулся с той же проблемой, когда отлаживал глубже, я обнаружил, что при создании канала он имеет 3 состояния:
- Состояние синхронизации запущено
- Синхронизация статус_каналов_ завершена
- Синхронизация статус_ завершена
Вам нужно выполнить любую операцию, связанную с каналом, после завершения синхронизации клиента. Status_completed Надеюсь, что это сработает, спасибо просто так
client.addListener(object :ChatClientListener{
override fun onClientSynchronization(p0:
ChatClient.SynchronizationStatus?) {
if (p0 == ChatClient.SynchronizationStatus.COMPLETED) {
// Client is now ready for business, start working
mViewModel.chatClient = client
}
}
}
Комментарии:
1. Правильно, сначала вам нужно синхронизировать свой канал, как описано в документации . Синхронизируйте свой клиент и после создания, чтобы другие средства доступа, например
channels
, работали правильно. «Получите объект «Участники», который позволяет получить доступ к списку участников в канале. Вам нужно синхронизировать канал, прежде чем вы сможете вызвать этот метод, если вы только что не присоединились к каналу, и в этом случае он синхронизируется автоматически».2. Пожалуйста, озвучьте мне ответ, я буду вам очень благодарен