增加室内整理工具扫描业务

This commit is contained in:
qiji4215 2023-06-25 16:44:40 +08:00
parent d0b85d649a
commit a970ca1992
10 changed files with 88 additions and 63 deletions

View File

@ -65,6 +65,7 @@
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".ui.activity.map.MainActivity" android:name=".ui.activity.map.MainActivity"
android:exported="false" android:exported="false"
@ -73,10 +74,13 @@
android:theme="@style/Theme.OMQualityInspection" /> android:theme="@style/Theme.OMQualityInspection" />
<activity <activity
android:name=".ui.activity.scan.QRCodeActivity" android:name=".ui.activity.scan.QrCodeActivity"
android:theme="@style/Theme.OMQualityInspection"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
<activity <activity
android:name=".ui.activity.scan.QRCodeResultActivity" android:name=".ui.activity.scan.QRCodeResultActivity"
android:theme="@style/Theme.OMQualityInspection"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
<meta-data <meta-data

View File

@ -48,7 +48,7 @@ class Constant {
/** /**
* 室内整理工具IP * 室内整理工具IP
*/ */
lateinit var INDOOR_IPS: String lateinit var INDOOR_IP: String
const val DEBUG = true const val DEBUG = true

View File

@ -31,5 +31,5 @@ interface NetworkService {
/** /**
* 连接室内整理工具 * 连接室内整理工具
*/ */
suspend fun connectIndoorTools(url: String): NetResult<DefaultResponse<QRCodeBean>> suspend fun connectIndoorTools(url: String): NetResult<QRCodeBean>
} }

View File

