我正在使用 Android 上的 SENDBIRD SDK 使用platformChannels 实现聊天。
我已经设法实现连接、创建通道和发送消息,但是当我从另一个设备发送消息时,它不会在 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 的内部套接字获取消息。如图所示。
我得出的结论是 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.message}", "${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", "$err", null)
} else {
val jsonConvertData: String? = Gson().toJson(groupChannel)
result.success(jsonConvertData)
}
}
}
"enterChannel" -> {
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("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, err ->
if (err != null) {
result.error("420", "$err", 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 ()