@@ -65,7 +65,7 @@ dependencies { | |||||
androidTestImplementation 'androidx.test.ext:junit:1.1.3' | androidTestImplementation 'androidx.test.ext:junit:1.1.3' | ||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' | androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' | ||||
implementation 'com.xuqm.android:base:0.0.2' | |||||
implementation 'com.xuqm.android:base:0.0.5' | |||||
// implementation 'cn.org.bjca.trus:push:0.0.1.011' | // implementation 'cn.org.bjca.trus:push:0.0.1.011' | ||||
implementation project(path: ':push') | implementation project(path: ':push') | ||||
} | } |
@@ -9,13 +9,13 @@ | |||||
android:fullBackupContent="@xml/backup_rules" | android:fullBackupContent="@xml/backup_rules" | ||||
android:icon="@mipmap/ic_launcher" | android:icon="@mipmap/ic_launcher" | ||||
android:label="@string/app_name" | android:label="@string/app_name" | ||||
android:usesCleartextTraffic="true" | |||||
android:roundIcon="@mipmap/ic_launcher_round" | android:roundIcon="@mipmap/ic_launcher_round" | ||||
android:supportsRtl="true" | android:supportsRtl="true" | ||||
android:theme="@style/Theme.PushDemo" | android:theme="@style/Theme.PushDemo" | ||||
android:usesCleartextTraffic="true" | |||||
tools:targetApi="31"> | tools:targetApi="31"> | ||||
<activity | <activity | ||||
android:name=".MainActivity" | |||||
android:name=".LoginActivity" | |||||
android:exported="true"> | android:exported="true"> | ||||
<intent-filter> | <intent-filter> | ||||
<action android:name="android.intent.action.MAIN" /> | <action android:name="android.intent.action.MAIN" /> | ||||
@@ -27,6 +27,9 @@ | |||||
android:name="android.app.lib_name" | android:name="android.app.lib_name" | ||||
android:value="" /> | android:value="" /> | ||||
</activity> | </activity> | ||||
<activity | |||||
android:name=".MainActivity" | |||||
android:exported="true"/> | |||||
</application> | </application> | ||||
</manifest> | </manifest> |
@@ -1,6 +1,10 @@ | |||||
package cn.org.bjca.trust | package cn.org.bjca.trust | ||||
import cn.org.bjca.trust.push.PushSdk | |||||
import cn.org.bjca.trust.push.common.LogHelper | import cn.org.bjca.trust.push.common.LogHelper | ||||
import cn.org.bjca.trust.push.enums.OsType | |||||
import cn.org.bjca.trust.push.message.callback.CallbackListener | |||||
import cn.org.bjca.trust.push.message.msg.Message | |||||
import com.xuqm.base.App | import com.xuqm.base.App | ||||
import com.xuqm.base.di.manager.HttpManager | import com.xuqm.base.di.manager.HttpManager | ||||
@@ -9,5 +13,39 @@ class Myapplication : App() { | |||||
super.onCreate() | super.onCreate() | ||||
LogHelper.e("+++++++++++++++Application") | LogHelper.e("+++++++++++++++Application") | ||||
appComponent = HttpManager.getAppComponent(""); | appComponent = HttpManager.getAppComponent(""); | ||||
PushSdk.instance.setMsgCallback(object : CallbackListener { | |||||
override fun sendComplete(msg: Message) { | |||||
LogHelper.d("------发送消息完成------") | |||||
} | |||||
override fun sendError(code: String, msg: Message) { | |||||
LogHelper.d("消息发送失败::${code}") | |||||
} | |||||
override fun messageArrived(msg: Message) { | |||||
} | |||||
override fun connected() { | |||||
LogHelper.d("------im连接成功------") | |||||
} | |||||
override fun connectionKicked(var1: OsType) { | |||||
LogHelper.d("------其它设备登录::${var1}------") | |||||
} | |||||
override fun connectError(code: String) { | |||||
LogHelper.d("im连接失败") | |||||
} | |||||
override fun connectionLost() { | |||||
LogHelper.d("------im连接丢失,正在重连...------") | |||||
} | |||||
override fun exceptionCause(var1: Throwable) { | |||||
LogHelper.e("------im出现错误------", var1) | |||||
} | |||||
}) | |||||
} | } | ||||
} | } |
@@ -0,0 +1,35 @@ | |||||
package cn.org.bjca.trust.pushdemo | |||||
import android.content.Intent | |||||
import android.os.Bundle | |||||
import cn.org.bjca.trust.push.PushSdk | |||||
import cn.org.bjca.trust.pushdemo.databinding.ActivityLoginBinding | |||||
import com.xuqm.base.dialog.loading.LoadingDialog | |||||
import com.xuqm.base.extensions.showMessage | |||||
import com.xuqm.base.ui.BaseActivity | |||||
import kotlinx.coroutines.CoroutineScope | |||||
import kotlinx.coroutines.Dispatchers | |||||
import kotlinx.coroutines.delay | |||||
import kotlinx.coroutines.launch | |||||
class LoginActivity : BaseActivity<ActivityLoginBinding>() { | |||||
override fun showStatus(): Int = R.color.purple_700 | |||||
override fun getLayoutId(): Int = R.layout.activity_login | |||||
override fun initView(savedInstanceState: Bundle?) { | |||||
super.initView(savedInstanceState) | |||||
binding.button.setOnClickListener { | |||||
if (binding.username.text.isNotEmpty()) { | |||||
LoadingDialog.showDialog("正在登录,请稍候···") | |||||
CoroutineScope(Dispatchers.IO).launch { | |||||
delay(2000L) | |||||
LoadingDialog.dismissDialog() | |||||
PushSdk.instance.register(binding.username.text.toString()) | |||||
startActivity(Intent(mContext, MainActivity::class.java)) | |||||
} | |||||
} | |||||
else "请输入用户名".showMessage() | |||||
} | |||||
} | |||||
} |
@@ -1,9 +1,17 @@ | |||||
package cn.org.bjca.trust.pushdemo | package cn.org.bjca.trust.pushdemo | ||||
import android.os.Bundle | import android.os.Bundle | ||||
import android.provider.MediaStore | |||||
import androidx.activity.result.contract.ActivityResultContracts | |||||
import cn.org.bjca.trust.push.PushSdk | import cn.org.bjca.trust.push.PushSdk | ||||
import cn.org.bjca.trust.push.common.GraphicHelper | |||||
import cn.org.bjca.trust.push.common.LogHelper | |||||
import cn.org.bjca.trust.push.common.MessageHelper | |||||
import cn.org.bjca.trust.push.common.SendMessageHelper | import cn.org.bjca.trust.push.common.SendMessageHelper | ||||
import cn.org.bjca.trust.push.enums.MsgType | |||||
import cn.org.bjca.trust.push.message.bean.PictureMessage | |||||
import cn.org.bjca.trust.pushdemo.databinding.ActivityMainBinding | import cn.org.bjca.trust.pushdemo.databinding.ActivityMainBinding | ||||
import com.xuqm.base.extensions.loge | |||||
import com.xuqm.base.ui.BaseActivity | import com.xuqm.base.ui.BaseActivity | ||||
class MainActivity : BaseActivity<ActivityMainBinding>() { | class MainActivity : BaseActivity<ActivityMainBinding>() { | ||||
@@ -15,10 +23,26 @@ class MainActivity : BaseActivity<ActivityMainBinding>() { | |||||
super.initView(savedInstanceState) | super.initView(savedInstanceState) | ||||
PushSdk.instance.register("xuqinmin") | PushSdk.instance.register("xuqinmin") | ||||
val r = registerForActivityResult(ActivityResultContracts.GetContent()) { | |||||
it.loge() | |||||
SendMessageHelper.sendImageMessage( | |||||
"xuqinmin", MediaStore.Images.Media.getBitmap( | |||||
contentResolver, it | |||||
) | |||||
) | |||||
} | |||||
binding.register.setOnClickListener { | binding.register.setOnClickListener { | ||||
val m = MessageHelper.getMessageForPage(1, 10) | |||||
LogHelper.e(m[0]) | |||||
if (m[0].msgType == MsgType.Image) { | |||||
binding.iv.setImageBitmap(GraphicHelper.base64ToBitmap((m[0] as PictureMessage).thumbnail)) | |||||
} | |||||
} | } | ||||
binding.send.setOnClickListener { | binding.send.setOnClickListener { | ||||
SendMessageHelper.sendTextMessage("xuqinmin", "你好啊${System.currentTimeMillis()}") | |||||
// SendMessageHelper.sendTextMessage("xuqinmin", "hello${System.currentTimeMillis()}") | |||||
r.launch("image/*") | |||||
} | } | ||||
} | } | ||||
@@ -0,0 +1,43 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<layout> | |||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
xmlns:tools="http://schemas.android.com/tools" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:paddingHorizontal="25dp" | |||||
tools:context=".LoginActivity"> | |||||
<EditText | |||||
android:id="@+id/username" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="68dp" | |||||
android:text="xuqinmin" | |||||
android:layout_marginBottom="25dp" | |||||
android:hint="请输入用户名" | |||||
app:layout_constraintBottom_toTopOf="@+id/pwd" | |||||
app:layout_constraintEnd_toEndOf="parent" | |||||
app:layout_constraintStart_toStartOf="parent" /> | |||||
<EditText | |||||
android:id="@+id/pwd" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="68dp" | |||||
android:hint="请输入密码" | |||||
app:layout_constraintBottom_toBottomOf="parent" | |||||
app:layout_constraintEnd_toEndOf="parent" | |||||
app:layout_constraintStart_toStartOf="parent" | |||||
app:layout_constraintTop_toTopOf="parent" /> | |||||
<Button | |||||
android:id="@+id/button" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="68dp" | |||||
android:layout_marginTop="35dp" | |||||
android:text="登录" | |||||
app:layout_constraintEnd_toEndOf="parent" | |||||
app:layout_constraintStart_toStartOf="parent" | |||||
app:layout_constraintTop_toBottomOf="@+id/pwd" /> | |||||
</androidx.constraintlayout.widget.ConstraintLayout> | |||||
</layout> |
@@ -29,6 +29,15 @@ | |||||
app:layout_constraintStart_toStartOf="parent" | app:layout_constraintStart_toStartOf="parent" | ||||
app:layout_constraintTop_toTopOf="parent" | app:layout_constraintTop_toTopOf="parent" | ||||
app:layout_constraintVertical_bias="0.188" /> | app:layout_constraintVertical_bias="0.188" /> | ||||
<ImageView | |||||
android:layout_width="200dp" | |||||
android:layout_height="200dp" | |||||
android:id="@+id/iv" | |||||
app:layout_constraintBottom_toBottomOf="parent" | |||||
app:layout_constraintStart_toStartOf="parent" | |||||
app:layout_constraintEnd_toEndOf="parent" | |||||
app:layout_constraintTop_toBottomOf="@+id/send" | |||||
/> | |||||
</androidx.constraintlayout.widget.ConstraintLayout> | </androidx.constraintlayout.widget.ConstraintLayout> | ||||
</layout> | </layout> |
@@ -19,4 +19,6 @@ object CommonHelper { | |||||
} | } | ||||
@JvmStatic | @JvmStatic | ||||
fun generateMessageId(): String = UUID.randomUUID().toString() | fun generateMessageId(): String = UUID.randomUUID().toString() | ||||
} | } |
@@ -1,5 +1,8 @@ | |||||
package cn.org.bjca.trust.push.common | package cn.org.bjca.trust.push.common | ||||
import android.graphics.BitmapFactory | |||||
import java.io.File | |||||
/** | /** | ||||
* 文件相关工具类 | * 文件相关工具类 | ||||
*/ | */ | ||||
@@ -8,4 +11,18 @@ object FileHelper { | |||||
fun openFile() { | fun openFile() { | ||||
throw Throwable("************************") | throw Throwable("************************") | ||||
} | } | ||||
@JvmStatic | |||||
fun isPicture(file: File): Boolean { | |||||
if (!file.exists()) { | |||||
return false | |||||
} | |||||
val options = BitmapFactory.Options() | |||||
BitmapFactory.decodeFile(file.toString(), options) | |||||
options.inJustDecodeBounds = true | |||||
return when { | |||||
options.outWidth != -1 && options.outHeight != -1 -> true | |||||
else -> false | |||||
} | |||||
} | |||||
} | } |
@@ -0,0 +1,108 @@ | |||||
package cn.org.bjca.trust.push.common | |||||
import android.graphics.Bitmap | |||||
import android.graphics.BitmapFactory | |||||
import android.graphics.Matrix | |||||
import android.util.Base64 | |||||
import java.io.ByteArrayOutputStream | |||||
import java.io.IOException | |||||
import kotlin.math.sqrt | |||||
object GraphicHelper { | |||||
/** | |||||
* 缩放图片到固定文件大小 | |||||
* | |||||
* @param bm 需要缩放的图片 | |||||
* @param maxSize 目标文件大小,单位:KB | |||||
* @return | |||||
*/ | |||||
@JvmStatic | |||||
fun imageZoom(bgimage: Bitmap, maxSize: Double): Bitmap { | |||||
// 图片允许最大空间 单位:KB | |||||
// 将bitmap放至数组中,意在bitmap的大小(与实际读取的原文件要大) | |||||
var bm = bgimage | |||||
val baos = ByteArrayOutputStream() | |||||
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos) | |||||
val b = baos.toByteArray() | |||||
// 将字节换成KB | |||||
val mid = (b.size / 1024).toDouble() | |||||
// 判断bitmap占用空间是否大于允许最大空间 如果大于则压缩 小于则不压缩 | |||||
if (mid > maxSize) { | |||||
// 获取bitmap大小 是允许最大大小的多少倍 | |||||
val i = mid / maxSize | |||||
// 开始压缩 此处用到平方根 将宽带和高度压缩掉对应的平方根倍 | |||||
// 保持刻度和高度和原bitmap比率一致,压缩后也达到了最大大小占用空间的大小 | |||||
bm = zoomImage(bm, bm.width / sqrt(i), bm.height / sqrt(i)) | |||||
} | |||||
return bm | |||||
} | |||||
/*** | |||||
* 图片的缩放方法 | |||||
* | |||||
* @param bgimage :源图片资源 | |||||
* @param newWidth :缩放后宽度 | |||||
* @param newHeight :缩放后高度 | |||||
* @return | |||||
*/ | |||||
@JvmStatic | |||||
fun zoomImage(bgimage: Bitmap, newWidth: Double, newHeight: Double): Bitmap { | |||||
// 获取这个图片的宽和高 | |||||
val width = bgimage.width.toFloat() | |||||
val height = bgimage.height.toFloat() | |||||
// 创建操作图片用的matrix对象 | |||||
val matrix = Matrix() | |||||
// 计算宽高缩放率 | |||||
val scaleWidth = newWidth.toFloat() / width | |||||
val scaleHeight = newHeight.toFloat() / height | |||||
// 缩放图片动作 | |||||
matrix.postScale(scaleWidth, scaleHeight) | |||||
return Bitmap.createBitmap(bgimage, 0, 0, width.toInt(), height.toInt(), matrix, true) | |||||
} | |||||
/** | |||||
* bitmap转为base64 | |||||
* | |||||
* @param bitmap | |||||
* @return | |||||
*/ | |||||
@JvmStatic | |||||
fun bitmapToBase64(bitmap: Bitmap): String? { | |||||
var result: String? = null | |||||
var baos: ByteArrayOutputStream? = null | |||||
try { | |||||
baos = ByteArrayOutputStream() | |||||
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos) | |||||
baos.flush() | |||||
baos.close() | |||||
val bitmapBytes = baos.toByteArray() | |||||
result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT) | |||||
} catch (e: IOException) { | |||||
e.printStackTrace() | |||||
} finally { | |||||
try { | |||||
if (baos != null) { | |||||
baos.flush() | |||||
baos.close() | |||||
} | |||||
} catch (e: IOException) { | |||||
e.printStackTrace() | |||||
} | |||||
} | |||||
return result | |||||
} | |||||
/** | |||||
* base64转为bitmap | |||||
* | |||||
* @param base64Data | |||||
* @return | |||||
*/ | |||||
@JvmStatic | |||||
fun base64ToBitmap(base64Data: String?): Bitmap? { | |||||
val bytes = Base64.decode(base64Data, Base64.DEFAULT) | |||||
return BitmapFactory.decodeByteArray(bytes, 0, bytes.size) | |||||
} | |||||
} |
@@ -11,6 +11,15 @@ import org.json.JSONException | |||||
object MessageHelper { | object MessageHelper { | ||||
@JvmStatic | @JvmStatic | ||||
fun getMessage(): List<SzyxMessage> = DbHelper.getDataBase().messageDao().getAll() | |||||
@JvmStatic | |||||
fun getMessageForPage(start: Int, limit: Int): List<Message> = | |||||
DbHelper.getDataBase().messageDao().getMessageForPage(start, limit).map { | |||||
parseMessage(it)?:UnknownMessage() | |||||
} | |||||
@JvmStatic | |||||
fun parseMessage(sendMessage: SendMessage): Message? { | fun parseMessage(sendMessage: SendMessage): Message? { | ||||
val msgType = MsgType.getMsgType(sendMessage.messageType) | val msgType = MsgType.getMsgType(sendMessage.messageType) | ||||
@@ -1,5 +1,7 @@ | |||||
package cn.org.bjca.trust.push.common | package cn.org.bjca.trust.push.common | ||||
import android.graphics.Bitmap | |||||
import android.graphics.BitmapFactory | |||||
import cn.org.bjca.trust.push.BuildConfig | import cn.org.bjca.trust.push.BuildConfig | ||||
import cn.org.bjca.trust.push.db.DbHelper | import cn.org.bjca.trust.push.db.DbHelper | ||||
import cn.org.bjca.trust.push.message.ImManager | import cn.org.bjca.trust.push.message.ImManager | ||||
@@ -7,10 +9,10 @@ import cn.org.bjca.trust.push.message.bean.* | |||||
import cn.org.bjca.trust.push.message.msg.Message | import cn.org.bjca.trust.push.message.msg.Message | ||||
import cn.org.bjca.trust.push.message.msg.SendMessage | import cn.org.bjca.trust.push.message.msg.SendMessage | ||||
import java.io.File | import java.io.File | ||||
import java.net.URI | |||||
object SendMessageHelper { | object SendMessageHelper { | ||||
private fun sendMessage(message: Message) { | private fun sendMessage(message: Message) { | ||||
LogHelper.d("------app端调用发送消息-----") | |||||
val sendMessage = SendMessage() | val sendMessage = SendMessage() | ||||
sendMessage.messageId = message.messageId ?: CommonHelper.generateMessageId() | sendMessage.messageId = message.messageId ?: CommonHelper.generateMessageId() | ||||
sendMessage.timestamp = System.currentTimeMillis() | sendMessage.timestamp = System.currentTimeMillis() | ||||
@@ -31,8 +33,43 @@ object SendMessageHelper { | |||||
@JvmStatic | @JvmStatic | ||||
fun sendImageMessage( | fun sendImageMessage( | ||||
toUserId: String, | toUserId: String, | ||||
uri: URI | |||||
) { | |||||
sendImageMessage(toUserId, File(uri)) | |||||
} | |||||
@JvmStatic | |||||
fun sendImageMessage( | |||||
toUserId: String, | |||||
file: File | file: File | ||||
) { | ) { | ||||
if (!FileHelper.isPicture(file)) throw Throwable("不是图片文件") | |||||
val img = GraphicHelper.imageZoom(BitmapFactory.decodeFile(file.absolutePath), 2048.0) | |||||
GraphicHelper.bitmapToBase64(img)?.let { | |||||
sendImageMessage( | |||||
toUserId, | |||||
"dsadsasdsa", | |||||
it, | |||||
img.width.toDouble(), | |||||
img.height.toDouble() | |||||
) | |||||
} | |||||
} | |||||
@JvmStatic | |||||
fun sendImageMessage( | |||||
toUserId: String, | |||||
bitmap: Bitmap | |||||
) { | |||||
val img = GraphicHelper.imageZoom(bitmap, 200.0) | |||||
GraphicHelper.bitmapToBase64(img)?.let { | |||||
sendImageMessage( | |||||
toUserId, | |||||
"dsadsasdsa", | |||||
it, | |||||
img.width.toDouble(), | |||||
img.height.toDouble() | |||||
) | |||||
} | |||||
} | } | ||||
@JvmStatic | @JvmStatic | ||||
@@ -40,12 +77,11 @@ object SendMessageHelper { | |||||
toUserId: String, | toUserId: String, | ||||
imageStorageId: String, | imageStorageId: String, | ||||
thumbnail: String, | thumbnail: String, | ||||
thumbnailWidth: Int, | |||||
thumbnailHeight: Int | |||||
thumbnailWidth: Double, | |||||
thumbnailHeight: Double | |||||
) { | ) { | ||||
sendMessage( | sendMessage( | ||||
PictureMessage( | |||||
).apply { | |||||
PictureMessage().apply { | |||||
toClientId = toUserId | toClientId = toUserId | ||||
this.imageStorageId = imageStorageId | this.imageStorageId = imageStorageId | ||||
this.thumbnail = thumbnail | this.thumbnail = thumbnail | ||||
@@ -7,6 +7,9 @@ interface MessageDao { | |||||
@Query("SELECT * FROM message") | @Query("SELECT * FROM message") | ||||
fun getAll(): List<SzyxMessage> | fun getAll(): List<SzyxMessage> | ||||
@Query("SELECT * FROM message ORDER BY p_id DESC LIMIT (:start-1)*:limit,:limit") | |||||
fun getMessageForPage(start:Int, limit:Int): List<SzyxMessage> | |||||
@Query("SELECT * FROM message WHERE message_id = :msgId") | @Query("SELECT * FROM message WHERE message_id = :msgId") | ||||
fun getMessage(msgId: String): List<SzyxMessage> | fun getMessage(msgId: String): List<SzyxMessage> | ||||
@@ -9,8 +9,8 @@ enum class MsgType(val value: Int) { | |||||
Video(5) /* 视频 */, | Video(5) /* 视频 */, | ||||
File(6) /* 文件 */, | File(6) /* 文件 */, | ||||
At(7) /* @我 */, | At(7) /* @我 */, | ||||
Log(8) /* 日志 */, | |||||
Other(10010), /* 自定义消息 */ | |||||
Other(8) /* 自定义消息 */, | |||||
Log(10010), /* 日志 */ | |||||
/** | /** | ||||
* pc 登陆 end | * pc 登陆 end | ||||
*/ | */ | ||||
@@ -1,5 +1,4 @@ | |||||
package com.xuqm.base.extensions | |||||
package cn.org.bjca.trust.push.extensions | |||||
import android.app.Activity | import android.app.Activity | ||||
import android.content.Context | import android.content.Context | ||||
import android.view.inputmethod.InputMethodManager | import android.view.inputmethod.InputMethodManager | ||||
@@ -13,6 +13,7 @@ import cn.org.bjca.trust.push.message.client.ImConnectOptions | |||||
class PushSdkManager : SdkInterface { | class PushSdkManager : SdkInterface { | ||||
private lateinit var imConnectOptions: ImConnectOptions | private lateinit var imConnectOptions: ImConnectOptions | ||||
private lateinit var callback: CallbackListener | |||||
override fun register(userId: String) { | override fun register(userId: String) { | ||||
registerIm(userId) | registerIm(userId) | ||||
@@ -56,7 +57,8 @@ class PushSdkManager : SdkInterface { | |||||
BuildConfig.versionName | BuildConfig.versionName | ||||
) | ) | ||||
} | } | ||||
imConnectOptions.callback = ImCallback() | |||||
if (::callback.isInitialized) this.imConnectOptions.callback = callback | |||||
else imConnectOptions.callback = ImCallback() | |||||
ImManager.instance.connect(imConnectOptions) | ImManager.instance.connect(imConnectOptions) | ||||
} | } | ||||
@@ -66,6 +68,7 @@ class PushSdkManager : SdkInterface { | |||||
override fun setMsgCallback(callback: CallbackListener) { | override fun setMsgCallback(callback: CallbackListener) { | ||||
imConnectOptions.callback = callback | |||||
this.callback = callback | |||||
if (::imConnectOptions.isInitialized) this.imConnectOptions.callback = callback | |||||
} | } | ||||
} | } |
@@ -10,8 +10,8 @@ import org.json.JSONObject | |||||
class PictureMessage : Message() { | class PictureMessage : Message() { | ||||
var imageStorageId: String? = null | var imageStorageId: String? = null | ||||
var thumbnail: String? = null | var thumbnail: String? = null | ||||
var thumbnailWidth: Int? = null | |||||
var thumbnailHeight: Int? = null | |||||
var thumbnailWidth: Double? = null | |||||
var thumbnailHeight: Double? = null | |||||
init { | init { | ||||
this.msgType = MsgType.Image | this.msgType = MsgType.Image | ||||
@@ -23,9 +23,9 @@ class PictureMessage : Message() { | |||||
val json = sendMessage.message?.let { JSONObject(it) } | val json = sendMessage.message?.let { JSONObject(it) } | ||||
if (json != null) { | if (json != null) { | ||||
this.imageStorageId = json.optString("imageStorageId") | this.imageStorageId = json.optString("imageStorageId") | ||||
this.thumbnail = json.optString("imageStorageId") | |||||
this.thumbnailWidth = json.optInt("imageStorageId") | |||||
this.thumbnailHeight = json.optInt("imageStorageId") | |||||
this.thumbnail = json.optString("thumbnail") | |||||
this.thumbnailWidth = json.optDouble("thumbnailWidth") | |||||
this.thumbnailHeight = json.optDouble("thumbnailHeight") | |||||
} | } | ||||
} catch (e: Exception) { | } catch (e: Exception) { | ||||
LogHelper.e("消息组装失败", e) | LogHelper.e("消息组装失败", e) | ||||
@@ -35,6 +35,7 @@ class ImClient : ImClientInterface { | |||||
connectOptions = mImConnectOptions | connectOptions = mImConnectOptions | ||||
init() | init() | ||||
mConnect() | mConnect() | ||||
startReconnect() | |||||
} | } | ||||
private fun mConnect() { | private fun mConnect() { | ||||
@@ -46,7 +47,11 @@ class ImClient : ImClientInterface { | |||||
LogHelper.d("------------开始重连::mqttArrivedClient--------------") | LogHelper.d("------------开始重连::mqttArrivedClient--------------") | ||||
mqttArrivedClient.connect(options) | mqttArrivedClient.connect(options) | ||||
} | } | ||||
} catch (e: Exception) { | |||||
} catch (e: MqttSecurityException) { | |||||
LogHelper.e("--------", e) | |||||
connectOptions.callback?.connectError(ERROR_CONNECTED) | |||||
} catch (e: MqttException) { | |||||
LogHelper.e("--------", e) | |||||
connectOptions.callback?.connectError(ERROR_CONNECTED) | connectOptions.callback?.connectError(ERROR_CONNECTED) | ||||
} | } | ||||
isConnecting = false | isConnecting = false | ||||
@@ -82,7 +87,6 @@ class ImClient : ImClientInterface { | |||||
override fun connectComplete(reconnect: Boolean, serverURI: String) { | override fun connectComplete(reconnect: Boolean, serverURI: String) { | ||||
mqttArrivedClient.subscribe(connectOptions.clientId, 2) | mqttArrivedClient.subscribe(connectOptions.clientId, 2) | ||||
sendConnectMessage() | sendConnectMessage() | ||||
startReconnect() | |||||
} | } | ||||
}) | }) | ||||
} | } | ||||
@@ -101,22 +105,25 @@ class ImClient : ImClientInterface { | |||||
LogHelper.d("------新消息------\n${str}") | LogHelper.d("------新消息------\n${str}") | ||||
val sendMessage = GsonImplHelp.get() | val sendMessage = GsonImplHelp.get() | ||||
.toObject(String(payload, Charsets.UTF_8), SendMessage::class.java) | .toObject(String(payload, Charsets.UTF_8), SendMessage::class.java) | ||||
if (sendMessage.messageId.isNullOrEmpty()) return | |||||
sendMessage.messageId?.let { ackMessage(it) } | |||||
val his = DbHelper.getDataBase().messageDao().getMessage(sendMessage.messageId!!) | |||||
if (his.isNotEmpty()) return | |||||
// 存表 | // 存表 | ||||
DbHelper.getDataBase().messageDao().insertAll( | |||||
SzyxMessage( | |||||
sendMessage.messageId, | |||||
sendMessage.timestamp, | |||||
sendMessage.fromClientId, | |||||
sendMessage.toClientId, | |||||
sendMessage.target, | |||||
sendMessage.messageType, | |||||
sendMessage.message, | |||||
sendMessage.tenantNo, | |||||
1 | |||||
if (sendMessage.messageType < 100) | |||||
DbHelper.getDataBase().messageDao().insertAll( | |||||
SzyxMessage( | |||||
sendMessage.messageId, | |||||
sendMessage.timestamp, | |||||
sendMessage.fromClientId, | |||||
sendMessage.toClientId, | |||||
sendMessage.target, | |||||
sendMessage.messageType, | |||||
sendMessage.message, | |||||
sendMessage.tenantNo, | |||||
1 | |||||
) | |||||
) | ) | ||||
) | |||||
// 回复服务端收到 | |||||
sendMessage.messageId?.let { ackMessage(it) } | |||||
// 通知app新消息到达 | // 通知app新消息到达 | ||||
MessageHelper.parseMessage(sendMessage)?.also { | MessageHelper.parseMessage(sendMessage)?.also { | ||||
connectOptions.callback?.messageArrived(it) | connectOptions.callback?.messageArrived(it) | ||||
@@ -159,7 +166,7 @@ class ImClient : ImClientInterface { | |||||
private lateinit var pingScheduler: ScheduledExecutorService | private lateinit var pingScheduler: ScheduledExecutorService | ||||
// ping和断线重连 | // ping和断线重连 | ||||
fun startReconnect() { | |||||
private fun startReconnect() { | |||||
if (!::scheduler.isInitialized) { | if (!::scheduler.isInitialized) { | ||||
scheduler = Executors.newSingleThreadScheduledExecutor() | scheduler = Executors.newSingleThreadScheduledExecutor() | ||||
scheduler.scheduleAtFixedRate({ | scheduler.scheduleAtFixedRate({ | ||||
@@ -207,19 +214,20 @@ class ImClient : ImClientInterface { | |||||
msg.fromClientId = connectOptions.clientId | msg.fromClientId = connectOptions.clientId | ||||
msg.target = connectOptions.clientId | msg.target = connectOptions.clientId | ||||
DbHelper.getDataBase().messageDao().insertAll( | |||||
SzyxMessage( | |||||
msg.messageId, | |||||
msg.timestamp, | |||||
msg.fromClientId, | |||||
msg.toClientId, | |||||
msg.target, | |||||
msg.messageType, | |||||
msg.message, | |||||
msg.tenantNo, | |||||
0 | |||||
if (msg.messageType < 100) | |||||
DbHelper.getDataBase().messageDao().insertAll( | |||||
SzyxMessage( | |||||
msg.messageId, | |||||
msg.timestamp, | |||||
msg.fromClientId, | |||||
msg.toClientId, | |||||
msg.target, | |||||
msg.messageType, | |||||
msg.message, | |||||
msg.tenantNo, | |||||
0 | |||||
) | |||||
) | ) | ||||
) | |||||
if (!isConnect()) { | if (!isConnect()) { | ||||
msg.messageId?.let { MessageHelper.changeStatus(it, false) } | msg.messageId?.let { MessageHelper.changeStatus(it, false) } | ||||
MessageHelper.parseMessage(msg)?.let { | MessageHelper.parseMessage(msg)?.let { | ||||
@@ -230,8 +238,10 @@ class ImClient : ImClientInterface { | |||||
return | return | ||||
} | } | ||||
try { | try { | ||||
val m = GsonImplHelp.get().toJson(msg) | |||||
LogHelper.d("------app端调用发送消息-----\t${m}") | |||||
mqttArrivedClient.publish( | mqttArrivedClient.publish( | ||||
"server", GsonImplHelp.get().toJson(msg).toByteArray(Charsets.UTF_8), 2, true | |||||
"server", m.toByteArray(Charsets.UTF_8), 2, true | |||||
) | ) | ||||
handler.sendMessageDelayed(Message().apply { | handler.sendMessageDelayed(Message().apply { | ||||
what = 10086 | what = 10086 | ||||