@ -77,11 +77,11 @@ class NetworkServiceImpl @Inject constructor(
} }
} }
override suspend fun connectIndoorTools(url: String): NetResult<DefaultResponse<QRCodeBean>> = override suspend fun connectIndoorTools(url: String): NetResult<QRCodeBean> =
//在IO线程中运行 //在IO线程中运行
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
return@withContext try { return@withContext try {
val result = netApi.retrofitConnectIndoorTools(url) val result = netApi.retrofitConnectIndoorTools(url = url)
if (result.isSuccessful) { if (result.isSuccessful) {
if (result.code() == 200) { if (result.code() == 200) {
NetResult.Success(result.body()) NetResult.Success(result.body())

View File

@ -68,10 +68,11 @@ interface RetrofitNetworkServiceAPI {
/** /**
* 获取离线地图城市列表 * 连接室内整理工具
*/ */
@GET("/drdc/MapDownload/maplist") @Streaming
suspend fun retrofitConnectIndoorTools(@Url url: String): Response<DefaultResponse<QRCodeBean>> @GET
suspend fun retrofitConnectIndoorTools(@Url url: String): Response<QRCodeBean>
@Headers("Content-Type: application/json") @Headers("Content-Type: application/json")
@POST("/devcp/uploadSceneProblem") @POST("/devcp/uploadSceneProblem")

View File

@ -6,11 +6,13 @@ import android.widget.Toast
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.navinfo.omqs.Constant
import com.navinfo.omqs.bean.QRCodeBean import com.navinfo.omqs.bean.QRCodeBean
import com.navinfo.omqs.bean.SysUserBean import com.navinfo.omqs.bean.SysUserBean
import com.navinfo.omqs.http.DefaultResponse import com.navinfo.omqs.http.DefaultResponse
import com.navinfo.omqs.http.NetResult import com.navinfo.omqs.http.NetResult
import com.navinfo.omqs.http.NetworkService import com.navinfo.omqs.http.NetworkService
import com.navinfo.omqs.ui.activity.login.LoginStatus
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
@ -19,54 +21,28 @@ import kotlinx.coroutines.withContext
import java.io.IOException import java.io.IOException
import javax.inject.Inject import javax.inject.Inject
enum class QRCodeStatus { enum class QrCodeStatus {
/**
* 访问服务器登陆中
*/
LOGIN_STATUS_NET_LOADING,
/**
* 访问离线地图列表
*/
LOGIN_STATUS_NET_OFFLINE_MAP,
/**
* 初始化文件夹
*/
LOGIN_STATUS_FOLDER_INIT,
/**
* 创建文件夹失败
*/
LOGIN_STATUS_FOLDER_FAILURE,
/** /**
* 网络访问失败 * 网络访问失败
*/ */
LOGIN_STATUS_NET_FAILURE, QR_CODE_STATUS_NET_FAILURE,
/** /**
* 成功 * 成功
*/ */
LOGIN_STATUS_SUCCESS, QR_CODE_STATUS_SUCCESS
/**
* 取消
*/
LOGIN_STATUS_CANCEL,
} }
@HiltViewModel @HiltViewModel
class QRCodeViewModel @Inject constructor( class QrCodeViewModel @Inject constructor(
private val networkService: NetworkService private val networkService: NetworkService
) : ViewModel() { ) : ViewModel() {
//用户信息 //用户信息
val qrCodeBean: MutableLiveData<QRCodeBean> = MutableLiveData() val qrCodeBean: MutableLiveData<QRCodeBean> = MutableLiveData()
//是不是连接成功 //是不是连接成功
val qrCodeStatus: MutableLiveData<QRCodeStatus> = MutableLiveData() val qrCodeStatus: MutableLiveData<QrCodeStatus> = MutableLiveData()
var jobQRCodeStatus: Job? = null;
init { init {
qrCodeBean.value = QRCodeBean() qrCodeBean.value = QRCodeBean()
@ -98,12 +74,25 @@ class QRCodeViewModel @Inject constructor(
val url = "http://$ipTemp:8080/sensor/service/keepalive" val url = "http://$ipTemp:8080/sensor/service/keepalive"
when (val result = networkService.connectIndoorTools(url)) { when (val result = networkService.connectIndoorTools(url)) {
is NetResult.Success<*> -> { is NetResult.Success<*> -> {
if (result.data != null) { if (result.data != null) {
try { try {
val defaultUserResponse =
result.data as DefaultResponse<SysUserBean>
if (defaultUserResponse.success) {
val defaultUserResponse = result.data as QRCodeBean
if (defaultUserResponse.errcode==0) {
Constant.INDOOR_IP = ipTemp
qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_SUCCESS)
withContext(Dispatchers.Main) {
Toast.makeText(
context,
"连接室内整理工具成功。",
Toast.LENGTH_LONG
).show()
}
} else { } else {
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText( Toast.makeText(
@ -116,6 +105,13 @@ class QRCodeViewModel @Inject constructor(
} }
} catch (e: IOException) { } catch (e: IOException) {
withContext(Dispatchers.Main) {
Toast.makeText(
context,
"${e.message}",
Toast.LENGTH_SHORT
).show()
}
} }
} }
} }
@ -129,6 +125,7 @@ class QRCodeViewModel @Inject constructor(
) )
.show() .show()
} }
qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_NET_FAILURE)
} }
is NetResult.Failure<*> -> { is NetResult.Failure<*> -> {
@ -140,6 +137,7 @@ class QRCodeViewModel @Inject constructor(
) )
.show() .show()
} }
qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_NET_FAILURE)
} }
else -> {} else -> {}
@ -148,4 +146,9 @@ class QRCodeViewModel @Inject constructor(
} }
} }
} }
override fun onCleared() {
super.onCleared()
}
} }

View File

