Преглед на файлове

1.添加收到IM消息展示弹窗功能

王鹏鹏 преди 2 години
родител
ревизия
a14772b5cc

+ 1 - 1
.idea/misc.xml

@@ -518,7 +518,7 @@
         <entry key="..\:/workspace/hcp-pads/game/src/main/res/layout/activity_play_game.xml" value="0.264" />
         <entry key="..\:/workspace/hcp-pads/game/src/main/res/layout/dialog_completion_training.xml" value="0.72" />
         <entry key="..\:/workspace/hcp-pads/game/src/main/res/layout/dialog_count_down.xml" value="0.4" />
-        <entry key="..\:/workspace/hcp-pads/game/src/main/res/layout/dialog_exit_game.xml" value="0.22239583333333332" />
+        <entry key="..\:/workspace/hcp-pads/game/src/main/res/layout/dialog_exit_game.xml" value="0.536" />
         <entry key="..\:/workspace/hcp-pads/game/src/main/res/layout/dialog_game_loading.xml" value="0.23697916666666666" />
         <entry key="..\:/workspace/hcp-pads/game/src/main/res/layout/dialog_game_result.xml" value="0.536" />
         <entry key="..\:/workspace/hcp-pads/game/src/main/res/layout/item_game_result.xml" value="0.23697916666666666" />

+ 12 - 0
app/src/main/java/com/yingyangfly/MainActivity.kt

@@ -1,10 +1,13 @@
 package com.yingyangfly
 
+import android.content.Intent
+import android.os.Build
 import android.os.Bundle
 import com.alibaba.android.arouter.launcher.ARouter
 import com.yingyangfly.baselib.base.BaseActivity
 import com.yingyangfly.baselib.config.AccountConfig
 import com.yingyangfly.baselib.router.RouterUrlCommon
+import com.yingyang.login.service.InitService
 import com.yingyangfly.baselib.utils.User
 import com.yingyangfly.databinding.ActivityMainBinding
 
@@ -16,6 +19,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
                 ARouter.getInstance().build(RouterUrlCommon.login)
                     .navigation()
             } else {
+                startInitService()
                 ARouter.getInstance().build(RouterUrlCommon.home)
                     .navigation()
             }
@@ -34,4 +38,12 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
     override fun initData() {
 
     }
+
+    private fun startInitService() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            startForegroundService(Intent(this, InitService::class.java))
+        } else {
+            startService(Intent(this, InitService::class.java))
+        }
+    }
 }

+ 6 - 0
baselib/src/main/java/com/yingyangfly/baselib/net/BaselibApiService.kt

@@ -29,4 +29,10 @@ interface BaselibApiService {
         @Body requestBody: RequestBody
     ): Observable<XBaseEntity<String>>
 
+    /**
+     * 获取腾讯IM密钥
+     */
+    @POST("im/user_sign")
+    fun getUserSign(@Query("userId") userId: String): Observable<XBaseEntity<String>>
+
 }

+ 1 - 0
baselib/src/main/java/com/yingyangfly/baselib/utils/CommonParam.kt

@@ -13,4 +13,5 @@ object CommonParam {
     val SNCODE = "sncode"
     val USERSEX = "userSex"
     val USERAGE = "userAge"
+    val TXSIGN = "txSign"
 }

+ 12 - 0
baselib/src/main/java/com/yingyangfly/baselib/utils/User.kt

@@ -136,6 +136,18 @@ object User {
         }
     }
 
+    fun saveTXUserSign(sign: String) {
+        Preferences.put(CommonParam.TXSIGN, sign)
+    }
+
+    fun getTXUserSign(): String {
+        return if (Preferences.getString(CommonParam.TXSIGN).isNullOrEmpty()) {
+            ""
+        } else {
+            Preferences.getString(CommonParam.TXSIGN)!!
+        }
+    }
+
     /**
      * 获取当前日期
      */

