SENDBIRD KOTLIN 消息

问题描述

我在 Android 上使用 SENDBIRD SDK 来使用平台频道在 Flutter 中实现聊天。

我已经设法实现了连接、创建通道和发送消息,但是当我从另一台设备发送消息时,它没有在 onMessageReceived() 方法中运行。在创建频道并输入频道后,我将以下代码放在一个 onCall 方法中以从 Dart 运行。

var channelUrl: String? = call.argument("urlChannel")

    GroupChannel.getChannel(channelUrl,GroupChannelGetHandler { groupChannel,err ->
              if (err != null) {
                result.error("420","$err",null)
              } else{
                this.groupChannel = groupChannel
                val jsonConvertData: String? = Gson().toJson(groupChannel)
                println(jsonConvertData)
                result.success(jsonConvertData)
              }
            })

        SendBird.addChannelHandler(
              CHANNEL_HANDLER_ID,object : ChannelHandler() {
                  override fun onMessageReceived(
                      baseChannel: BaseChannel,baseMessage: BaseMessage
                  ){
                    println("$baseMessage")
                     }

                  }
              })

我的目标是打印到控制台已收到的消息,但现在我只从 SENDBIRD 的内部套接获取消息。如图所示。

enter image description here

我得出的结论是 onMessageRecived 没有被执行,我的问题是是否有任何方法可以访问套接字带给我的数据。

更新

这是mi文件中的所有代码

package com.example.send_bird


import android.content.Context
import android.content.Intent
import android.os.AsyncTask
import android.util.Log
import android.widget.Toast
import androidx.annotation.NonNull
import com.google.gson.Gson
import com.sendbird.android.*
import com.sendbird.android.BaseChannel.SendUserMessageHandler
import com.sendbird.android.GroupChannel.GroupChannelGetHandler
import com.sendbird.android.SendBird.ChannelHandler
import io.Flutter.app.FlutterActivity
import io.Flutter.embedding.engine.plugins.FlutterPlugin
import io.Flutter.plugin.common.MethodCall
import io.Flutter.plugin.common.MethodChannel
import io.Flutter.plugin.common.MethodChannel.MethodCallHandler
import io.Flutter.plugin.common.MethodChannel.Result
import java.util.*


/** SendBirdplugin */
class SendBirdplugin: FlutterActivity(),FlutterPlugin,MethodCallHandler {
  /// The MethodChannel that will the communication between Flutter and native Android
  ///
  /// This local reference serves to register the plugin with the Flutter Engine and unregister it
  /// when the Flutter Engine is detached from the Activity
  private lateinit var channel : MethodChannel
  private lateinit var groupChannel: GroupChannel
  private val CHANNEL = "ec.tipti/sendbird"
  private lateinit var context: Context
  private val CHANNEL_HANDLER_ID = "CHANNEL_HANDLER_GROUP_CHANNEL_CHAT"

  override fun onAttachedToEngine(@NonNull FlutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
    channel = MethodChannel(FlutterPluginBinding.binaryMessenger,CHANNEL)
    channel.setMethodCallHandler(this)
    context = FlutterPluginBinding.applicationContext



  }

