desc:导出修改

main
xiaowusky 1 year ago
parent 1a94d22519
commit aeee3662bf

@ -1,202 +0,0 @@
package com.yinuo.safetywatcher
import android.content.Context
import android.content.Intent
import android.media.MediaCodecList
import android.net.Uri
import android.os.Build
import android.os.FileUtils
import android.provider.Settings
import android.util.Log
import com.common.commonlib.db.DBUtils
import com.common.commonlib.db.entity.Gas
import com.common.commonlib.db.entity.Video
import com.common.commonlib.db.entity.Warning
import com.yinuo.safetywatcher.watcher.net.UploadFileApi
import com.yinuo.safetywatcher.watcher.ui.view.CommonDialog
import com.yinuo.safetywatcher.watcher.utils.DateUtils
import com.yinuo.safetywatcher.watcher.xls.SimpleCellValue
import com.yinuo.safetywatcher.watcher.xls.utils.ExcelUtils
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import org.easydarwin.PushHelper
import java.io.BufferedReader
import java.io.DataOutputStream
import java.io.File
import java.io.IOException
import java.io.InputStreamReader
object TestUtils {
fun insertData() {
getSupportCodec()
GlobalScope.launch() {
// 构造气体数据
val timeMillis = System.currentTimeMillis()
// 构造告警数据
val warningDao = DBUtils.warningDao()
val warnings = mutableListOf<Warning>()
warnings.add(Warning("CO", 60f, "", timeMillis))
warnings.add(Warning("CO", 80f, "", timeMillis - 30 * 1000))
warnings.add(Warning("CO2", 80f, "", timeMillis - 30 * 1000))
warnings.add(Warning("O2", 10f, "", timeMillis - 90 * 1000))
warningDao.insertAll(warnings)
}
}
fun requestReadNetworkStats(context: Context) {
val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// 经过测试,只有在 Android 10 及以上加包名才有效果
// 如果在 Android 10 以下加包名会导致无法跳转
intent.data = Uri.parse("package:" + context.packageName)
}
context.startActivity(intent)
}
fun testUploadFile(uploadApi: UploadFileApi, video: Video, commonDialog: CommonDialog?) {
// val path = video.path
// uploadApi.singleUpload(path, System.currentTimeMillis(), object :
// RequestResultCallBack<BaseResponse>() {
// override fun onResult(result: BaseResponse) {
// commonDialog?.dismiss()
// }
//
// override fun onError(error: String?) {
// commonDialog?.dismiss()
// }
// })
}
suspend fun testExportExcel(
context: Context,
usbPath: String,
datas: MutableList<Gas>,
commonDialog: CommonDialog?
) {
val allData = mutableListOf<List<SimpleCellValue>>()
datas.forEach {
val row = mutableListOf<SimpleCellValue>()
row.add(SimpleCellValue(DateUtils.formatHistoryTime(it.time) ?: ""))
row.add(SimpleCellValue(it.gasName))
row.add(SimpleCellValue(it.gasValue.toString()))
row.add(SimpleCellValue(it.unit))
allData.add(row)
}
val excelPath = ExcelUtils.writeStringListToExcel(allData, usbPath, context)
commonDialog?.dismiss()
}
suspend fun testExportWarnExcel(
context: Context,
usbPath: String,
datas: MutableList<Warning>,
loadingDialog: CommonDialog?
) {
val allData = mutableListOf<List<SimpleCellValue>>()
datas.forEach {
val row = mutableListOf<SimpleCellValue>()
row.add(SimpleCellValue(DateUtils.formatHistoryTime(it.startTime) ?: ""))
row.add(SimpleCellValue(it.gasName))
row.add(SimpleCellValue(it.gasValue.toString()))
row.add(SimpleCellValue(it.unit))
allData.add(row)
}
val excelPath = ExcelUtils.writeStringListToExcel(allData, usbPath, context, true)
loadingDialog?.dismiss()
}
// ShellUtils execCommand()方法
fun execCommand(
commands: Array<String>,
isRoot: Boolean,
isNeedResultMsg: Boolean
) {
var result = -1
if (commands.isEmpty()) {
return
}
var process: Process? = null
var successResult: BufferedReader? = null
var errorResult: BufferedReader? = null
var successMsg: StringBuilder? = null
var errorMsg: StringBuilder? = null
var os: DataOutputStream? = null
try {
process = Runtime.getRuntime().exec(if (isRoot) "su" else "sh")
os = DataOutputStream(process!!.outputStream)
for (command in commands) {
if (command == null) {
continue
}
// do not use os.writeBytes(command), avoid chinese charset error
os.write(command.toByteArray())
os.writeBytes("\n")
os.flush()
}
os.writeBytes("exit\n")
os.flush()
result = process.waitFor()
// get command result
if (isNeedResultMsg) {
successMsg = StringBuilder()
errorMsg = StringBuilder()
successResult = BufferedReader(InputStreamReader(process.inputStream))
errorResult = BufferedReader(InputStreamReader(process.errorStream))
var s: String?
while (successResult.readLine().also { s = it } != null) {
successMsg.append(s)
}
while (errorResult.readLine().also { s = it } != null) {
errorMsg.append(s)
}
}
} catch (e: Exception) {
e.printStackTrace()
} finally {
try {
os?.close()
successResult?.close()
errorResult?.close()
} catch (e: IOException) {
e.printStackTrace()
}
process?.destroy()
}
}
suspend fun testCopyVideo(
context: Context,
usbPath: String,
datas: MutableList<Video>,
loadingDialog: CommonDialog?
) {
val usbVideoPath = usbPath + File.separator + "Video"
val dFile = File(usbVideoPath);
if (!dFile.exists() || !dFile.isDirectory) {
dFile.mkdir()
}
datas.forEach {
FileUtils.copy(
File(it.path).inputStream(),
File(usbVideoPath + "/${it.name}").outputStream()
)
}
loadingDialog?.dismiss()
}
fun getSupportCodec() {
val list = MediaCodecList(MediaCodecList.ALL_CODECS)
val codecs = list.codecInfos
Log.d("cyy", "Decoders:")
for (i in codecs.indices) {
val codec = codecs[i]
Log.d("cyy", codec.name)
}
}
}