+ 41 - 42
home/src/main/java/com/yingyangfly/home/activity/HomeActivity.kt

@@ -9,17 +9,22 @@ import androidx.recyclerview.widget.GridLayoutManager
 import com.alibaba.android.arouter.facade.annotation.Route
 import com.alibaba.android.arouter.launcher.ARouter
 import com.bumptech.glide.Glide
+import com.tencent.imsdk.v2.V2TIMAdvancedMsgListener
 import com.tencent.imsdk.v2.V2TIMManager
-import com.tencent.imsdk.v2.V2TIMSimpleMsgListener
-import com.tencent.imsdk.v2.V2TIMUserInfo
+import com.tencent.imsdk.v2.V2TIMMessage
+import com.tencent.imsdk.v2.V2TIMTextElem
 import com.yingyang.home.R
 import com.yingyang.home.databinding.ActivityHomeBinding
 import com.yingyangfly.baselib.bean.GetSaveGameRecordBean
+import com.yingyangfly.baselib.bean.MessageBean
 import com.yingyangfly.baselib.bean.Record
 import com.yingyangfly.baselib.db.VoicePlayerBean
 import com.yingyangfly.baselib.dialog.TaskFragment
 import com.yingyangfly.baselib.dialog.TipsDialog
-import com.yingyangfly.baselib.ext.*
+import com.yingyangfly.baselib.ext.getEndAnimation
+import com.yingyangfly.baselib.ext.getScaleAnimation
+import com.yingyangfly.baselib.ext.show
+import com.yingyangfly.baselib.ext.toast
 import com.yingyangfly.baselib.guideview.Guide
 import com.yingyangfly.baselib.guideview.GuideBuilder
 import com.yingyangfly.baselib.mvvm.BaseMVVMActivity
@@ -34,6 +39,7 @@ import com.yingyangfly.home.component.ShowProfessionalEvaluationViewComponent
 import com.yingyangfly.home.dialog.DownLoadAppFragment
 import com.yingyangfly.home.utils.AnimUtil
 
+
 /**
  * 新版首页
  */
@@ -151,7 +157,7 @@ class HomeActivity : BaseMVVMActivity<ActivityHomeBinding, HomeViewModel>(),
      */
     private fun addSimpleMsgListener() {
         //消息接受监听
-        V2TIMManager.getInstance().addSimpleMsgListener(simpleMsgListener)
+        V2TIMManager.getMessageManager().addAdvancedMsgListener(simpleMsgListener)
     }
 
     /**
@@ -687,48 +693,41 @@ class HomeActivity : BaseMVVMActivity<ActivityHomeBinding, HomeViewModel>(),
         })
     }
 
-    override fun onDestroy() {
-        runOnUiThread {
-            V2TIMManager.getInstance().removeSimpleMsgListener(simpleMsgListener)
-        }
-        super.onDestroy()
-    }
-
     /**
      * 自定义消息监听
      */