  override fun onMethodCall(@NonNull call: MethodCall,@NonNull result: Result) {
    when (call.method) {
      //**Init SendBird
      "initSendBird" -> {
        try {
          var appId: String? = call.argument("appId")
          var response: Boolean = SendBird.init(appId,context);
          result.success(response)

        } catch (err: Error) {
          println("THIS ERR $err")
          result.error("404",err.message,err.stackTrace)
        }

      }
      //Connect to sendbirdserver
      "connectToSendBirdServer" -> {
        // The userID below should be unique to your Sendbird application.
        var userID: String? = call.argument("userId")
        try {
          SendBird.connect(userID) { user,err ->
            if (err != null) {
              result.error(err.code.toString(),"${err.message}","${err.stackTrace}")
            } else {
              val jsonConvertData: String? = Gson().toJson(user)
              result.success(jsonConvertData)
            }
          }
        } catch (err: Error) {
          result.error("404","${err.stackTrace}")
        }

      }

      "getListChannel" -> {
        val channelList = GroupChannel.createMyGroupChannelListQuery()
        channelList.limit = 100
        channelList.next { list,e ->
          if (e != null) {
            Log.e("TAG",e.message)
          }
          val jsonConvertData: String? = Gson().toJson(list)
          result.success(jsonConvertData)
        }
      }

      "createPrivateChannel" -> {
        val users: List<String>? = call.argument("users")
        val params = GroupChannelParams()
        val operatorId = ArrayList<String>()
        operatorId.add(SendBird.getCurrentUser().userId)
        params.addUserIds(users)
        params.setoperatorUserIds(operatorId)
        GroupChannel.createChannel(params) { groupChannel,err ->
          if (err != null) {
            println("FAIL TO CREATE CHANEL")
            result.error("420",null)
          } else {

            val jsonConvertData: String? = Gson().toJson(groupChannel)
            result.success(jsonConvertData)
          }
        }
      }

      "enterChannel" -> {
        var channelUrl: String? = call.argument("urlChannel")

        GroupChannel.getChannel(channelUrl,err ->
                  if (err != null) {
                    result.error("420",null)
                  } else {
                    this.groupChannel = groupChannel
                    val jsonConvertData: String? = Gson().toJson(groupChannel)
                    println(jsonConvertData)
                    result.success(jsonConvertData)
                  }
                })
        SendBird.addChannelHandler(
                CHANNEL_HANDLER_ID,object : ChannelHandler() {
                  override fun onMessageReceived(
                          baseChannel: BaseChannel?,baseMessage: BaseMessage?
                  ) {
                    println("Message")
                    if (!baseChannel?.url.equals("sendbird_group_channel_84227333_d808b92bbf2107ef8b9eb97012bb73126aefd462")) {
                      println("MESSAGE!!!!!!!!!!!!!!!")
                    }
                  }
                })

      }
      "startHandler" -> {
        println("START HANDLER")
        val value = ListenMessage()
        val intent = Intent(context,ListenMessage::class.java)
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        context.startActivity(intent)
//          context.startService(intent)


      }
      "sendMessagetochannel" -> {
        var msj: String? = call.argument("message")
        println(msj)
        val params = UserMessageParams()
                .setMessage(msj.toString())
        groupChannel.sendUserMessage(params,SendUserMessageHandler { userMessage,null)
                  }

                  println(userMessage)
                })
      }
      "pauseChannelHandler" -> {
        var channelHandlerID: String? = call.argument("channelHandlerId")
        SendBird.removeChannelHandler(CHANNEL_HANDLER_ID)
      }
      "getPreviusMessage" -> {

        val prevIoUsMessageListQuery = groupChannel.createPrevIoUsMessageListQuery()

        prevIoUsMessageListQuery.load(
                20,true,object : PrevIoUsMessageListQuery.MessageListQueryResult {
                  override fun onResult(
                          messages: MutableList<BaseMessage>?,e: SendBirdException?
                  ) {
                    if (e != null) {
                      Log.e("Error",e.message)
                    }
                    val jsonConvertData: String? = Gson().toJson(messages)
                    result.success(jsonConvertData)
                  }
                })


      }
      else -> {
        result.notImplemented()
      }
    }
  }


  override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
    channel.setMethodCallHandler(null)
  }


}

我一直在努力解决这个问题,并在开始一项新活动时设法听到了 onMessage。 我的问题是现在有没有办法在不需要向我显示屏幕的情况下开始活动? 这是我第二个活动的代码

package com.example.send_bird

import com.sendbird.android.BaseChannel
import com.sendbird.android.BaseMessage
import com.sendbird.android.SendBird
import io.Flutter.app.FlutterActivity


class ListenMessage: FlutterActivity() {
    private val CHANNEL_HANDLER_ID = "CHANNEL_HANDLER_GROUP_CHANNEL_CHAT"

    override fun onResume() {
        super.onResume()
        println("ENTER TO LISTEN MESSAGE")
        SendBird.addChannelHandler(
                CHANNEL_HANDLER_ID,object : SendBird.ChannelHandler() {
                    override fun onMessageReceived(
                            baseChannel: BaseChannel,baseMessage: BaseMessage
                    ){
                        println("$baseMessage")
                    }
                })
    }



}

我试过使用Services()和Async(),但第一次听不到onMessage()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)