فهرست منبع

新款手机Android 14 L2型号手机适配

weizhengliang 1 ماه پیش
والد
کامیت
df36ce8930

+ 1 - 0
app/build.gradle

@@ -115,6 +115,7 @@ dependencies {
      * JavaShopAndroid 中间件依赖库
      */
     compile project(':middleware')
+    implementation project(':keepalive')
     /**
      *  constraint-layout布局依赖
      */

+ 6 - 0
app/src/main/AndroidManifest.xml

@@ -11,6 +11,9 @@
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
+    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
     <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY"/>
     <uses-permission android:name="android.permission.VIBRATE"/>
@@ -20,6 +23,9 @@
     <uses-permission android:name="android.permission.READ_CALL_LOG" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+
+    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
 
     <!--  亮屏和解锁权限   -->
     <uses-permission android:name="android.permission.WAKE_LOCK" />

+ 6 - 0
app/src/main/code/com/wdkl/app/ncs/application/Application.kt

@@ -6,6 +6,8 @@ import com.enation.javashop.net.engine.config.NetEngineConfig
 import com.enation.javashop.net.engine.plugin.exception.RestfulExceptionInterceptor
 import com.enation.javashop.utils.base.config.BaseConfig
 import com.wdkl.ncs.android.lib.base.BaseApplication
+import com.wdkl.ncs.keepbackground.work.DaemonEnv
+
 //import me.weishu.reflection.Reflection
 
 /**
@@ -78,6 +80,10 @@ class Application : BaseApplication() {
         NetEngineConfig.init(baseContext)
                 .openLogger()
                 .addNetInterceptor(RestfulExceptionInterceptor())
+
+        if (DaemonEnv.app == null) {
+            DaemonEnv.init(this)
+        }
     }
 
 //    override fun attachBaseContext(base: Context?) {

+ 33 - 24
common/src/main/code/com/wdkl/ncs/android/lib/utils/Util.kt

@@ -4,9 +4,12 @@ import android.annotation.SuppressLint
 import android.content.Context
 import android.os.Build
 import android.os.Environment
+import android.provider.Settings
 import android.telephony.TelephonyManager
+import android.text.TextUtils
 import com.enation.javashop.utils.base.tool.SystemTool
 import com.google.common.base.Strings
+import com.wdkl.ncs.android.lib.base.BaseApplication
 import java.io.File
 import java.io.FileInputStream
 import java.io.FileOutputStream
@@ -15,7 +18,7 @@ import java.util.*
 
 object Util {
 
-    var IMEI = ""
+    var deviceImei = ""
     var UUID_FILE_NAME = "wdkl_uuid.txt"
 
     /*
@@ -23,40 +26,46 @@ object Util {
     */
     @SuppressLint("MissingPermission", "PrivateApi")
     fun getIMEI(context: Context): String {
-        if (Build.VERSION.SDK_INT >= 29) {
-            val UUIDStr = readSD()
-            if (UUIDStr == null || UUIDStr.isEmpty()) { //如果为空或者空字符串就生成UUID创建文件并写入UUID
-                val uuid: String = Date().getTime().toString()
-                writeSD(uuid)
-                IMEI = uuid
-            } else {
-                IMEI = UUIDStr
-            }
-            return IMEI
-        }
-
-        IMEI = SystemTool.getPhoneImei(context)
-        if (Strings.isNullOrEmpty(IMEI)) {
+        deviceImei = SystemTool.getPhoneImei(context)
+        if (TextUtils.isEmpty(deviceImei)) {
             val tm = (context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager)
             try {
                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-                    IMEI = tm.imei
+                    deviceImei = tm.imei
                 } else {
-                    IMEI = tm.deviceId
+                    deviceImei = tm.deviceId
                 }
             } catch (e: Exception) {
+                e.printStackTrace()
             }
 
-            if (Strings.isNullOrEmpty(IMEI)) {
-                IMEI = SystemTool.getLocalMacAddress()
-//                IMEI = "35" + //we make this look like a valid IMEI
-//                        Build.BOARD.length % 10 + Build.BRAND.length % 10 + Build.CPU_ABI.length % 10 + Build.DEVICE.length % 10 + Build.DISPLAY.length % 10 + Build.HOST.length % 10 + Build.ID.length % 10 + Build.MANUFACTURER.length % 10 + Build.MODEL.length % 10 + Build.PRODUCT.length % 10 + Build.TAGS.length % 10 + Build.TYPE.length % 10 + Build.USER.length % 10 //13 digits
+            if (TextUtils.isEmpty(deviceImei)) {
+                //尝试获取序列号
+                deviceImei = getSerialNumber()
             }
         }
-        return IMEI
+
+        //如果还是获取不到id则使用AndroidId
+        if (TextUtils.isEmpty(deviceImei)) {
+            deviceImei = Settings.Secure.getString(BaseApplication.appContext.getContentResolver(), Settings.Secure.ANDROID_ID)
+        }
+
+        return deviceImei
+    }
+
+    fun getSerialNumber(): String {
+        var serial = ""
+        try {
+            val c = Class.forName("android.os.SystemProperties")
+            val get = c.getMethod("get", String::class.java)
+            serial = get.invoke(c, "ro.serialno") as String
+        } catch (e: java.lang.Exception) {
+            e.printStackTrace()
+        }
+        return serial
     }
 
-    fun writeSD(content: String): String? {
+    fun writeSD(content: String): String {
         //文件输出流
         var out: FileOutputStream? = null
         //设置文件路径
@@ -79,7 +88,7 @@ object Util {
         }
     }
 
-    fun readSD(): String? {
+    fun readSD(): String {
         //文件输入流
         var `in`: FileInputStream? = null
         //设置文件路径

+ 1 - 1
gradle/wrapper/gradle-wrapper.properties

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
+distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-4.10.1-all.zip

+ 63 - 24
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHome2Activity.kt

@@ -6,9 +6,11 @@ import android.content.Intent
 import android.content.IntentFilter
 import android.graphics.Color
 import android.net.Uri
+import android.net.wifi.WifiManager
 import android.os.Build
 import android.os.Bundle
 import android.os.CountDownTimer
+import android.os.Environment
 import android.provider.Settings
 import android.telephony.PhoneStateListener
 import android.telephony.SignalStrength
@@ -81,6 +83,8 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
 
     private lateinit var netWorkChangeReceiver: NetWorkChangeReceiver
 
+    private val REQUEST_MANAGER_PERMISSION = 11
+
     override fun onCreate(savedInstanceState: Bundle?) {
         if (!isTaskRoot) {
             finish()
@@ -131,7 +135,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
 -100 to -109 dBm, then it's generally considered poor signal (1 to 2 bars).
 -110 to -120 dBm, then it's generally considered very poor signal (0 to 1 bar)
          */
-        if (netType == NetHelper.NETWORK_4G) {
+        /*if (netType == NetHelper.NETWORK_4G) {
             if (teleManager != null) {
                 teleManager.listen(object : PhoneStateListener() {
                     override fun onSignalStrengthsChanged(signalStrength: SignalStrength) {
@@ -159,7 +163,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
                     }
                 }, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
             }
-        }
+        }*/
 
         requestPermissions()
 
@@ -181,6 +185,19 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
             }
         }
 
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+            if (!Environment.isExternalStorageManager()) {
+                requestManagerPermission()
+            } else {
+                initTcp()
+            }
+        } else {
+            initTcp()
+        }
+
+        //检查网络情况,如果当前打开wifi但是未连接wifi则尝试主动连接wifi(为了解决Android高版本在连接非internet网络时无法自动连接问题)
+        NetworkUtils.checkNetworkConnect(BaseApplication.appContext, true)
+
         initTcp()
 
         //默认使用网络电话
@@ -205,6 +222,32 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         tv_server_ip.text = CommonUtils.getUrl(BaseApplication.appContext)
     }
 
+    private fun requestManagerPermission() {
+        //当系统在11及以上
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+            // 没文件管理权限时申请权限
+            if (!Environment.isExternalStorageManager()) {
+                val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
+                intent.setData(Uri.parse("package:" + getPackageName()))
+                startActivityForResult(intent, REQUEST_MANAGER_PERMISSION)
+            }
+        }
+    }
+
+    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+        super.onActivityResult(requestCode, resultCode, data)
+
+        if (requestCode == REQUEST_MANAGER_PERMISSION && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+            //用户拒绝权限,重新申请
+            if (!Environment.isExternalStorageManager()) {
+                //requestManagerPermission()
+                showMessage("请授予外部存储访问权限")
+            } else {
+                initTcp()
+            }
+        }
+    }
+
     private fun regReceiver() {
 
 //        myMediaButtonReceiver = MyMediaButtonReceiver()
@@ -219,6 +262,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         val intentFilter = IntentFilter()
         // 系统的网络被更改的过滤器
         intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE")
+        intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION)
         netWorkChangeReceiver = NetWorkChangeReceiver()
         registerReceiver(netWorkChangeReceiver, intentFilter)
 
@@ -277,12 +321,12 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
             //JanusConstant.TURN_SERVER = data.turnServer
 
             //成功获取到数据后再启动keepService并连接tcp服务器
-            if (DaemonEnv.app == null && !Strings.isNullOrEmpty(Constants.tcpServer) && !WdKeepAliveService.instanceCreated) {
+            /*if (DaemonEnv.app == null && !Strings.isNullOrEmpty(Constants.tcpServer) && !WdKeepAliveService.instanceCreated) {
                 Log.d(TAG, "开始 WdKeepAliveService")
                 //保活守护进程
                 DaemonEnv.init(this)
                 DaemonEnv.startServiceSafely(this, WdKeepAliveService::class.java)
-            }
+            }*/
 
             presenter.getDeviceVO(Constants.imei)
         }
@@ -298,6 +342,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
                                     Manifest.permission.READ_EXTERNAL_STORAGE,
                                     Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                     Manifest.permission.ACCESS_WIFI_STATE,
+                                    Manifest.permission.ACCESS_FINE_LOCATION,
                                     Manifest.permission.BLUETOOTH,
                                     Manifest.permission.RECORD_AUDIO,
                                     Manifest.permission.CALL_PHONE,
@@ -364,9 +409,9 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
             loadingDialog.dismiss()
             showMessage("本机未注册,请将识别码发给管理员")
             tv_register_status.text = "本机未注册,请将识别码发给管理员。管理员注册本机后请点击注册完成进入"
-            if (DaemonEnv.app != null) {
+            /*if (DaemonEnv.app != null) {
                 SpManager.getInstance().putBoolean(Constants.SYSTEM_REGISTERED, false)
-            }
+            }*/
             tv_register_ok.visibility = View.VISIBLE
             watch_activity_register_layout.visibility = View.VISIBLE
             watch_activity_home_linyout.visibility = View.GONE
@@ -408,8 +453,13 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
             return
         }
 
-        if (DaemonEnv.app != null) {
+        /*if (DaemonEnv.app != null) {
             SpManager.getInstance().putBoolean(Constants.SYSTEM_REGISTERED, true)
+        }*/
+
+        if (!WdKeepAliveService.instanceCreated) {
+            Log.d(TAG, "开始 WdKeepAliveService")
+            DaemonEnv.startServiceSafely(this, WdKeepAliveService::class.java)
         }
 
         presenter.getDeviceSettingData(Constants.partId)
@@ -549,23 +599,6 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
             netOffLoadingDialog.show()
             sip_state_tv.setBackgroundColor(Color.parseColor("#FF0000"))
         })
-
-        //等30秒
-        var waitSeconds = 0;
-        Thread {
-            while (!NettyClient.instance.isConnect()) {
-                Log.w(TAG, "无网络" + waitSeconds)
-                waitSeconds++
-                if (waitSeconds > 30) {
-                    break
-                }
-                Thread.sleep(5000)
-            }
-
-//            if (NettyClient.instance.isConnect()) {
-//                onTcpConnectSuccess()
-//            }
-        }.start()
     }
 
     override fun bindEvent() {
@@ -813,10 +846,16 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
             })
         } else if (messageEvent.tag == Constants.EVENT_TCP_BREAK) {
             onTcpConnectFailed()
+
+            //当tcp连接断开时检查网络连接状态
+            NetworkUtils.checkNetworkConnect(BaseApplication.appContext, false)
         } else if (messageEvent.tag == Constants.EVENT_TCP_CONNECTED) {
             onTcpConnectSuccess()
         } else if (messageEvent.tag == Constants.EVENT_IM_PLAY_DONE || messageEvent.tag == Constants.EVENT_CLEAR_IM || messageEvent.tag == 3) {
             tv_im_count.text = "" + WdKeepAliveService.channelImList.size
+        } else if (messageEvent.tag == Constants.EVENT_WIFI_ENABLE) {
+            //wifi打开时检查连接情况
+            NetworkUtils.checkNetworkConnect(BaseApplication.appContext, false)
         }
     }
 }

+ 26 - 4
home/src/main/code/com/wdkl/ncs/android/component/home/service/WdKeepAliveService.kt

@@ -6,6 +6,7 @@ import android.content.Context
 import android.content.Intent
 import android.content.IntentFilter
 import android.content.pm.PackageManager
+import android.net.wifi.WifiManager
 import android.os.*
 import android.support.v4.media.session.MediaSessionCompat
 import android.text.TextUtils
@@ -37,6 +38,7 @@ import com.wdkl.ncs.android.middleware.model.dos.PartSettingDO
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
 import com.wdkl.ncs.android.middleware.model.vo.WatchContactVO
 import com.wdkl.ncs.android.middleware.tcp.NettyClient
+import com.wdkl.ncs.android.middleware.tcp.TcpClientHandler
 import com.wdkl.ncs.android.middleware.tcp.channel.ChannelImUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel
 import com.wdkl.ncs.android.middleware.tcp.channel.ImUtil
@@ -87,12 +89,24 @@ class WdKeepAliveService : AbsWorkService() {
     private var warningTips = false
     private val keepHandler: Handler = object : Handler(Looper.getMainLooper()) {
         override fun handleMessage(msg: Message) {
-            warningTips = false
+            if (msg.what == 0) {
+                warningTips = false
+            } else if (msg.what == 1) {
+                if (!TcpClientHandler.getConnected()) {
+                    //1分钟后还是未连接上服务器,直接重启app
+                    Util.wakeUpAndUnlock()
+                    AppUtils.restartApp()
+                }
+            }
         }
     }
 
     override fun startWork() {
-        EventBus.getDefault().register(this)
+        if (!EventBus.getDefault().isRegistered(this)) {
+            EventBus.getDefault().register(this)
+        }
+
+        instanceCreated = true
 
         //全局调用一次
         Thread {
@@ -101,7 +115,6 @@ class WdKeepAliveService : AbsWorkService() {
                 Thread.sleep(1000)
             }
             HandleTcpConnect.instance.tcpInitConnect()
-            instanceCreated = true
         }.start()
 
         //播放一个短音频来获取音频焦点,之后才能监听到耳机按键
@@ -112,6 +125,7 @@ class WdKeepAliveService : AbsWorkService() {
         val intentFilter = IntentFilter()
         // 系统的网络被更改的过滤器
         intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE")
+        intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION)
         netWorkChangeReceiver = NetWorkChangeReceiver()
         registerReceiver(netWorkChangeReceiver, intentFilter)
 
@@ -209,7 +223,9 @@ class WdKeepAliveService : AbsWorkService() {
 
         SoundPoolManager.getInstance().release()
         SpeechUtil.getInstance().release()
-        EventBus.getDefault().unregister(this)
+        if (EventBus.getDefault().isRegistered(this)) {
+            EventBus.getDefault().unregister(this)
+        }
         if (netWorkChangeReceiver != null) {
             try {
                 unregisterReceiver(netWorkChangeReceiver)
@@ -767,6 +783,12 @@ class WdKeepAliveService : AbsWorkService() {
                 Log.w(TAG, "EVENT TCP BREAK")
                 //MediaPlayHelper.getInstance().playResMusic(R.raw.tcp_disconnect, 1.0f, false)
                 //RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.tcp_disconnect, false)
+
+                //当tcp连接断开时检查网络连接状态
+                NetworkUtils.checkNetworkConnect(BaseApplication.appContext, true)
+
+                keepHandler.removeMessages(1)
+                keepHandler.sendEmptyMessageDelayed(1, 60000)
             }
 
             //留言播放完成

+ 11 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/settingconfig/SettingConfig.java

@@ -26,6 +26,9 @@ public class SettingConfig {
 
     private static final String KEY_SP_TRANSFER_CALL = "KEY_SP_TRANSFER_CALL";
 
+    //wifi ssid
+    private static final String KEY_SP_WIFI_SSID = "KEY_SP_WIFI_SSID";
+
     public static int getTransCall(Context context) {
         return getSP(context).getInt(KEY_SP_TRANSFER_CALL, -1);
     }
@@ -34,6 +37,14 @@ public class SettingConfig {
         getEditor(context).putInt(KEY_SP_TRANSFER_CALL, value).apply();
     }
 
+    public static String getWifiSSID(Context context) {
+        return getSP(context).getString(KEY_SP_WIFI_SSID, "");
+    }
+
+    public static void setWifiSSID(Context context, String ssid) {
+        getEditor(context).putString(KEY_SP_WIFI_SSID, ssid).apply();
+    }
+
     /**
      * 获取转发时间
      *

+ 65 - 47
home/src/main/code/com/wdkl/ncs/android/component/home/util/NetWorkChangeReceiver.kt

@@ -6,65 +6,83 @@ import android.content.Intent
 import android.net.ConnectivityManager
 import android.net.Network
 import android.net.NetworkInfo
+import android.net.wifi.WifiManager
 import android.os.Build
 import android.util.Log
 import com.wdkl.ncs.android.component.home.service.WdKeepAliveService
+import com.wdkl.ncs.android.lib.vo.MessageEvent
+import com.wdkl.ncs.android.middleware.common.Constants
 import com.wdkl.ncs.android.middleware.tcp.NettyClient
+import org.greenrobot.eventbus.EventBus
 
 class NetWorkChangeReceiver : BroadcastReceiver() {
     val TAG = NetWorkChangeReceiver::class.simpleName
 
-    override fun onReceive(context: Context?, intent: Intent?) {
-        // API版本23以上使用
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-            // 链接管理器(获取系统链接服务)
-            val manager: ConnectivityManager = context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
-            //获取所有网络连接的信息
-            val networks: Array<Network> = manager.allNetworks
-            var networkInfo: NetworkInfo? = null
-            //通过循环将网络信息逐个取出来
-            for (network in networks) {
-                networkInfo = manager.getNetworkInfo(network)
+    override fun onReceive(context: Context, intent: Intent) {
+        val action = intent.getAction()
+        if (WifiManager.WIFI_STATE_CHANGED_ACTION == action) {
+            val wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1)
+            if (wifiState == WifiManager.WIFI_STATE_ENABLED) {
+                //打开wifi
+                Log.e(TAG, "打开wifi...")
+                EventBus.getDefault().post(MessageEvent("wifi", Constants.EVENT_WIFI_ENABLE))
             }
+        } else {
+            // API版本23以上使用
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+                // 链接管理器(获取系统链接服务)
+                val manager: ConnectivityManager =
+                    context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+                //获取所有网络连接的信息
+                val networks: Array<Network> = manager.allNetworks
+                var networkInfo: NetworkInfo? = null
+                //通过循环将网络信息逐个取出来
+                for (network in networks) {
+                    networkInfo = manager.getNetworkInfo(network)
+                }
 
-            // 判断网络是否可用
-            if (null != networkInfo && networkInfo.isAvailable) {
-                //当前网络可用
-            }
-            // 判断网络是否链接
-            if (null != networkInfo && networkInfo.isConnected) {
-                //当前网络已经链接
-                if (!NettyClient.instance.isConnect() && WdKeepAliveService.instanceCreated){
-                    Log.w(TAG,"TCP.进入重新连接")
-                    HandleTcpConnect.instance.tcpReConnect()
+                // 判断网络是否可用
+                if (null != networkInfo && networkInfo.isAvailable) {
+                    //当前网络可用
                 }
-            }
-            // 判断网络是否正在链接
-            if (null != networkInfo && networkInfo.isConnectedOrConnecting) {
-                //当前网络正在链接
-            }
-            // 判断网络链接失败
-            if (null != networkInfo && networkInfo.isFailover) {
-                //当前网络链接失败
-            }
-            // 判断网络是否赞漫游
-            if (null != networkInfo && networkInfo.isRoaming) {
-                //当前处于漫游网络
-            }
-        } else { // API版本23以下使用
-            // 链接管理器(获取系统链接服务)
-            val manager: ConnectivityManager = context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+                // 判断网络是否链接
+                if (null != networkInfo && networkInfo.isConnected) {
+                    //当前网络已经链接
+                    if (!NettyClient.instance.isConnect() && WdKeepAliveService.instanceCreated) {
+                        Log.w(TAG, "TCP.进入重新连接")
+                        HandleTcpConnect.instance.tcpReConnect()
+                    }
+                }
+                // 判断网络是否正在链接
+                if (null != networkInfo && networkInfo.isConnectedOrConnecting) {
+                    //当前网络正在链接
+                }
+                // 判断网络链接失败
+                if (null != networkInfo && networkInfo.isFailover) {
+                    //当前网络链接失败
+                }
+                // 判断网络是否赞漫游
+                if (null != networkInfo && networkInfo.isRoaming) {
+                    //当前处于漫游网络
+                }
+            } else { // API版本23以下使用
+                // 链接管理器(获取系统链接服务)
+                val manager: ConnectivityManager =
+                    context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
 
-            //获取ConnectivityManager对象对应的NetworkInfo对象
-            //获取WIFI连接的信息
-            val wifiNetworkInfo: NetworkInfo? = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
-            //获取移动数据连接的信息
-            val dataNetworkInfo: NetworkInfo? = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
-            if ((wifiNetworkInfo!=null && wifiNetworkInfo.isConnected) || (dataNetworkInfo!=null&&dataNetworkInfo.isConnected)) {
-                //WIFI已连接 或 移动数据已连接
-                Log.w(TAG,"TCP.进入重新连接")
-                if (!NettyClient.instance.isConnect()){
-                    HandleTcpConnect.instance.tcpReConnect()
+                //获取ConnectivityManager对象对应的NetworkInfo对象
+                //获取WIFI连接的信息
+                val wifiNetworkInfo: NetworkInfo? =
+                    manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
+                //获取移动数据连接的信息
+                val dataNetworkInfo: NetworkInfo? =
+                    manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
+                if ((wifiNetworkInfo != null && wifiNetworkInfo.isConnected) || (dataNetworkInfo != null && dataNetworkInfo.isConnected)) {
+                    //WIFI已连接 或 移动数据已连接
+                    Log.w(TAG, "TCP.进入重新连接")
+                    if (!NettyClient.instance.isConnect()) {
+                        HandleTcpConnect.instance.tcpReConnect()
+                    }
                 }
             }
         }

+ 457 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/util/NetworkUtils.java

@@ -0,0 +1,457 @@
+package com.wdkl.ncs.android.component.home.util;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.NetworkRequest;
+import android.net.NetworkSpecifier;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.net.wifi.WifiNetworkSpecifier;
+import android.util.Log;
+
+import com.wdkl.ncs.android.middleware.tcp.TcpClientHandler;
+
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@SuppressLint("NewApi")
+public class NetworkUtils {
+
+    private static final String TAG = "NetworkUtils";
+
+    /**
+     * Indicates this network uses a Cellular transport.
+     */
+    public static final int TRANSPORT_CELLULAR = 0;
+
+    /**
+     * Indicates this network uses a Wi-Fi transport.
+     */
+    public static final int TRANSPORT_WIFI = 1;
+
+    /**
+     * Indicates this network uses a Bluetooth transport.
+     */
+    public static final int TRANSPORT_BLUETOOTH = 2;
+
+    /**
+     * Indicates this network uses an Ethernet transport.
+     */
+    public static final int TRANSPORT_ETHERNET = 3;
+
+    /**
+     * Indicates this network uses a VPN transport.
+     */
+    public static final int TRANSPORT_VPN = 4;
+
+    /**
+     * Indicates this network uses a Wi-Fi Aware transport.
+     */
+    public static final int TRANSPORT_WIFI_AWARE = 5;
+
+    /**
+     * Indicates this network uses a LoWPAN transport.
+     */
+    public static final int TRANSPORT_LOWPAN = 6;
+
+    /**
+     * Indicates this network uses a Test-only virtual interface as a transport.
+     * @hide
+     */
+    public static final int TRANSPORT_TEST = 7;
+
+    /**
+     * Indicates this network uses a USB transport.
+     */
+    public static final int TRANSPORT_USB = 8;
+
+
+    private static boolean checkNetConnection = false;
+    private static boolean connected = false;
+
+    private final static ExecutorService threadPool = Executors.newSingleThreadExecutor();
+
+    /**
+     * >= Android 10(Q版本)推荐
+     *
+     * 当前使用MOBILE流量上网
+     */
+    public static boolean isMobileNetwork(Context context) {
+        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+
+        Network network = cm.getActiveNetwork();
+        if (null == network) {
+            return false;
+        }
+
+        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);
+        if (null == capabilities) {
+            return false;
+        }
+        return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
+                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
+    }
+
+
+    /**
+     * >= Android 10(Q版本)推荐
+     *
+     * 当前使用WIFI上网
+     */
+
+    public static boolean isWifiNetwork(Context context) {
+        ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
+        Network network = cm.getActiveNetwork();
+        if (null == network) {
+            return false;
+        }
+        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);
+        if (null == capabilities) {
+            return false;
+        }
+        return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
+                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
+    }
+
+
+    /**
+     *  >= Android 10(Q版本)推荐
+     *
+     * 当前使用以太网上网
+     */
+    public static boolean isEthernetNetwork(Context context) {
+        ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
+        Network network = cm.getActiveNetwork();
+        if (null == network) {
+            return false;
+        }
+        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);
+        if (null == capabilities) {
+            return false;
+        }
+        return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)
+                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
+    }
+
+
+
+    /**
+     * >= Android 10(Q版本)推荐
+     *
+     * NetworkCapabilities.NET_CAPABILITY_INTERNET,表示此网络应该(maybe)能够访问internet
+     *
+     *  判断当前网络可以正常上网
+     *  表示此连接此网络并且能成功上网。  例如,对于具有NET_CAPABILITY_INTERNET的网络,这意味着已成功检测到INTERNET连接。
+     */
+    public static boolean isConnectedAvailableNetwork(Context context) {
+        ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
+        Network network = cm.getActiveNetwork();
+        if (null == network) {
+            return false;
+        }
+        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);
+        if (null == capabilities) {
+            return false;
+        }
+        return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
+    }
+
+
+    /**
+     * >= Android 10(Q版本)推荐
+     *
+     * 获取成功上网的网络类型
+     * value = {
+     *    TRANSPORT_CELLULAR,   0 表示此网络使用蜂窝传输。
+     *    TRANSPORT_WIFI,       1 表示此网络使用Wi-Fi传输。
+     *    TRANSPORT_BLUETOOTH,  2 表示此网络使用蓝牙传输。
+     *    TRANSPORT_ETHERNET,   3 表示此网络使用以太网传输。
+     *    TRANSPORT_VPN,        4 表示此网络使用VPN传输。
+     *    TRANSPORT_WIFI_AWARE, 5 表示此网络使用Wi-Fi感知传输。
+     *    TRANSPORT_LOWPAN,     6 表示此网络使用LoWPAN传输。
+     *    TRANSPORT_TEST,       7 指示此网络使用仅限测试的虚拟接口作为传输。
+     *    TRANSPORT_USB,        8 表示此网络使用USB传输
+     * }
+     */
+    public static int getConnectedNetworkType(Context context) {
+        ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
+        Network network = cm.getActiveNetwork();
+        if (null == network) {
+            return -1;
+        }
+        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);
+        if (null == capabilities) {
+            return -1;
+        }
+        if (capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
+            if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
+                return NetworkCapabilities.TRANSPORT_CELLULAR;
+            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
+                return NetworkCapabilities.TRANSPORT_WIFI;
+            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH)) {
+                return NetworkCapabilities.TRANSPORT_BLUETOOTH;
+            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
+                return NetworkCapabilities.TRANSPORT_ETHERNET;
+            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
+                return NetworkCapabilities.TRANSPORT_VPN;
+            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI_AWARE)) {
+                return NetworkCapabilities.TRANSPORT_WIFI_AWARE;
+            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_LOWPAN)) {
+                return NetworkCapabilities.TRANSPORT_LOWPAN;
+            } /*else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_USB)) {
+                return NetworkCapabilities.TRANSPORT_USB;
+            }*/
+        }
+        return -1;
+    }
+
+    /**
+     * 判断当前是否有网络连接,但是如果该连接的网络无法上网,也会返回true
+     */
+    public static boolean isNetConnection(Context context) {
+        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
+
+        if (networkInfo != null && networkInfo.isConnected()) {
+            return true;
+        }
+
+        return false;
+    }
+
+    public static int getNetworkInfoType(Context context) {
+        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
+
+        if (networkInfo != null) {
+            return networkInfo.getType();
+        }
+
+        return -1;
+    }
+
+
+    ///////////////////////////**********WIFI***********/////////////////////////
+    public static boolean getWifiStatus(Context context){
+        //从系统服务中获取无线网络管理器
+        WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+        return wm.isWifiEnabled();
+    }
+
+    public static List<WifiConfiguration> getConfiguredWifiNetworks(Context context) {
+        WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+        return wm.getConfiguredNetworks();
+    }
+
+    public static String getConnectWifi(Context context) {
+        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+        if (wifiManager != null) {
+            WifiInfo info = wifiManager.getConnectionInfo();
+            if (info != null) {
+                return info.getSSID();
+            }
+        }
+
+        return "";
+    }
+
+
+    //连接wifi,优先preferSSID
+    public static boolean connectWifi(Context context, String preferSSID) {
+        try {
+            WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+            //扫描wifi
+            List<ScanResult> scanResults = wifiManager.getScanResults();
+            //获取已保存的wifi列表
+            List<WifiConfiguration> wifiConfigs = wifiManager.getConfiguredNetworks();
+
+            if (scanResults != null && wifiConfigs != null) {
+                //优先连接原来最后一次连接的网络
+                /*if (!TextUtils.isEmpty(preferSSID)) {
+                    for (WifiConfiguration wifiConfiguration: wifiConfigs) {
+                        Log.e(TAG, "preferSSID: " + preferSSID + ", wifi ssid: " + wifiConfiguration.SSID);
+                        if (preferSSID.equals(wifiConfiguration.SSID)) {
+                            boolean connect = wifiManager.enableNetwork(wifiConfiguration.networkId, true);
+                            Log.e(TAG, "connect prefer wifi: " + connect);
+                            if (connect) {
+                                return;
+                            }
+                            break;
+                        }
+                    }
+                }*/
+
+                for (WifiConfiguration wifiConfiguration: wifiConfigs) {
+                    for (ScanResult scanResult : scanResults) {
+                        Log.e(TAG, "wifiConfig: ssid=" + wifiConfiguration.SSID + ", p=" + wifiConfiguration.preSharedKey
+                                + "------scanResult: ssid=" + scanResult.SSID + ", leve=" + scanResult.level + "dBm");
+                        String scanSSID = "\"" + scanResult.SSID + "\"";
+                        if (scanSSID.equals(wifiConfiguration.SSID) && scanResult.level > -85) {
+                            //连接WiFi,信号强度大于-85dBm才认为WiFi可用
+                            boolean connect = wifiManager.enableNetwork(wifiConfiguration.networkId, true);
+                            Log.e(TAG, "connect wifi: " + connect);
+                            if (connect) {
+                                return true;
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return false;
+    }
+
+    public static WifiConfiguration getPreWifiConfig(Context context) {
+        try {
+            WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+            //扫描wifi
+            List<ScanResult> scanResults = wifiManager.getScanResults();
+            //获取已保存的wifi列表
+            List<WifiConfiguration> wifiConfigs = wifiManager.getConfiguredNetworks();
+
+            if (scanResults != null && wifiConfigs != null) {
+                for (WifiConfiguration wifiConfiguration : wifiConfigs) {
+                    for (ScanResult scanResult : scanResults) {
+                        Log.e(TAG, "get prefered wifiConfig: ssid=" + wifiConfiguration.SSID + ", p=" + wifiConfiguration.preSharedKey
+                                + "------scanResult: ssid=" + scanResult.SSID + ", leve=" + scanResult.level + "dBm");
+                        String scanSSID = "\"" + scanResult.SSID + "\"";
+                        if (scanSSID.equals(wifiConfiguration.SSID) && scanResult.level > -85) {
+                            //连接WiFi,信号强度大于-85dBm才认为WiFi可用
+                            return  wifiConfiguration;
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    public static void connectByP2P(Context context, ConnectivityManager.NetworkCallback callback) {
+        WifiConfiguration wifiConfiguration = getPreWifiConfig(context);
+        if (wifiConfiguration != null) {
+            NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
+                    .setSsid(wifiConfiguration.SSID)
+                    .setWpa2Passphrase(wifiConfiguration.preSharedKey)
+                    .build();
+            NetworkRequest request = new NetworkRequest.Builder()
+                    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+                    .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+                    .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
+                    .addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
+                    .setNetworkSpecifier(specifier)
+                    .build();
+
+            ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+            connectivityManager.requestNetwork(request, callback);
+        }
+    }
+
+    public static void checkNetworkConnect(final Context context, final boolean forceConnect) {
+        threadPool.execute(() -> {
+            if (checkNetConnection) {
+                Log.e(TAG, "正在检查网络连接状态...");
+            } else {
+                checkNetConnection = true;
+                connected = false;
+                //判断是否开启了wifi,如开启了则尝试自动连接
+                boolean wifiState = NetworkUtils.getWifiStatus(context);
+                if (!wifiState) {
+                    return;
+                }
+
+                /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+                    try {
+                        ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
+                            @Override
+                            public void onAvailable(@NonNull Network network) {
+                                Log.e(TAG, "connectByP2P==> onAvailable");
+                                connected = true;
+                                super.onAvailable(network);
+                            }
+
+                            @Override
+                            public void onUnavailable() {
+                                Log.e(TAG, "connectByP2P==> onUnavailable");
+                                connected = false;
+                                super.onUnavailable();
+                            }
+                        };
+
+                        connectByP2P(context, networkCallback);
+
+                        Thread.sleep(15000);
+
+                        Log.e(TAG, "wifi connect: " + connected + ", tcp connect: " + TcpClientHandler.getConnected());
+                        if (!connected && !TcpClientHandler.getConnected()) {
+                            checkNetworkConnect(context, forceConnect);
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+
+                    checkNetConnection = false;
+                } else {*/
+                    if (forceConnect) {
+                        //wifi扫描需要时间,延迟3s后再连接
+                        try {
+                            Thread.sleep(3000);
+                        } catch (Exception e) {
+                            //
+                        }
+                        connected = NetworkUtils.connectWifi(context, "");
+
+                        Log.e(TAG, "force connect wifi...wifiState: " + wifiState + ", connected: " + connected);
+                    } else {
+                        if (NetworkUtils.isNetConnection(context)) {
+                            //网络连接正常,返回
+                            connected = true;
+                            Log.e(TAG, "network available...");
+
+                            /*if (NetworkUtils.getNetworkInfoType(context) == ConnectivityManager.TYPE_WIFI) {
+                                String wifiSSID = NetworkUtils.getConnectWifi(context);
+                                SettingConfig.setWifiSSID(context, wifiSSID);
+                            }*/
+                        } else {
+                            //wifi扫描需要时间,延迟3s后再连接
+                            try {
+                                Thread.sleep(3000);
+                            } catch (Exception e) {
+                                //
+                            }
+                            connected = NetworkUtils.connectWifi(context, "");
+
+                            Log.e(TAG, "network unavailable...wifiState: " + wifiState + ", connected: " + connected);
+                        }
+                    }
+
+                    checkNetConnection = false;
+
+                    if (!connected && !TcpClientHandler.getConnected()) {
+                        Log.e(TAG, "wifi not connect or disconnect server, wait 10s try again...");
+                        try {
+                            Thread.sleep(15000);
+                        } catch (Exception e) {
+                            //
+                        }
+
+                        checkNetworkConnect(context, forceConnect);
+                    }
+                //}
+            }
+        });
+    }
+}

+ 2 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/util/ServerConfigDialogHelper.java

@@ -133,8 +133,8 @@ public class ServerConfigDialogHelper {
             Window window = callDialog.getWindow();
             window.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
             WindowManager.LayoutParams lp = window.getAttributes();
-            lp.width = 480;
-            lp.height = 720;
+            lp.width = WindowManager.LayoutParams.MATCH_PARENT;
+            lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
             lp.gravity = Gravity.CENTER;
             window.setAttributes(lp);
 

+ 2 - 2
home/src/main/res/layout/server_config_dialog_lay.xml

@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="wrap_content">
 
     <!--密码框-->
     <LinearLayout
         android:id="@+id/ll_password"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
+        android:layout_height="wrap_content"
         android:gravity="center"
         android:orientation="vertical">
 

+ 2 - 1
keepalive/src/main/java/com/wdkl/ncs/keepbackground/watch/WatchDogService.java

@@ -52,12 +52,13 @@ public class WatchDogService extends Service {
     @Override
     public void onCreate() {
         super.onCreate();
+        ForegroundNotificationUtils.startForegroundNotification(this);
+
         isCanStartWatchDog = WatchProcessPrefHelper.getIsStartDaemon(this);
         if (!isCanStartWatchDog){
             stopSelf();
         }
         startRegisterReceiver();
-        ForegroundNotificationUtils.startForegroundNotification(this);
     }
 
     @Override

+ 2 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constants.kt

@@ -74,6 +74,8 @@ class Constants {
         const val EVENT_TCP_BREAK = 0x15 //tcp掉线
         const val EVENT_TCP_CONNECTED = 0x115 //tcp上线
 
+        const val EVENT_WIFI_ENABLE = 0x117
+
         const val EVENT_SOS_POLL = 0x55
         const val EVENT_RTC_STATE = 0x66
         const val EVENT_USER_CHANGE = 0x77