-    private var simpleMsgListener: V2TIMSimpleMsgListener = object : V2TIMSimpleMsgListener() {
-        override fun onRecvC2CCustomMessage(
-            msgID: String?,
-            sender: V2TIMUserInfo?,
-            customData: ByteArray?
-        ) {
-            super.onRecvC2CCustomMessage(msgID, sender, customData)
-            if (customData != null) {
-                val data = String(customData)
-                Log.e("wpp", "自定义消息--------------------------" + data)
-//                val messageBean = GsonUtil.GsonToBean(data, MessageBean::class.java)
-//                if (messageBean != null) {
-//                    if (TextUtils.equals("A", messageBean.businessID)) {
-//                        //缴费通知
-//                        LiveEventBusUtil.send(RxBusCodes.SHOWTASKDIALOG, messageBean.data)
-//                    } else if (TextUtils.equals("B", messageBean.businessID)) {
-//                        //系统通知
-//                        LiveEventBusUtil.send(RxBusCodes.SHOWTASKDIALOG, messageBean.data)
-//                    } else if (TextUtils.equals("C", messageBean.businessID)) {
-//                        //报告通知
-//                        LiveEventBusUtil.send(RxBusCodes.SHOWTASKDIALOG, messageBean.data)
-//                    } else if (TextUtils.equals("D", messageBean.businessID)) {
-//                        //理疗通知
-//                        LiveEventBusUtil.send(RxBusCodes.SHOWTASKDIALOG, messageBean.data)
-//                    }
-//                }
+    private var simpleMsgListener: V2TIMAdvancedMsgListener = object : V2TIMAdvancedMsgListener() {
+        override fun onRecvNewMessage(msg: V2TIMMessage) {
+            super.onRecvNewMessage(msg)
+            Log.e("wpp", GsonUtil.GsonString(msg))
+            if (msg.elemType == V2TIMMessage.V2TIM_ELEM_TYPE_CUSTOM) {
+                val customElem = msg.customElem
+                if (customElem != null && customElem.data != null) {
+                    val data = String(customElem.data)
+                    val messageBean = GsonUtil.GsonToBean(data, MessageBean::class.java)
+                    if (messageBean != null) {
+                        if (TextUtils.equals("A", messageBean.businessID)) {
+                            //缴费通知
+                            LiveEventBusUtil.send(RxBusCodes.SHOWTASKDIALOG, messageBean.data)
+                        } else if (TextUtils.equals("B", messageBean.businessID)) {
+                            //系统通知
+                            LiveEventBusUtil.send(RxBusCodes.SHOWTASKDIALOG, messageBean.data)
+                        } else if (TextUtils.equals("C", messageBean.businessID)) {
+                            //报告通知
+                            LiveEventBusUtil.send(RxBusCodes.SHOWTASKDIALOG, messageBean.data)
+                        } else if (TextUtils.equals("D", messageBean.businessID)) {
+                            //理疗通知
+                            LiveEventBusUtil.send(RxBusCodes.SHOWTASKDIALOG, messageBean.data)
+                        }
+                    }
+                } else {
+                    Log.e("wpp", "自定义消息--------------------------解析失败")
+                }
+            } else if (msg.elemType == V2TIMMessage.V2TIM_ELEM_TYPE_TEXT) {
+                val textElem: V2TIMTextElem = msg.textElem
+                val text: String = textElem.text
+                Log.e("wpp", "text:" + text)
             }
         }
-
-        override fun onRecvC2CTextMessage(msgID: String?, sender: V2TIMUserInfo?, text: String?) {
-            super.onRecvC2CTextMessage(msgID, sender, text)
-            Log.e("wpp", "普通消息-------------------------" + text)
-        }
     }
 }

+ 0 - 14
home/src/main/java/com/yingyangfly/home/activity/HomeViewModel.kt

@@ -123,20 +123,6 @@ class HomeViewModel : BaseViewModel() {
         fail
     )
 
-    /**
-     * 获取腾讯IM密钥
-     */
-    fun getUserSign(
-        id: String,
-        fail: ((msg: String) -> Unit)? = null,
-        success: ((success: String?) -> Unit)? = null,
-    ) = launchFlow(false) {
-        HOME_API.getUserSign(id)
-    }.runUI(
-        success,
-        fail
-    )
-
     /**
      * 获取游戏详情
      */

+ 5 - 0
login/src/main/AndroidManifest.xml

@@ -8,6 +8,11 @@
             android:configChanges="keyboardHidden|orientation|screenSize"
             android:screenOrientation="landscape"
             android:windowSoftInputMode="adjustPan" />
+
+        <service
+            android:name=".service.InitService"
+            android:enabled="true"
+            android:exported="true" />
     </application>
 
 </manifest>

+ 0 - 6
login/src/main/java/com/yingyang/login/net/LoginApiService.kt

@@ -37,10 +37,4 @@ interface LoginApiService {
      */
     @POST("app/getCheckCode")
     suspend fun sendCode(@Query("mobile") mobile: String): BaseResp<UserInfoBean>
-
-    /**
-     * 获取腾讯IM密钥
-     */
-    @POST("im/user_sign")
-    suspend fun getUserSign(@Query("userId") userId: String): BaseResp<String>
 }

+ 97 - 0
login/src/main/java/com/yingyang/login/service/InitService.kt

@@ -0,0 +1,97 @@
+package com.yingyang.login.service
+
+import android.app.Notification
+import android.app.NotificationChannel
+import android.app.NotificationManager
+import android.app.Service
+import android.content.Intent
+import android.os.Build
+import android.os.IBinder
+import android.text.TextUtils
+import android.util.Log
+import com.alibaba.android.arouter.launcher.ARouter
+import com.tencent.imsdk.v2.V2TIMCallback
+import com.tencent.imsdk.v2.V2TIMManager
+import com.yingyangfly.baselib.ext.toast
+import com.yingyangfly.baselib.net.BaseObserver
+import com.yingyangfly.baselib.net.BaselibServiceFactory
+import com.yingyangfly.baselib.net.MyRxScheduler
+import com.yingyangfly.baselib.router.RouterUrlCommon
+import com.yingyangfly.baselib.utils.NetWorkUtils
+import com.yingyangfly.baselib.utils.User
+import io.reactivex.schedulers.Schedulers
+
+class InitService : Service() {
+
+    var network = false
+    private val GRAY_SERVICE_ID = 1002
+    private val CHANNEL_NAME = "InitService"
+
+    override fun onCreate() {
+        super.onCreate()
+        network = NetWorkUtils.isConnectedByState(this)
+    }
+
+    override fun onBind(p0: Intent?): IBinder? {
+        TODO("Not yet implemented")
+    }
+
+    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
+        Log.i("wpp", "InitService")
+        startForeground()
+        Thread { init() }.start()
+        return super.onStartCommand(intent, flags, startId)
+    }
+
+    fun init() {
+        userSigTx()
+    }
+
+    //登录腾讯云
+    private fun userSigTx() {
+        BaselibServiceFactory.getService()
+            .getUserSign(User.getUserId())
+            .subscribe(object : BaseObserver<String>() {
+                override fun onSuccess(t: String?) {
+                    if (TextUtils.isEmpty(t).not()) {
+                        User.saveTXUserSign(t!!)
+                        loginIM(t)
+                    }
+                }
+
+                override fun onFail(msg: String) {
+
+                }
+            })
+    }
+
+    private fun loginIM(t: String) {
+        V2TIMManager.getInstance().login(User.getUserId(), t, object : V2TIMCallback {
+            override fun onSuccess() {
+
+            }
+
+            override fun onError(p0: Int, p1: String?) {
+                "IM登陆失败".toast()
+            }
+        })
+
+    }
+
+    private fun startForeground() {
+        //设置service为前台服务,提高优先级
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+            //Android4.3 - Android8.0,隐藏Notification上的图标
+            startForeground(GRAY_SERVICE_ID, Notification())
+        } else {
+            //Android8.0以上app启动后通知栏会出现一条"正在运行"的通知
+            val channel =
+                NotificationChannel(CHANNEL_NAME, CHANNEL_NAME, NotificationManager.IMPORTANCE_MIN)
+            val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
+            manager.createNotificationChannel(channel)
+            val notification = Notification.Builder(applicationContext, CHANNEL_NAME).build()
+            startForeground(GRAY_SERVICE_ID, notification)
+        }
+    }
+
+}