@ -7,16 +7,16 @@ import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.common.commonlib.db.DBUtils
import com.common.commonlib.db.entity.Video
import com.common.commonlib.utils.StorageUtils
import com.yinuo.safetywatcher.R
import com.yinuo.safetywatcher.TestUtils
import com.yinuo.safetywatcher.databinding.ActivityHistoryVideoBinding
import com.yinuo.safetywatcher.watcher.player.ProVideoActivity
import com.yinuo.safetywatcher.watcher.base.BaseActivity
import com.yinuo.safetywatcher.watcher.constant.DEFAULT_QUERY_TIME_INTERVAL
import com.yinuo.safetywatcher.watcher.player.ProVideoActivity
import com.yinuo.safetywatcher.watcher.ui.adapter.HistoryVideoAdapter
import com.yinuo.safetywatcher.watcher.ui.view.CommonTopBar
import com.yinuo.safetywatcher.watcher.utils.DateUtils
import com.common.commonlib.utils.StorageUtils
import com.yinuo.safetywatcher.watcher.utils.ExportUtils
import com.yinuo.safetywatcher.watcher.utils.showToast
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
@ -131,8 +131,8 @@ class HistoryVideoActivity : BaseActivity() {
return
}
showLoadingDialog(R.string.export_data_tip)
GlobalScope.launch {
TestUtils.testCopyVideo(this@HistoryVideoActivity, usbPath, mAdapter._data, loadingDialog)
GlobalScope.launch(Dispatchers.IO) {
ExportUtils.testCopyVideo(this@HistoryVideoActivity, usbPath, mAdapter._data, loadingDialog)
launch(Dispatchers.Main) {
showToast(getString(R.string.export_success))
}

@ -2,14 +2,15 @@ package com.yinuo.safetywatcher.watcher.ui
import android.annotation.SuppressLint
import android.content.Intent
import android.text.TextUtils
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.common.commonlib.db.DBUtils
import com.common.commonlib.db.entity.Gas
import com.common.commonlib.utils.StorageUtils
import com.yinuo.safetywatcher.R
import com.yinuo.safetywatcher.TestUtils
import com.yinuo.safetywatcher.databinding.ActivityQueryDataBinding
import com.yinuo.safetywatcher.watcher.base.BaseActivity
import com.yinuo.safetywatcher.watcher.constant.DEFAULT_QUERY_TIME_INTERVAL
@ -21,7 +22,7 @@ import com.yinuo.safetywatcher.watcher.ui.adapter.HistoryDataAdapter
import com.yinuo.safetywatcher.watcher.ui.view.CommonTopBar
import com.yinuo.safetywatcher.watcher.utils.ChartBridge
import com.yinuo.safetywatcher.watcher.utils.DateUtils
import com.common.commonlib.utils.StorageUtils
import com.yinuo.safetywatcher.watcher.utils.ExportUtils
import com.yinuo.safetywatcher.watcher.utils.showToast
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@ -233,15 +234,17 @@ class QueryDataActivity : BaseActivity() {
return
}
showLoadingDialog(R.string.export_data_tip, false)
lifecycleScope.launch {
TestUtils.testExportExcel(
lifecycleScope.launch(Dispatchers.IO) {
val exportGasExcelPath = ExportUtils.testExportExcel(
this@QueryDataActivity,
usbPath,
mAdapter._data,
loadingDialog
)
launch(Dispatchers.Main) {
showToast(getString(R.string.export_success))
val showTxt =
if (TextUtils.isEmpty(exportGasExcelPath)) "气体数据导出失败!" else getString(R.string.export_success)
showToast(showTxt)
}
}
}

@ -1,20 +1,21 @@
package com.yinuo.safetywatcher.watcher.ui
import android.text.TextUtils
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.common.commonlib.db.DBUtils
import com.common.commonlib.db.entity.Warning
import com.common.commonlib.utils.StorageUtils
import com.yinuo.safetywatcher.R
import com.yinuo.safetywatcher.TestUtils
import com.yinuo.safetywatcher.databinding.ActivityWarndataBinding
import com.yinuo.safetywatcher.watcher.base.BaseActivity
import com.yinuo.safetywatcher.watcher.constant.DEFAULT_QUERY_TIME_INTERVAL
import com.yinuo.safetywatcher.watcher.ui.adapter.WarnDataAdapter
import com.yinuo.safetywatcher.watcher.ui.view.CommonTopBar
import com.yinuo.safetywatcher.watcher.utils.DateUtils
import com.common.commonlib.utils.StorageUtils
import com.yinuo.safetywatcher.watcher.utils.ExportUtils
import com.yinuo.safetywatcher.watcher.utils.showToast
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@ -121,15 +122,22 @@ class WarnDataActivity : BaseActivity() {
private fun doExportData() {
val usbPath = StorageUtils.getStoragePath(this@WarnDataActivity)
if (usbPath.isNullOrEmpty()){
if (usbPath.isNullOrEmpty()) {
showToast(getString(R.string.no_upan_tip))
return
}
showLoadingDialog(R.string.export_data_tip, false)
lifecycleScope.launch {
TestUtils.testExportWarnExcel(this@WarnDataActivity, usbPath, mAdapter._data, loadingDialog)
launch(Dispatchers.Main){
showToast(getString(R.string.export_success))
lifecycleScope.launch(Dispatchers.IO) {
val exportWarnExcelPath = ExportUtils.testExportWarnExcel(
this@WarnDataActivity,
usbPath,
mAdapter._data,
loadingDialog
)
launch(Dispatchers.Main) {
val showTxt =
if (TextUtils.isEmpty(exportWarnExcelPath)) "告警数据导出失败!" else getString(R.string.export_success)
showToast(showTxt)
}
}
}

@ -0,0 +1,74 @@
package com.yinuo.safetywatcher.watcher.utils
import android.content.Context
import android.os.FileUtils
import com.common.commonlib.db.entity.Gas
import com.common.commonlib.db.entity.Video
import com.common.commonlib.db.entity.Warning
import com.yinuo.safetywatcher.watcher.ui.view.CommonDialog
import com.yinuo.safetywatcher.watcher.xls.SimpleCellValue
import com.yinuo.safetywatcher.watcher.xls.utils.ExcelUtils
import java.io.File
object ExportUtils {
fun testExportExcel(
context: Context,
usbPath: String,
datas: MutableList<Gas>,
commonDialog: CommonDialog?
): String? {
val allData = mutableListOf<List<SimpleCellValue>>()
datas.forEach {
val row = mutableListOf<SimpleCellValue>()
row.add(SimpleCellValue(DateUtils.formatHistoryTime(it.time) ?: ""))
row.add(SimpleCellValue(it.gasName))
row.add(SimpleCellValue(it.gasValue.toString()))
row.add(SimpleCellValue(it.unit))
allData.add(row)
}
val excelPath = ExcelUtils.writeStringListToExcel(allData, usbPath, context)
commonDialog?.dismiss()
return excelPath
}
fun testExportWarnExcel(
context: Context,
usbPath: String,
datas: MutableList<Warning>,
loadingDialog: CommonDialog?
): String? {
val allData = mutableListOf<List<SimpleCellValue>>()
datas.forEach {
val row = mutableListOf<SimpleCellValue>()
row.add(SimpleCellValue(DateUtils.formatHistoryTime(it.startTime) ?: ""))
row.add(SimpleCellValue(it.gasName))
row.add(SimpleCellValue(it.gasValue.toString()))
row.add(SimpleCellValue(it.unit))
allData.add(row)
}
val excelPath = ExcelUtils.writeStringListToExcel(allData, usbPath, context, true)
loadingDialog?.dismiss()
return excelPath
}
fun testCopyVideo(
context: Context,
usbPath: String,
datas: MutableList<Video>,
loadingDialog: CommonDialog?
) {
val usbVideoPath = usbPath + File.separator + "Video"
val dFile = File(usbVideoPath);
if (!dFile.exists() || !dFile.isDirectory) {
dFile.mkdir()
}
datas.forEach {
FileUtils.copy(
File(it.path).inputStream(),
File(usbVideoPath + "/${it.name}").outputStream()
)
}
loadingDialog?.dismiss()
}
}
Loading…
Cancel
Save