diff --git a/app/build.gradle b/app/build.gradle index 1130fbe..606af48 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -123,4 +123,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //大图 implementation 'com.github.chrisbanes:PhotoView:2.3.0' + //扫码 + implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 1130fbe..606af48 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -123,4 +123,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //大图 implementation 'com.github.chrisbanes:PhotoView:2.3.0' + //扫码 + implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 78c5c03..5c6a86b 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -13,7 +13,7 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody -import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import java.io.File @@ -102,7 +102,7 @@ * 上传图片 */ suspend fun uploadImage(image: File): String { - val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val requestBody = image.asRequestBody("image/png".toMediaTypeOrNull()) val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(AuthenticationHelper.token!!, imagePart) } diff --git a/app/build.gradle b/app/build.gradle index 1130fbe..606af48 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -123,4 +123,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //大图 implementation 'com.github.chrisbanes:PhotoView:2.3.0' + //扫码 + implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 78c5c03..5c6a86b 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -13,7 +13,7 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody -import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import java.io.File @@ -102,7 +102,7 @@ * 上传图片 */ suspend fun uploadImage(image: File): String { - val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val requestBody = image.asRequestBody("image/png".toMediaTypeOrNull()) val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(AuthenticationHelper.token!!, imagePart) } diff --git a/app/src/main/java/com/casic/br/operationsite/utils/QrConfigCreator.kt b/app/src/main/java/com/casic/br/operationsite/utils/QrConfigCreator.kt new file mode 100644 index 0000000..3b1ef16 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/QrConfigCreator.kt @@ -0,0 +1,25 @@ +package com.casic.br.operationsite.utils + +import android.content.Context +import cn.bertsir.zbar.QrConfig +import cn.bertsir.zbar.view.ScanLineView +import com.casic.br.operationsite.R +import com.pengxh.kt.lite.extensions.convertColor + +object QrConfigCreator { + fun create(context: Context): QrConfig = QrConfig.Builder() + .setShowLight(true) //显示手电筒按钮 + .setShowTitle(false) //显示Title + .setScanType(QrConfig.TYPE_BARCODE)//识别二维码 + .setShowAlbum(false) //显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor.convertColor(context)) //设置扫描框颜色 + .setLineColor(R.color.mainThemeColor.convertColor(context)) //设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM) //设置扫描线速度 + .setDesText("条形码扫描") //扫描框下文字 + .setShowDes(true) //是否显示扫描框下面文字 + .setPlaySound(true) //是否扫描成功后bi~的声音 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT) //设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid) //扫描线样式 + .setShowVibrator(true) //是否震动提醒 + .create() +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 1130fbe..606af48 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -123,4 +123,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //大图 implementation 'com.github.chrisbanes:PhotoView:2.3.0' + //扫码 + implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 78c5c03..5c6a86b 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -13,7 +13,7 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody -import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import java.io.File @@ -102,7 +102,7 @@ * 上传图片 */ suspend fun uploadImage(image: File): String { - val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val requestBody = image.asRequestBody("image/png".toMediaTypeOrNull()) val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(AuthenticationHelper.token!!, imagePart) } diff --git a/app/src/main/java/com/casic/br/operationsite/utils/QrConfigCreator.kt b/app/src/main/java/com/casic/br/operationsite/utils/QrConfigCreator.kt new file mode 100644 index 0000000..3b1ef16 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/QrConfigCreator.kt @@ -0,0 +1,25 @@ +package com.casic.br.operationsite.utils + +import android.content.Context +import cn.bertsir.zbar.QrConfig +import cn.bertsir.zbar.view.ScanLineView +import com.casic.br.operationsite.R +import com.pengxh.kt.lite.extensions.convertColor + +object QrConfigCreator { + fun create(context: Context): QrConfig = QrConfig.Builder() + .setShowLight(true) //显示手电筒按钮 + .setShowTitle(false) //显示Title + .setScanType(QrConfig.TYPE_BARCODE)//识别二维码 + .setShowAlbum(false) //显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor.convertColor(context)) //设置扫描框颜色 + .setLineColor(R.color.mainThemeColor.convertColor(context)) //设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM) //设置扫描线速度 + .setDesText("条形码扫描") //扫描框下文字 + .setShowDes(true) //是否显示扫描框下面文字 + .setPlaySound(true) //是否扫描成功后bi~的声音 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT) //设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid) //扫描线样式 + .setShowVibrator(true) //是否震动提醒 + .create() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt index 0d5bef3..840f1de 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt @@ -10,13 +10,17 @@ import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultCallback import androidx.activity.result.contract.ActivityResultContracts +import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.br.operationsite.R import com.casic.br.operationsite.callback.OnImageCompressListener import com.casic.br.operationsite.databinding.ActivityInstallEquipmentBinding +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.compressImage import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.GlideLoadEngine import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.QrConfigCreator +import com.casic.br.operationsite.vm.UploadFileViewModel import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType import com.luck.picture.lib.entity.LocalMedia @@ -24,15 +28,15 @@ import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialog import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File class InstallEquipmentActivity : KotlinBaseActivity() { @@ -40,8 +44,12 @@ private val kTag = "InstallEquipmentActivity" private val context = this private val marginOffset by lazy { 2.dp2px(this) } + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(this)) + } private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 + private lateinit var uploadFileViewModel: UploadFileViewModel private lateinit var imageAdapter: EditableImageAdapter override fun initViewBinding(): ActivityInstallEquipmentBinding { @@ -63,6 +71,17 @@ override fun initOnCreate(savedInstanceState: Bundle?) { ActivityStackManager.addActivity(this) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + imagePaths.add(url) + recyclerViewImages.add(url.combineImagePath()) + } + imageAdapter.notifyDataSetChanged() + } + } val userName = SaveKeyValues.getValue(LocaleConstant.USER_NAME_KEY, "") as String if (userName.isNotBlank()) { @@ -79,7 +98,12 @@ } override fun observeRequestState() { - + uploadFileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialog.show(this, "图片上传中,请稍后...") + else -> LoadingDialog.dismiss() + } + } } private val selectLocationLauncher = registerForActivityResult( @@ -98,13 +122,24 @@ override fun initEvent() { binding.deviceCodeView.addTextChangedListener(textWatcher) + binding.scanCodeView.setOnClickListener { + qrManager.startScan(this) { result -> + val content = result.content + if (content.isNullOrBlank()) { + "扫码失败,请重试".show(this) + } else { + binding.deviceCodeView.setText(content) + } + } + } + binding.locationImageView.setOnClickListener { selectLocationLauncher.launch(Intent(this, DragMapActivity::class.java)) } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + takePicture() } override fun onItemClick(position: Int) { @@ -121,6 +156,13 @@ imageAdapter.notifyDataSetChanged() } }) + + binding.uploadDeviceButton.setOnClickListener { + if (binding.deviceCodeView.text.isNullOrBlank()) { + "请输入设备编号".show(this) + return@setOnClickListener + } + } } private val textWatcher = object : TextWatcher { @@ -150,47 +192,19 @@ } } - private fun selectPicture() { - BottomActionSheet.Builder().setContext(this).setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - analyticalSelectResults(first()) - } - } - - override fun onCancel() { - - } - }) - } - - 1 -> { - PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) - .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) - .setMaxSelectNum(1).isDisplayCamera(false) - .setImageEngine(GlideLoadEngine.get) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - analyticalSelectResults(first()) - } - } - - override fun onCancel() { - - } - }) - } + private fun takePicture() { + PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + analyticalSelectResults(first()) } } - }).build().show() + + override fun onCancel() { + + } + }) } private fun analyticalSelectResults(result: LocalMedia) { @@ -199,7 +213,7 @@ override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: ${file.absolutePath}") //上传图片 -// uploadFileViewModel.uploadImage(context, file) + uploadFileViewModel.uploadImage(context, file) } override fun onError(e: Throwable) { diff --git a/app/build.gradle b/app/build.gradle index 1130fbe..606af48 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -123,4 +123,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //大图 implementation 'com.github.chrisbanes:PhotoView:2.3.0' + //扫码 + implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 78c5c03..5c6a86b 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -13,7 +13,7 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody -import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import java.io.File @@ -102,7 +102,7 @@ * 上传图片 */ suspend fun uploadImage(image: File): String { - val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val requestBody = image.asRequestBody("image/png".toMediaTypeOrNull()) val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(AuthenticationHelper.token!!, imagePart) } diff --git a/app/src/main/java/com/casic/br/operationsite/utils/QrConfigCreator.kt b/app/src/main/java/com/casic/br/operationsite/utils/QrConfigCreator.kt new file mode 100644 index 0000000..3b1ef16 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/QrConfigCreator.kt @@ -0,0 +1,25 @@ +package com.casic.br.operationsite.utils + +import android.content.Context +import cn.bertsir.zbar.QrConfig +import cn.bertsir.zbar.view.ScanLineView +import com.casic.br.operationsite.R +import com.pengxh.kt.lite.extensions.convertColor + +object QrConfigCreator { + fun create(context: Context): QrConfig = QrConfig.Builder() + .setShowLight(true) //显示手电筒按钮 + .setShowTitle(false) //显示Title + .setScanType(QrConfig.TYPE_BARCODE)//识别二维码 + .setShowAlbum(false) //显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor.convertColor(context)) //设置扫描框颜色 + .setLineColor(R.color.mainThemeColor.convertColor(context)) //设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM) //设置扫描线速度 + .setDesText("条形码扫描") //扫描框下文字 + .setShowDes(true) //是否显示扫描框下面文字 + .setPlaySound(true) //是否扫描成功后bi~的声音 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT) //设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid) //扫描线样式 + .setShowVibrator(true) //是否震动提醒 + .create() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt index 0d5bef3..840f1de 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt @@ -10,13 +10,17 @@ import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultCallback import androidx.activity.result.contract.ActivityResultContracts +import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.br.operationsite.R import com.casic.br.operationsite.callback.OnImageCompressListener import com.casic.br.operationsite.databinding.ActivityInstallEquipmentBinding +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.compressImage import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.GlideLoadEngine import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.QrConfigCreator +import com.casic.br.operationsite.vm.UploadFileViewModel import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType import com.luck.picture.lib.entity.LocalMedia @@ -24,15 +28,15 @@ import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialog import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File class InstallEquipmentActivity : KotlinBaseActivity() { @@ -40,8 +44,12 @@ private val kTag = "InstallEquipmentActivity" private val context = this private val marginOffset by lazy { 2.dp2px(this) } + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(this)) + } private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 + private lateinit var uploadFileViewModel: UploadFileViewModel private lateinit var imageAdapter: EditableImageAdapter override fun initViewBinding(): ActivityInstallEquipmentBinding { @@ -63,6 +71,17 @@ override fun initOnCreate(savedInstanceState: Bundle?) { ActivityStackManager.addActivity(this) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + imagePaths.add(url) + recyclerViewImages.add(url.combineImagePath()) + } + imageAdapter.notifyDataSetChanged() + } + } val userName = SaveKeyValues.getValue(LocaleConstant.USER_NAME_KEY, "") as String if (userName.isNotBlank()) { @@ -79,7 +98,12 @@ } override fun observeRequestState() { - + uploadFileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialog.show(this, "图片上传中,请稍后...") + else -> LoadingDialog.dismiss() + } + } } private val selectLocationLauncher = registerForActivityResult( @@ -98,13 +122,24 @@ override fun initEvent() { binding.deviceCodeView.addTextChangedListener(textWatcher) + binding.scanCodeView.setOnClickListener { + qrManager.startScan(this) { result -> + val content = result.content + if (content.isNullOrBlank()) { + "扫码失败,请重试".show(this) + } else { + binding.deviceCodeView.setText(content) + } + } + } + binding.locationImageView.setOnClickListener { selectLocationLauncher.launch(Intent(this, DragMapActivity::class.java)) } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + takePicture() } override fun onItemClick(position: Int) { @@ -121,6 +156,13 @@ imageAdapter.notifyDataSetChanged() } }) + + binding.uploadDeviceButton.setOnClickListener { + if (binding.deviceCodeView.text.isNullOrBlank()) { + "请输入设备编号".show(this) + return@setOnClickListener + } + } } private val textWatcher = object : TextWatcher { @@ -150,47 +192,19 @@ } } - private fun selectPicture() { - BottomActionSheet.Builder().setContext(this).setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - analyticalSelectResults(first()) - } - } - - override fun onCancel() { - - } - }) - } - - 1 -> { - PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) - .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) - .setMaxSelectNum(1).isDisplayCamera(false) - .setImageEngine(GlideLoadEngine.get) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - analyticalSelectResults(first()) - } - } - - override fun onCancel() { - - } - }) - } + private fun takePicture() { + PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + analyticalSelectResults(first()) } } - }).build().show() + + override fun onCancel() { + + } + }) } private fun analyticalSelectResults(result: LocalMedia) { @@ -199,7 +213,7 @@ override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: ${file.absolutePath}") //上传图片 -// uploadFileViewModel.uploadImage(context, file) + uploadFileViewModel.uploadImage(context, file) } override fun onError(e: Throwable) { diff --git a/app/src/main/res/drawable/ic_location_install.xml b/app/src/main/res/drawable/ic_location_install.xml index 0db0eb9..7dc122c 100644 --- a/app/src/main/res/drawable/ic_location_install.xml +++ b/app/src/main/res/drawable/ic_location_install.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/build.gradle b/app/build.gradle index 1130fbe..606af48 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -123,4 +123,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //大图 implementation 'com.github.chrisbanes:PhotoView:2.3.0' + //扫码 + implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 78c5c03..5c6a86b 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -13,7 +13,7 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody -import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import java.io.File @@ -102,7 +102,7 @@ * 上传图片 */ suspend fun uploadImage(image: File): String { - val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val requestBody = image.asRequestBody("image/png".toMediaTypeOrNull()) val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(AuthenticationHelper.token!!, imagePart) } diff --git a/app/src/main/java/com/casic/br/operationsite/utils/QrConfigCreator.kt b/app/src/main/java/com/casic/br/operationsite/utils/QrConfigCreator.kt new file mode 100644 index 0000000..3b1ef16 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/QrConfigCreator.kt @@ -0,0 +1,25 @@ +package com.casic.br.operationsite.utils + +import android.content.Context +import cn.bertsir.zbar.QrConfig +import cn.bertsir.zbar.view.ScanLineView +import com.casic.br.operationsite.R +import com.pengxh.kt.lite.extensions.convertColor + +object QrConfigCreator { + fun create(context: Context): QrConfig = QrConfig.Builder() + .setShowLight(true) //显示手电筒按钮 + .setShowTitle(false) //显示Title + .setScanType(QrConfig.TYPE_BARCODE)//识别二维码 + .setShowAlbum(false) //显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor.convertColor(context)) //设置扫描框颜色 + .setLineColor(R.color.mainThemeColor.convertColor(context)) //设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM) //设置扫描线速度 + .setDesText("条形码扫描") //扫描框下文字 + .setShowDes(true) //是否显示扫描框下面文字 + .setPlaySound(true) //是否扫描成功后bi~的声音 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT) //设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid) //扫描线样式 + .setShowVibrator(true) //是否震动提醒 + .create() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt index 0d5bef3..840f1de 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt @@ -10,13 +10,17 @@ import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultCallback import androidx.activity.result.contract.ActivityResultContracts +import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.br.operationsite.R import com.casic.br.operationsite.callback.OnImageCompressListener import com.casic.br.operationsite.databinding.ActivityInstallEquipmentBinding +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.compressImage import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.GlideLoadEngine import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.QrConfigCreator +import com.casic.br.operationsite.vm.UploadFileViewModel import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType import com.luck.picture.lib.entity.LocalMedia @@ -24,15 +28,15 @@ import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialog import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File class InstallEquipmentActivity : KotlinBaseActivity() { @@ -40,8 +44,12 @@ private val kTag = "InstallEquipmentActivity" private val context = this private val marginOffset by lazy { 2.dp2px(this) } + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(this)) + } private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 + private lateinit var uploadFileViewModel: UploadFileViewModel private lateinit var imageAdapter: EditableImageAdapter override fun initViewBinding(): ActivityInstallEquipmentBinding { @@ -63,6 +71,17 @@ override fun initOnCreate(savedInstanceState: Bundle?) { ActivityStackManager.addActivity(this) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + imagePaths.add(url) + recyclerViewImages.add(url.combineImagePath()) + } + imageAdapter.notifyDataSetChanged() + } + } val userName = SaveKeyValues.getValue(LocaleConstant.USER_NAME_KEY, "") as String if (userName.isNotBlank()) { @@ -79,7 +98,12 @@ } override fun observeRequestState() { - + uploadFileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialog.show(this, "图片上传中,请稍后...") + else -> LoadingDialog.dismiss() + } + } } private val selectLocationLauncher = registerForActivityResult( @@ -98,13 +122,24 @@ override fun initEvent() { binding.deviceCodeView.addTextChangedListener(textWatcher) + binding.scanCodeView.setOnClickListener { + qrManager.startScan(this) { result -> + val content = result.content + if (content.isNullOrBlank()) { + "扫码失败,请重试".show(this) + } else { + binding.deviceCodeView.setText(content) + } + } + } + binding.locationImageView.setOnClickListener { selectLocationLauncher.launch(Intent(this, DragMapActivity::class.java)) } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + takePicture() } override fun onItemClick(position: Int) { @@ -121,6 +156,13 @@ imageAdapter.notifyDataSetChanged() } }) + + binding.uploadDeviceButton.setOnClickListener { + if (binding.deviceCodeView.text.isNullOrBlank()) { + "请输入设备编号".show(this) + return@setOnClickListener + } + } } private val textWatcher = object : TextWatcher { @@ -150,47 +192,19 @@ } } - private fun selectPicture() { - BottomActionSheet.Builder().setContext(this).setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - analyticalSelectResults(first()) - } - } - - override fun onCancel() { - - } - }) - } - - 1 -> { - PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) - .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) - .setMaxSelectNum(1).isDisplayCamera(false) - .setImageEngine(GlideLoadEngine.get) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - analyticalSelectResults(first()) - } - } - - override fun onCancel() { - - } - }) - } + private fun takePicture() { + PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + analyticalSelectResults(first()) } } - }).build().show() + + override fun onCancel() { + + } + }) } private fun analyticalSelectResults(result: LocalMedia) { @@ -199,7 +213,7 @@ override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: ${file.absolutePath}") //上传图片 -// uploadFileViewModel.uploadImage(context, file) + uploadFileViewModel.uploadImage(context, file) } override fun onError(e: Throwable) { diff --git a/app/src/main/res/drawable/ic_location_install.xml b/app/src/main/res/drawable/ic_location_install.xml index 0db0eb9..7dc122c 100644 --- a/app/src/main/res/drawable/ic_location_install.xml +++ b/app/src/main/res/drawable/ic_location_install.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_scan.xml b/app/src/main/res/drawable/ic_scan.xml new file mode 100644 index 0000000..bd59aec --- /dev/null +++ b/app/src/main/res/drawable/ic_scan.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/build.gradle b/app/build.gradle index 1130fbe..606af48 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -123,4 +123,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //大图 implementation 'com.github.chrisbanes:PhotoView:2.3.0' + //扫码 + implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 78c5c03..5c6a86b 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -13,7 +13,7 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody -import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import java.io.File @@ -102,7 +102,7 @@ * 上传图片 */ suspend fun uploadImage(image: File): String { - val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val requestBody = image.asRequestBody("image/png".toMediaTypeOrNull()) val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(AuthenticationHelper.token!!, imagePart) } diff --git a/app/src/main/java/com/casic/br/operationsite/utils/QrConfigCreator.kt b/app/src/main/java/com/casic/br/operationsite/utils/QrConfigCreator.kt new file mode 100644 index 0000000..3b1ef16 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/QrConfigCreator.kt @@ -0,0 +1,25 @@ +package com.casic.br.operationsite.utils + +import android.content.Context +import cn.bertsir.zbar.QrConfig +import cn.bertsir.zbar.view.ScanLineView +import com.casic.br.operationsite.R +import com.pengxh.kt.lite.extensions.convertColor + +object QrConfigCreator { + fun create(context: Context): QrConfig = QrConfig.Builder() + .setShowLight(true) //显示手电筒按钮 + .setShowTitle(false) //显示Title + .setScanType(QrConfig.TYPE_BARCODE)//识别二维码 + .setShowAlbum(false) //显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor.convertColor(context)) //设置扫描框颜色 + .setLineColor(R.color.mainThemeColor.convertColor(context)) //设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM) //设置扫描线速度 + .setDesText("条形码扫描") //扫描框下文字 + .setShowDes(true) //是否显示扫描框下面文字 + .setPlaySound(true) //是否扫描成功后bi~的声音 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT) //设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid) //扫描线样式 + .setShowVibrator(true) //是否震动提醒 + .create() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt index 0d5bef3..840f1de 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt @@ -10,13 +10,17 @@ import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultCallback import androidx.activity.result.contract.ActivityResultContracts +import androidx.lifecycle.ViewModelProvider +import cn.bertsir.zbar.QrManager import com.casic.br.operationsite.R import com.casic.br.operationsite.callback.OnImageCompressListener import com.casic.br.operationsite.databinding.ActivityInstallEquipmentBinding +import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.compressImage import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.GlideLoadEngine import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.QrConfigCreator +import com.casic.br.operationsite.vm.UploadFileViewModel import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType import com.luck.picture.lib.entity.LocalMedia @@ -24,15 +28,15 @@ import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialog import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.File class InstallEquipmentActivity : KotlinBaseActivity() { @@ -40,8 +44,12 @@ private val kTag = "InstallEquipmentActivity" private val context = this private val marginOffset by lazy { 2.dp2px(this) } + private val qrManager by lazy { + QrManager.getInstance().init(QrConfigCreator.create(this)) + } private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 + private lateinit var uploadFileViewModel: UploadFileViewModel private lateinit var imageAdapter: EditableImageAdapter override fun initViewBinding(): ActivityInstallEquipmentBinding { @@ -63,6 +71,17 @@ override fun initOnCreate(savedInstanceState: Bundle?) { ActivityStackManager.addActivity(this) + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + imagePaths.add(url) + recyclerViewImages.add(url.combineImagePath()) + } + imageAdapter.notifyDataSetChanged() + } + } val userName = SaveKeyValues.getValue(LocaleConstant.USER_NAME_KEY, "") as String if (userName.isNotBlank()) { @@ -79,7 +98,12 @@ } override fun observeRequestState() { - + uploadFileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialog.show(this, "图片上传中,请稍后...") + else -> LoadingDialog.dismiss() + } + } } private val selectLocationLauncher = registerForActivityResult( @@ -98,13 +122,24 @@ override fun initEvent() { binding.deviceCodeView.addTextChangedListener(textWatcher) + binding.scanCodeView.setOnClickListener { + qrManager.startScan(this) { result -> + val content = result.content + if (content.isNullOrBlank()) { + "扫码失败,请重试".show(this) + } else { + binding.deviceCodeView.setText(content) + } + } + } + binding.locationImageView.setOnClickListener { selectLocationLauncher.launch(Intent(this, DragMapActivity::class.java)) } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { - selectPicture() + takePicture() } override fun onItemClick(position: Int) { @@ -121,6 +156,13 @@ imageAdapter.notifyDataSetChanged() } }) + + binding.uploadDeviceButton.setOnClickListener { + if (binding.deviceCodeView.text.isNullOrBlank()) { + "请输入设备编号".show(this) + return@setOnClickListener + } + } } private val textWatcher = object : TextWatcher { @@ -150,47 +192,19 @@ } } - private fun selectPicture() { - BottomActionSheet.Builder().setContext(this).setActionItemTitle(listOf("拍照", "相册")) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - analyticalSelectResults(first()) - } - } - - override fun onCancel() { - - } - }) - } - - 1 -> { - PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) - .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) - .setMaxSelectNum(1).isDisplayCamera(false) - .setImageEngine(GlideLoadEngine.get) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - analyticalSelectResults(first()) - } - } - - override fun onCancel() { - - } - }) - } + private fun takePicture() { + PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + analyticalSelectResults(first()) } } - }).build().show() + + override fun onCancel() { + + } + }) } private fun analyticalSelectResults(result: LocalMedia) { @@ -199,7 +213,7 @@ override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: ${file.absolutePath}") //上传图片 -// uploadFileViewModel.uploadImage(context, file) + uploadFileViewModel.uploadImage(context, file) } override fun onError(e: Throwable) { diff --git a/app/src/main/res/drawable/ic_location_install.xml b/app/src/main/res/drawable/ic_location_install.xml index 0db0eb9..7dc122c 100644 --- a/app/src/main/res/drawable/ic_location_install.xml +++ b/app/src/main/res/drawable/ic_location_install.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_scan.xml b/app/src/main/res/drawable/ic_scan.xml new file mode 100644 index 0000000..bd59aec --- /dev/null +++ b/app/src/main/res/drawable/ic_scan.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_install_equipment.xml b/app/src/main/res/layout/activity_install_equipment.xml index 458aecc..e6cd366 100644 --- a/app/src/main/res/layout/activity_install_equipment.xml +++ b/app/src/main/res/layout/activity_install_equipment.xml @@ -33,8 +33,24 @@ + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="1" + android:background="@null" + android:gravity="end|center_vertical" + android:hint="请输入设备上的编号" + android:paddingHorizontal="@dimen/dp_10" + android:singleLine="true" + android:textColor="@color/mainTextColor" + android:textColorHint="@color/hintTextColor" + android:textSize="@dimen/sp_16" /> + +