+ 12 - 33
login/src/main/java/com/yingyang/login/ui/login/LoginActivity.kt

@@ -1,12 +1,12 @@
 package com.yingyang.login.ui.login
 
 import android.annotation.SuppressLint
+import android.content.Intent
 import android.graphics.Typeface
 import android.os.Build
 import android.text.InputType
 import android.text.SpannableString
 import android.text.Spanned
-import android.text.TextUtils
 import android.text.style.ForegroundColorSpan
 import android.view.MotionEvent
 import android.view.View
@@ -14,10 +14,9 @@ import android.widget.TextView
 import com.alibaba.android.arouter.facade.annotation.Route
 import com.alibaba.android.arouter.launcher.ARouter
 import com.google.android.material.tabs.TabLayout
-import com.tencent.imsdk.v2.V2TIMCallback
-import com.tencent.imsdk.v2.V2TIMManager
 import com.yingyang.login.R
 import com.yingyang.login.databinding.ActivityLoginBinding
+import com.yingyang.login.service.InitService
 import com.yingyangfly.baselib.ext.getEndAnimation
 import com.yingyangfly.baselib.ext.getScaleAnimation
 import com.yingyangfly.baselib.ext.toast
@@ -175,6 +174,7 @@ class LoginActivity : BaseMVVMActivity<ActivityLoginBinding, LoginViewModel>(),
         viewModel.getUserInfo(fail = {
             it.toast()
         }, success = {
+            startInitService()
             if (it != null) {
                 //保存用户头像
                 if (it.avatar.isEmpty().not()) {
@@ -193,7 +193,10 @@ class LoginActivity : BaseMVVMActivity<ActivityLoginBinding, LoginViewModel>(),
                 if (it.firstLogin.isEmpty().not()) {
                     User.saveFirstLogin(it.firstLogin)
                 }
-                getUserSign()
+                ARouter.getInstance().build(RouterUrlCommon.home)
+                    .withTransition(R.anim.leftin, R.anim.leftout)
+                    .navigation(mContext)
+                finish()
             }
         })
     }
@@ -342,35 +345,11 @@ class LoginActivity : BaseMVVMActivity<ActivityLoginBinding, LoginViewModel>(),
         super.onDestroy()
     }
 
-    /**
-     * 获取腾讯IM密钥
-     */
-    private fun getUserSign() {
-        viewModel.getUserSign(User.getUserId(), fail = {
-        }, success = {
-            if (TextUtils.isEmpty(it).not()) {
-                loginIM(it!!)
-            }
-        })
-    }
-
-    /**
-     * 登录腾讯IM
-     */
-    private fun loginIM(sign: String) {
-        runOnUiThread {
-            V2TIMManager.getInstance().login(User.getUserId(), sign, object : V2TIMCallback {
-                override fun onSuccess() {
-                    ARouter.getInstance().build(RouterUrlCommon.home)
-                        .withTransition(R.anim.leftin, R.anim.leftout)
-                        .navigation(mContext)
-                    finish()
-                }
-
-                override fun onError(p0: Int, p1: String?) {
-                    "IM登陆失败".toast()
-                }
-            })
+    private fun startInitService() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            startForegroundService(Intent(this, InitService::class.java))
+        } else {
+            startService(Intent(this, InitService::class.java))
         }
     }
 }

+ 0 - 14
login/src/main/java/com/yingyang/login/ui/login/LoginViewModel.kt

@@ -61,18 +61,4 @@ class LoginViewModel : BaseViewModel() {
         success,
         fail
     )
-
-    /**
-     * 获取腾讯IM密钥
-     */
-    fun getUserSign(
-        id: String,
-        fail: ((msg: String) -> Unit)? = null,
-        success: ((success: String?) -> Unit)? = null,
-    ) = launchFlow(true) {
-        LOGIN_API.getUserSign(id)
-    }.runUI(
-        success,
-        fail
-    )
 }

+ 5 - 0
login/src/main/manifest/AndroidManifest.xml

@@ -8,6 +8,11 @@
             android:configChanges="keyboardHidden|orientation|screenSize"
             android:screenOrientation="landscape"
             android:windowSoftInputMode="adjustPan" />
+
+        <service
+            android:name=".service.InitService"
+            android:enabled="true"
+            android:exported="true" />
     </application>
 
 </manifest>