@ -1,39 +1,35 @@
package com.navinfo.omqs.ui.activity.scan package com.navinfo.omqs.ui.activity.scan
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Rect import android.graphics.Rect
import android.graphics.RectF import android.graphics.RectF
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.camera.core.ImageCapture import androidx.camera.core.ImageCapture
import androidx.camera.view.LifecycleCameraController import androidx.camera.view.LifecycleCameraController
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
import androidx.lifecycle.viewModelScope
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.ActivityQrCodeBinding import com.navinfo.omqs.databinding.ActivityQrCodeBinding
import com.navinfo.omqs.ui.activity.login.LoginViewModel import com.navinfo.omqs.ui.activity.BaseActivity
import com.navinfo.omqs.ui.listener.QRCodeAnalyser import com.navinfo.omqs.ui.listener.QRCodeAnalyser
import kotlinx.coroutines.CoroutineScope import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.util.concurrent.ExecutorService import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors import java.util.concurrent.Executors
import androidx.lifecycle.Observer
import com.navinfo.omqs.ui.activity.login.LoginStatus
/** /**
* date:2021/6/18 * date:2023/6/18
* author:zhangteng * author:qj
* description:二维码扫描 * description:二维码扫描
*/ */
class QRCodeActivity : AppCompatActivity() { @AndroidEntryPoint
class QrCodeActivity : BaseActivity() {
private lateinit var binding: ActivityQrCodeBinding private lateinit var binding: ActivityQrCodeBinding
private lateinit var lifecycleCameraController: LifecycleCameraController private lateinit var lifecycleCameraController: LifecycleCameraController
private lateinit var cameraExecutor: ExecutorService private lateinit var cameraExecutor: ExecutorService
private val viewModel by viewModels<QRCodeViewModel>() private val viewModel by viewModels<QrCodeViewModel>()
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -43,9 +39,29 @@ class QRCodeActivity : AppCompatActivity() {
binding.lifecycleOwner = this binding.lifecycleOwner = this
binding.activity = this binding.activity = this
initView()
initController() initController()
} }
private fun initView() {
//登录校验,初始化成功
viewModel.qrCodeStatus.observe(this, qrCodeObserve)
}
/*
* 监听扫描结果
* */
private val qrCodeObserve = Observer<QrCodeStatus> {
when (it) {
QrCodeStatus.QR_CODE_STATUS_SUCCESS -> {
finish()
}
QrCodeStatus.QR_CODE_STATUS_NET_FAILURE -> {
}
}
}
@SuppressLint("ClickableViewAccessibility", "UnsafeOptInUsageError") @SuppressLint("ClickableViewAccessibility", "UnsafeOptInUsageError")
private fun initController() { private fun initController() {
cameraExecutor = Executors.newSingleThreadExecutor() cameraExecutor = Executors.newSingleThreadExecutor()
@ -92,15 +108,18 @@ class QRCodeActivity : AppCompatActivity() {
} }
private fun intentToResult(result: String) { private fun intentToResult(result: String) {
viewModel.connect(this, result)
Log.e("qj", "QRCodeActivity === $result") Log.e("qj", "QRCodeActivity === $result")
viewModel.connect(this, result)
/* val intent = Intent(this, QRCodeResultActivity::class.java) /* val intent = Intent(this, QRCodeResultActivity::class.java)
intent.putExtra(QRCodeResultActivity.RESULT_KEY, result) intent.putExtra(QRCodeResultActivity.RESULT_KEY, result)
startActivity(intent) startActivity(intent)
finish()*/ finish()*/
} }
private var scaleX = 0f private var scaleX = 0f
private var scaleY = 0f private var scaleY = 0f

View File

@ -22,7 +22,7 @@ import com.navinfo.omqs.db.ImportOMDBHelper
import com.navinfo.omqs.hilt.ImportOMDBHiltFactory import com.navinfo.omqs.hilt.ImportOMDBHiltFactory
import com.navinfo.omqs.tools.CoroutineUtils import com.navinfo.omqs.tools.CoroutineUtils
import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.activity.scan.QRCodeActivity import com.navinfo.omqs.ui.activity.scan.QrCodeActivity
import com.permissionx.guolindev.PermissionX import com.permissionx.guolindev.PermissionX
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.oscim.core.GeoPoint import org.oscim.core.GeoPoint
@ -142,7 +142,7 @@ class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) :
} }
private fun intentTOQRCode() { private fun intentTOQRCode() {
var intent = Intent(context, QRCodeActivity::class.java); var intent = Intent(context, QrCodeActivity::class.java);
startActivity(intent) startActivity(intent)
} }

View File

@ -7,15 +7,13 @@
<data> <data>
<import type="android.view.View" />
<variable <variable
name="activity" name="activity"
type="com.navinfo.omqs.ui.activity.scan.QRCodeActivity" /> type="com.navinfo.omqs.ui.activity.scan.QrCodeActivity" />
<variable <variable
name="qrCodeModel" name="qrCodeModel"
type="com.navinfo.omqs.ui.activity.scan.QRCodeViewModel" /> type="com.navinfo.omqs.ui.activity.scan.QrCodeViewModel" />
</data> </data>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout