parent
50144a2290
commit
44fc5cdcda
|
|
@ -2,6 +2,8 @@
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.bonus.wrjtest">
|
package="com.bonus.wrjtest">
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,14 @@
|
||||||
package com.bonus.wrjtest
|
package com.bonus.wrjtest
|
||||||
|
|
||||||
|
import ScreenshotHelper
|
||||||
|
import android.Manifest
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.app.Activity
|
||||||
import android.app.ProgressDialog
|
import android.app.ProgressDialog
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.content.pm.PackageManager
|
||||||
import android.os.Handler
|
import android.graphics.Bitmap
|
||||||
import android.os.Looper
|
import android.os.*
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
|
@ -35,8 +38,11 @@ import org.w3c.dom.Text
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
import java.time.LocalTime
|
import java.time.LocalTime
|
||||||
import java.time.format.DateTimeFormatter
|
import java.time.format.DateTimeFormatter
|
||||||
|
import java.util.*
|
||||||
|
import kotlin.collections.ArrayList
|
||||||
|
|
||||||
|
|
||||||
class MainActivity : AppCompatActivity() {
|
class MainActivity : AppCompatActivity() {
|
||||||
|
|
@ -48,6 +54,8 @@ class MainActivity : AppCompatActivity() {
|
||||||
lateinit var radar2: TextView
|
lateinit var radar2: TextView
|
||||||
lateinit var radar3: TextView
|
lateinit var radar3: TextView
|
||||||
lateinit var radar4: TextView
|
lateinit var radar4: TextView
|
||||||
|
lateinit var radar5: TextView
|
||||||
|
lateinit var radar6: TextView
|
||||||
lateinit var gps: TextView
|
lateinit var gps: TextView
|
||||||
lateinit var gpsMode: TextView
|
lateinit var gpsMode: TextView
|
||||||
lateinit var pitchAngle: TextView
|
lateinit var pitchAngle: TextView
|
||||||
|
|
@ -147,6 +155,8 @@ class MainActivity : AppCompatActivity() {
|
||||||
*/
|
*/
|
||||||
private var isRecord = 0;
|
private var isRecord = 0;
|
||||||
|
|
||||||
|
private lateinit var screenshotHelper: ScreenshotHelper
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
setContentView(R.layout.test)
|
setContentView(R.layout.test)
|
||||||
|
|
@ -154,8 +164,10 @@ class MainActivity : AppCompatActivity() {
|
||||||
val myApplication = application as MyApplication
|
val myApplication = application as MyApplication
|
||||||
// 在 Activity 或其他有 Context 的地方
|
// 在 Activity 或其他有 Context 的地方
|
||||||
logger = KotlinLogger.getInstance(this)
|
logger = KotlinLogger.getInstance(this)
|
||||||
|
screenshotHelper = ScreenshotHelper(this)
|
||||||
measureDataDao = MeasureDataDao(myApplication.getDbHelper())
|
measureDataDao = MeasureDataDao(myApplication.getDbHelper())
|
||||||
measurementDataDao = MeasurementDataDao(myApplication.getDbHelper())
|
measurementDataDao = MeasurementDataDao(myApplication.getDbHelper())
|
||||||
|
initPermission()
|
||||||
//初始化视图
|
//初始化视图
|
||||||
initView()
|
initView()
|
||||||
//创建通道
|
//创建通道
|
||||||
|
|
@ -169,6 +181,15 @@ class MainActivity : AppCompatActivity() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun initPermission() {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
|
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
||||||
|
requestPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 1)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 初始化点击事件
|
* 初始化点击事件
|
||||||
*/
|
*/
|
||||||
|
|
@ -309,6 +330,8 @@ class MainActivity : AppCompatActivity() {
|
||||||
radar2 = findViewById(R.id.radar2)
|
radar2 = findViewById(R.id.radar2)
|
||||||
radar3 = findViewById(R.id.radar3)
|
radar3 = findViewById(R.id.radar3)
|
||||||
radar4 = findViewById(R.id.radar4)
|
radar4 = findViewById(R.id.radar4)
|
||||||
|
radar5 = findViewById(R.id.radar5)
|
||||||
|
radar6 = findViewById(R.id.radar6)
|
||||||
gps = findViewById(R.id.gps)
|
gps = findViewById(R.id.gps)
|
||||||
gpsMode = findViewById(R.id.gpsMode)
|
gpsMode = findViewById(R.id.gpsMode)
|
||||||
pitchAngle = findViewById(R.id.pitchAngle)
|
pitchAngle = findViewById(R.id.pitchAngle)
|
||||||
|
|
@ -459,20 +482,53 @@ class MainActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
// 记录无人机悬停数据
|
// 记录无人机悬停数据
|
||||||
R.id.record -> {
|
R.id.record -> {
|
||||||
if (isRecord==0){
|
|
||||||
isRecord=1;
|
screenshotHelper.startScreenCapture()
|
||||||
record.setText("停止")
|
|
||||||
} else{
|
// if (isRecord==0){
|
||||||
isRecord=0;
|
// isRecord=1;
|
||||||
record.setText("记录")
|
// record.setText("停止")
|
||||||
}
|
// } else{
|
||||||
sendMsg(5)
|
// isRecord=0;
|
||||||
|
// record.setText("记录")
|
||||||
|
// }
|
||||||
|
// sendMsg(5)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
|
super.onActivityResult(requestCode, resultCode, data)
|
||||||
|
screenshotHelper.onActivityResult(requestCode, resultCode, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun takeScreenshot(activity: Activity) {
|
||||||
|
val rootView = activity.window.decorView.rootView
|
||||||
|
rootView.isDrawingCacheEnabled = true
|
||||||
|
val bitmap = Bitmap.createBitmap(rootView.drawingCache)
|
||||||
|
rootView.isDrawingCacheEnabled = false
|
||||||
|
|
||||||
|
// Save bitmap to file
|
||||||
|
val fileName = "screenshot_" + SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date()) + ".png"
|
||||||
|
val storageDir = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "YourAppName")
|
||||||
|
if (!storageDir.exists()) {
|
||||||
|
storageDir.mkdirs()
|
||||||
|
}
|
||||||
|
val imageFile = File(storageDir, fileName)
|
||||||
|
var fos: FileOutputStream? = null
|
||||||
|
try {
|
||||||
|
fos = FileOutputStream(imageFile)
|
||||||
|
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)
|
||||||
|
fos.flush()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} finally {
|
||||||
|
fos?.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 定义一个方法用于等待横滚角满足条件
|
* 定义一个方法用于等待横滚角满足条件
|
||||||
*/
|
*/
|
||||||
|
|
@ -528,9 +584,9 @@ class MainActivity : AppCompatActivity() {
|
||||||
measurementDataBean.radarLatitude=sensorDataBean.lat
|
measurementDataBean.radarLatitude=sensorDataBean.lat
|
||||||
measurementDataBean.radarElevation=sensorDataBean.h
|
measurementDataBean.radarElevation=sensorDataBean.h
|
||||||
|
|
||||||
// 将 coordinates 中的 lon, lat, h 拼接并赋值给 wire1Data, wire2Data, wire3Data, wire4Data
|
// 将 coordinates 中的 lon, lat, h 拼接并赋值给 wire1Data, wire2Data, wire3Data, wire4Data, wire5Data, wire6Data
|
||||||
// 最多处理前四个坐标
|
// 最多处理前四个坐标
|
||||||
for (i in 0 until minOf(coordinates.size, 4)) {
|
for (i in 0 until minOf(coordinates.size, 6)) {
|
||||||
val coordinate = coordinates[i]
|
val coordinate = coordinates[i]
|
||||||
val dataString = "${coordinate.lon},${coordinate.lat},${coordinate.h}"
|
val dataString = "${coordinate.lon},${coordinate.lat},${coordinate.h}"
|
||||||
|
|
||||||
|
|
@ -539,6 +595,8 @@ class MainActivity : AppCompatActivity() {
|
||||||
1 -> measurementDataBean.wire2Data = dataString
|
1 -> measurementDataBean.wire2Data = dataString
|
||||||
2 -> measurementDataBean.wire3Data = dataString
|
2 -> measurementDataBean.wire3Data = dataString
|
||||||
3 -> measurementDataBean.wire4Data = dataString
|
3 -> measurementDataBean.wire4Data = dataString
|
||||||
|
4 -> measurementDataBean.wire5Data = dataString
|
||||||
|
5 -> measurementDataBean.wire6Data = dataString
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
measurementDataBean.time=DateTimeHelper.getNowDate()
|
measurementDataBean.time=DateTimeHelper.getNowDate()
|
||||||
|
|
@ -655,7 +713,7 @@ class MainActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (resultDataSb.length == 104) {
|
if (resultDataSb.length == 120) {
|
||||||
//因为有分包现象,判断头尾
|
//因为有分包现象,判断头尾
|
||||||
if (resultDataSb.startsWith("F0F0F0") && resultDataSb.endsWith("CCDD")) {
|
if (resultDataSb.startsWith("F0F0F0") && resultDataSb.endsWith("CCDD")) {
|
||||||
returnData.setText("")
|
returnData.setText("")
|
||||||
|
|
@ -673,34 +731,39 @@ class MainActivity : AppCompatActivity() {
|
||||||
val angle3 = data.substring(24, 28)
|
val angle3 = data.substring(24, 28)
|
||||||
val distance4 = data.substring(28, 32)
|
val distance4 = data.substring(28, 32)
|
||||||
val angle4 = data.substring(32, 36)
|
val angle4 = data.substring(32, 36)
|
||||||
val pitchAngle1 = data.substring(36, 44)
|
val distance5 = data.substring(36, 40)
|
||||||
val rollAngle1 = data.substring(44, 52)
|
val angle5 = data.substring(40, 44)
|
||||||
val azimuthAngle1 = data.substring(52, 56)
|
val distance6 = data.substring(44, 48)
|
||||||
val lon = data.substring(56, 66)
|
val angle6 = data.substring(48, 52)
|
||||||
val lat = data.substring(66, 76)
|
|
||||||
val h = data.substring(76, 82)
|
|
||||||
val qual = data.substring(82, 84)
|
|
||||||
|
|
||||||
val splitType = data.substring(84, 86)
|
|
||||||
|
val pitchAngle1 = data.substring(52, 60)
|
||||||
|
val rollAngle1 = data.substring(60, 68)
|
||||||
|
val azimuthAngle1 = data.substring(68, 72)
|
||||||
|
val lon = data.substring(72, 82)
|
||||||
|
val lat = data.substring(82, 92)
|
||||||
|
val h = data.substring(92, 98)
|
||||||
|
val qual = data.substring(98, 100)
|
||||||
|
|
||||||
|
val splitType = data.substring(100, 102)
|
||||||
val splitNum = Integer.parseInt(splitType)
|
val splitNum = Integer.parseInt(splitType)
|
||||||
//水平角
|
//水平角
|
||||||
val hAngleNum = data.substring(86, 90)
|
val hAngleNum = data.substring(102, 106)
|
||||||
//垂直角
|
//垂直角
|
||||||
val vAngleNum = data.substring(90, 94)
|
val vAngleNum = data.substring(106, 110)
|
||||||
|
|
||||||
var radarDistance1: Double =
|
|
||||||
ByteUtil.hexToDecimalInt(distance1).toDouble() / 1000.0
|
|
||||||
|
|
||||||
|
var radarDistance1: Double =ByteUtil.hexToDecimalInt(distance1).toDouble() / 1000.0
|
||||||
var radarAngle1: Double = ByteUtil.hexToDecimalInt(angle1).toDouble() / 100.0
|
var radarAngle1: Double = ByteUtil.hexToDecimalInt(angle1).toDouble() / 100.0
|
||||||
var radarDistance2: Double =
|
var radarDistance2: Double =ByteUtil.hexToDecimalInt(distance2).toDouble() / 1000.0
|
||||||
ByteUtil.hexToDecimalInt(distance2).toDouble() / 1000.0
|
|
||||||
var radarAngle2: Double = ByteUtil.hexToDecimalInt(angle2).toDouble() / 100.0
|
var radarAngle2: Double = ByteUtil.hexToDecimalInt(angle2).toDouble() / 100.0
|
||||||
var radarDistance3: Double =
|
var radarDistance3: Double =ByteUtil.hexToDecimalInt(distance3).toDouble() / 1000.0
|
||||||
ByteUtil.hexToDecimalInt(distance3).toDouble() / 1000.0
|
|
||||||
var radarAngle3: Double = ByteUtil.hexToDecimalInt(angle3).toDouble() / 100.0
|
var radarAngle3: Double = ByteUtil.hexToDecimalInt(angle3).toDouble() / 100.0
|
||||||
var radarDistance4: Double =
|
var radarDistance4: Double =ByteUtil.hexToDecimalInt(distance4).toDouble() / 1000.0
|
||||||
ByteUtil.hexToDecimalInt(distance4).toDouble() / 1000.0
|
|
||||||
var radarAngle4: Double = ByteUtil.hexToDecimalInt(angle4).toDouble() / 100.0
|
var radarAngle4: Double = ByteUtil.hexToDecimalInt(angle4).toDouble() / 100.0
|
||||||
|
var radarDistance5: Double =ByteUtil.hexToDecimalInt(distance5).toDouble() / 1000.0
|
||||||
|
var radarAngle5: Double = ByteUtil.hexToDecimalInt(angle5).toDouble() / 100.0
|
||||||
|
var radarDistance6: Double =ByteUtil.hexToDecimalInt(distance6).toDouble() / 1000.0
|
||||||
|
var radarAngle6: Double = ByteUtil.hexToDecimalInt(angle6).toDouble() / 100.0
|
||||||
//水平角
|
//水平角
|
||||||
val hAngle = ByteUtil.hexToDecimalInt(hAngleNum).toDouble() / 100.0
|
val hAngle = ByteUtil.hexToDecimalInt(hAngleNum).toDouble() / 100.0
|
||||||
//最大角度为22.5,减掉22.5,看到的是与最佳角度差距多少
|
//最大角度为22.5,减掉22.5,看到的是与最佳角度差距多少
|
||||||
|
|
@ -711,7 +774,9 @@ class MainActivity : AppCompatActivity() {
|
||||||
RadarPointBean(radarAngle1, radarDistance1),
|
RadarPointBean(radarAngle1, radarDistance1),
|
||||||
RadarPointBean(radarAngle2, radarDistance2),
|
RadarPointBean(radarAngle2, radarDistance2),
|
||||||
RadarPointBean(radarAngle3, radarDistance3),
|
RadarPointBean(radarAngle3, radarDistance3),
|
||||||
RadarPointBean(radarAngle4, radarDistance4)
|
RadarPointBean(radarAngle4, radarDistance4),
|
||||||
|
RadarPointBean(radarAngle5, radarDistance5),
|
||||||
|
RadarPointBean(radarAngle6, radarDistance6)
|
||||||
)
|
)
|
||||||
// 解析俯仰角和横滚角
|
// 解析俯仰角和横滚角
|
||||||
var pitchAngle2: Double = ByteUtil.hexToSignedDecimalInt(pitchAngle1).toDouble() / 100.0
|
var pitchAngle2: Double = ByteUtil.hexToSignedDecimalInt(pitchAngle1).toDouble() / 100.0
|
||||||
|
|
@ -737,6 +802,8 @@ class MainActivity : AppCompatActivity() {
|
||||||
radar2.setText("${radarDistance2}m, ${radarAngle2-pitchAngle2}°")
|
radar2.setText("${radarDistance2}m, ${radarAngle2-pitchAngle2}°")
|
||||||
radar3.setText("${radarDistance3}m, ${radarAngle3-pitchAngle2}°")
|
radar3.setText("${radarDistance3}m, ${radarAngle3-pitchAngle2}°")
|
||||||
radar4.setText("${radarDistance4}m, ${radarAngle4-pitchAngle2}°")
|
radar4.setText("${radarDistance4}m, ${radarAngle4-pitchAngle2}°")
|
||||||
|
radar5.setText("${radarDistance5}m, ${radarAngle5-pitchAngle2}°")
|
||||||
|
radar6.setText("${radarDistance6}m, ${radarAngle6-pitchAngle2}°")
|
||||||
|
|
||||||
hAngleText.setText("${hAngle}°")
|
hAngleText.setText("${hAngle}°")
|
||||||
vAngleText.setText("${vAngle}°")
|
vAngleText.setText("${vAngle}°")
|
||||||
|
|
@ -750,6 +817,8 @@ class MainActivity : AppCompatActivity() {
|
||||||
logger.log("2号线: "+radarDistance2+" , "+(radarAngle2-pitchAngle2)+"",isPrint);
|
logger.log("2号线: "+radarDistance2+" , "+(radarAngle2-pitchAngle2)+"",isPrint);
|
||||||
logger.log("3号线: "+radarDistance3+" , "+(radarAngle3-pitchAngle2)+"",isPrint);
|
logger.log("3号线: "+radarDistance3+" , "+(radarAngle3-pitchAngle2)+"",isPrint);
|
||||||
logger.log("4号线: "+radarDistance4+" , "+(radarAngle4-pitchAngle2)+"",isPrint);
|
logger.log("4号线: "+radarDistance4+" , "+(radarAngle4-pitchAngle2)+"",isPrint);
|
||||||
|
logger.log("5号线: "+radarDistance5+" , "+(radarAngle5-pitchAngle2)+"",isPrint);
|
||||||
|
logger.log("6号线: "+radarDistance6+" , "+(radarAngle6-pitchAngle2)+"",isPrint);
|
||||||
logger.log("俯仰角: "+pitchAngle2+" ",isPrint);
|
logger.log("俯仰角: "+pitchAngle2+" ",isPrint);
|
||||||
logger.log("横滚角: "+rollAngle2+" ",isPrint);
|
logger.log("横滚角: "+rollAngle2+" ",isPrint);
|
||||||
logger.log("航向角: "+azimuthAngle2+" ",isPrint);
|
logger.log("航向角: "+azimuthAngle2+" ",isPrint);
|
||||||
|
|
@ -776,7 +845,7 @@ class MainActivity : AppCompatActivity() {
|
||||||
sensorDataBean.h = h2
|
sensorDataBean.h = h2
|
||||||
var calStandardDeviation: MutableList<RadarPointBean> = ArrayList()
|
var calStandardDeviation: MutableList<RadarPointBean> = ArrayList()
|
||||||
// 检查 splitNum 是否在 1 到 4 的范围内
|
// 检查 splitNum 是否在 1 到 4 的范围内
|
||||||
if (splitNum in 1..4) {
|
if (splitNum in 1..6) {
|
||||||
for (i in 0 until splitNum) {
|
for (i in 0 until splitNum) {
|
||||||
calStandardDeviation.add(radarPoints[i])
|
calStandardDeviation.add(radarPoints[i])
|
||||||
}
|
}
|
||||||
|
|
@ -1162,6 +1231,21 @@ class MainActivity : AppCompatActivity() {
|
||||||
coordinate1.add(coordinate)
|
coordinate1.add(coordinate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!StringHelper.isEmptyAndNull(data.wire5Data)) {
|
||||||
|
// 将 data.wire5Data 的数据用逗号分隔
|
||||||
|
val wire5DataList = data.wire5Data.split(",")
|
||||||
|
if (wire5DataList.size >= 3) {
|
||||||
|
val coordinate = Coordinate(wire5DataList[0].toDouble(), wire5DataList[1].toDouble(), wire5DataList[2].toDouble())
|
||||||
|
coordinate1.add(coordinate)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!StringHelper.isEmptyAndNull(data.wire6Data)) {
|
||||||
|
val wire6DataList = data.wire6Data.split(",")
|
||||||
|
if (wire6DataList.size >= 3) {
|
||||||
|
val coordinate = Coordinate(wire6DataList[0].toDouble(), wire6DataList[1].toDouble(), wire6DataList[2].toDouble())
|
||||||
|
coordinate1.add(coordinate)
|
||||||
|
}
|
||||||
|
}
|
||||||
coordinatesList.add(coordinate1)
|
coordinatesList.add(coordinate1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1219,7 +1303,7 @@ class MainActivity : AppCompatActivity() {
|
||||||
lineAllPoint.add(point4[i])
|
lineAllPoint.add(point4[i])
|
||||||
lineAllPoint.add(point5[i])
|
lineAllPoint.add(point5[i])
|
||||||
lineAllPoint.add(point6[i])
|
lineAllPoint.add(point6[i])
|
||||||
sb.append(calculate(span, lineAllPoint, pointNum)).append(",")
|
sb.append(calculate(span, lineAllPoint, pointNum)).append(" ");
|
||||||
}
|
}
|
||||||
return sb.toString()
|
return sb.toString()
|
||||||
// sagEditText.setText(sb.toString())
|
// sagEditText.setText(sb.toString())
|
||||||
|
|
@ -1372,11 +1456,16 @@ class MainActivity : AppCompatActivity() {
|
||||||
Log.e(this::class.java.toString(), obj.toString())
|
Log.e(this::class.java.toString(), obj.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清空所有文本框、输入框
|
||||||
|
*/
|
||||||
fun clearAllEditTexts() {
|
fun clearAllEditTexts() {
|
||||||
radar1.setText("")
|
radar1.setText("")
|
||||||
radar2.setText("")
|
radar2.setText("")
|
||||||
radar3.setText("")
|
radar3.setText("")
|
||||||
radar4.setText("")
|
radar4.setText("")
|
||||||
|
radar5.setText("")
|
||||||
|
radar6.setText("")
|
||||||
gps.setText("")
|
gps.setText("")
|
||||||
gpsMode.setText("")
|
gpsMode.setText("")
|
||||||
pitchAngle.setText("")
|
pitchAngle.setText("")
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,8 @@ public class MeasurementDataDao {
|
||||||
"`wire2Data` varchar(100)," +
|
"`wire2Data` varchar(100)," +
|
||||||
"`wire3Data` varchar(100)," +
|
"`wire3Data` varchar(100)," +
|
||||||
"`wire4Data` varchar(100)," +
|
"`wire4Data` varchar(100)," +
|
||||||
|
"`wire5Data` varchar(100)," +
|
||||||
|
"`wire6Data` varchar(100)," +
|
||||||
"`sagValue` varchar(100)," +
|
"`sagValue` varchar(100)," +
|
||||||
"`time` varchar(100)" +
|
"`time` varchar(100)" +
|
||||||
")";
|
")";
|
||||||
|
|
@ -51,8 +53,8 @@ public class MeasurementDataDao {
|
||||||
String sql = "INSERT OR REPLACE INTO `bm_measurement_data` (" +
|
String sql = "INSERT OR REPLACE INTO `bm_measurement_data` (" +
|
||||||
"`splitType`,`span`,`h`,`loopType`, `wirePosition`, `wirePositionName`, `rollAngle`, `pitchAngle`, `yawAngle`, " +
|
"`splitType`,`span`,`h`,`loopType`, `wirePosition`, `wirePositionName`, `rollAngle`, `pitchAngle`, `yawAngle`, " +
|
||||||
"`radarLongitude`, `radarLatitude`, `radarElevation`, `wire1Data`, `wire2Data`, `wire3Data`, " +
|
"`radarLongitude`, `radarLatitude`, `radarElevation`, `wire1Data`, `wire2Data`, `wire3Data`, " +
|
||||||
"`wire4Data`, `sagValue`, `time`) " +
|
"`wire4Data`,`wire5Data`,`wire6Data`, `sagValue`, `time`) " +
|
||||||
"VALUES (?, ?, ?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
"VALUES (?, ?, ?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
||||||
try {
|
try {
|
||||||
this.dbHelper.execSQL(sql, new Object[]{
|
this.dbHelper.execSQL(sql, new Object[]{
|
||||||
measurementData.getSplitType(),
|
measurementData.getSplitType(),
|
||||||
|
|
@ -71,6 +73,8 @@ public class MeasurementDataDao {
|
||||||
measurementData.getWire2Data(),
|
measurementData.getWire2Data(),
|
||||||
measurementData.getWire3Data(),
|
measurementData.getWire3Data(),
|
||||||
measurementData.getWire4Data(),
|
measurementData.getWire4Data(),
|
||||||
|
measurementData.getWire5Data(),
|
||||||
|
measurementData.getWire6Data(),
|
||||||
measurementData.getSagValue(),
|
measurementData.getSagValue(),
|
||||||
measurementData.getTime()
|
measurementData.getTime()
|
||||||
});
|
});
|
||||||
|
|
@ -111,6 +115,8 @@ public class MeasurementDataDao {
|
||||||
data.setWire2Data(cr.getString(cr.getColumnIndex("wire2Data")));
|
data.setWire2Data(cr.getString(cr.getColumnIndex("wire2Data")));
|
||||||
data.setWire3Data(cr.getString(cr.getColumnIndex("wire3Data")));
|
data.setWire3Data(cr.getString(cr.getColumnIndex("wire3Data")));
|
||||||
data.setWire4Data(cr.getString(cr.getColumnIndex("wire4Data")));
|
data.setWire4Data(cr.getString(cr.getColumnIndex("wire4Data")));
|
||||||
|
data.setWire5Data(cr.getString(cr.getColumnIndex("wire5Data")));
|
||||||
|
data.setWire6Data(cr.getString(cr.getColumnIndex("wire6Data")));
|
||||||
data.setSagValue(cr.getString(cr.getColumnIndex("sagValue")));
|
data.setSagValue(cr.getString(cr.getColumnIndex("sagValue")));
|
||||||
data.setTime(cr.getString(cr.getColumnIndex("time")));
|
data.setTime(cr.getString(cr.getColumnIndex("time")));
|
||||||
dataList.add(data);
|
dataList.add(data);
|
||||||
|
|
@ -156,6 +162,8 @@ public class MeasurementDataDao {
|
||||||
data.setWire2Data(cr.getString(cr.getColumnIndex("wire2Data")));
|
data.setWire2Data(cr.getString(cr.getColumnIndex("wire2Data")));
|
||||||
data.setWire3Data(cr.getString(cr.getColumnIndex("wire3Data")));
|
data.setWire3Data(cr.getString(cr.getColumnIndex("wire3Data")));
|
||||||
data.setWire4Data(cr.getString(cr.getColumnIndex("wire4Data")));
|
data.setWire4Data(cr.getString(cr.getColumnIndex("wire4Data")));
|
||||||
|
data.setWire5Data(cr.getString(cr.getColumnIndex("wire5Data")));
|
||||||
|
data.setWire6Data(cr.getString(cr.getColumnIndex("wire6Data")));
|
||||||
data.setSagValue(cr.getString(cr.getColumnIndex("sagValue")));
|
data.setSagValue(cr.getString(cr.getColumnIndex("sagValue")));
|
||||||
data.setTime(cr.getString(cr.getColumnIndex("time")));
|
data.setTime(cr.getString(cr.getColumnIndex("time")));
|
||||||
}
|
}
|
||||||
|
|
@ -226,6 +234,8 @@ public class MeasurementDataDao {
|
||||||
data.setWire2Data(cr.getString(cr.getColumnIndex("wire2Data")));
|
data.setWire2Data(cr.getString(cr.getColumnIndex("wire2Data")));
|
||||||
data.setWire3Data(cr.getString(cr.getColumnIndex("wire3Data")));
|
data.setWire3Data(cr.getString(cr.getColumnIndex("wire3Data")));
|
||||||
data.setWire4Data(cr.getString(cr.getColumnIndex("wire4Data")));
|
data.setWire4Data(cr.getString(cr.getColumnIndex("wire4Data")));
|
||||||
|
data.setWire5Data(cr.getString(cr.getColumnIndex("wire5Data")));
|
||||||
|
data.setWire6Data(cr.getString(cr.getColumnIndex("wire6Data")));
|
||||||
data.setSagValue(cr.getString(cr.getColumnIndex("sagValue")));
|
data.setSagValue(cr.getString(cr.getColumnIndex("sagValue")));
|
||||||
data.setTime(cr.getString(cr.getColumnIndex("time")));
|
data.setTime(cr.getString(cr.getColumnIndex("time")));
|
||||||
// 根据实际字段补充其他 setter 方法
|
// 根据实际字段补充其他 setter 方法
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,14 @@ public class MeasurementDataBean {
|
||||||
* 4号线经纬度高程
|
* 4号线经纬度高程
|
||||||
*/
|
*/
|
||||||
private String wire4Data;
|
private String wire4Data;
|
||||||
|
/**
|
||||||
|
* 5号线经纬度高程
|
||||||
|
*/
|
||||||
|
private String wire5Data;
|
||||||
|
/**
|
||||||
|
* 6号线经纬度高程
|
||||||
|
*/
|
||||||
|
private String wire6Data;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -260,4 +268,20 @@ public class MeasurementDataBean {
|
||||||
public void setH(double h) {
|
public void setH(double h) {
|
||||||
this.h = h;
|
this.h = h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getWire5Data() {
|
||||||
|
return wire5Data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWire5Data(String wire5Data) {
|
||||||
|
this.wire5Data = wire5Data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getWire6Data() {
|
||||||
|
return wire6Data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWire6Data(String wire6Data) {
|
||||||
|
this.wire6Data = wire6Data;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,120 @@
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.Intent
|
||||||
|
import android.graphics.Bitmap
|
||||||
|
import android.graphics.PixelFormat
|
||||||
|
import android.hardware.display.DisplayManager
|
||||||
|
import android.media.Image
|
||||||
|
import android.media.ImageReader
|
||||||
|
import android.media.projection.MediaProjection
|
||||||
|
import android.media.projection.MediaProjectionManager
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.util.DisplayMetrics
|
||||||
|
import android.util.Log
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
|
import java.io.File
|
||||||
|
import java.io.FileOutputStream
|
||||||
|
import java.nio.ByteBuffer
|
||||||
|
|
||||||
|
class ScreenshotHelper(private val activity: Activity) {
|
||||||
|
|
||||||
|
private var mediaProjectionManager: MediaProjectionManager? = null
|
||||||
|
private var mediaProjection: MediaProjection? = null
|
||||||
|
private var imageReader: ImageReader? = null
|
||||||
|
private var displayMetrics: DisplayMetrics? = null
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val REQUEST_CODE_SCREEN_CAPTURE = 1001
|
||||||
|
}
|
||||||
|
|
||||||
|
fun startScreenCapture() {
|
||||||
|
mediaProjectionManager =
|
||||||
|
activity.getSystemService(Activity.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager
|
||||||
|
val permissionIntent = mediaProjectionManager?.createScreenCaptureIntent()
|
||||||
|
activity.startActivityForResult(permissionIntent, REQUEST_CODE_SCREEN_CAPTURE)
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
|
||||||
|
fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
|
if (requestCode == REQUEST_CODE_SCREEN_CAPTURE && resultCode == Activity.RESULT_OK) {
|
||||||
|
mediaProjection = mediaProjectionManager?.getMediaProjection(resultCode, data!!)
|
||||||
|
captureScreenOnce()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
|
||||||
|
private fun captureScreenOnce() {
|
||||||
|
displayMetrics = DisplayMetrics()
|
||||||
|
activity.windowManager.defaultDisplay.getRealMetrics(displayMetrics)
|
||||||
|
|
||||||
|
val width = displayMetrics!!.widthPixels
|
||||||
|
val height = displayMetrics!!.heightPixels
|
||||||
|
imageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 2)
|
||||||
|
|
||||||
|
mediaProjection?.createVirtualDisplay(
|
||||||
|
"ScreenCapture",
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
displayMetrics!!.densityDpi,
|
||||||
|
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
|
||||||
|
imageReader?.surface,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
)
|
||||||
|
|
||||||
|
imageReader?.setOnImageAvailableListener({ reader ->
|
||||||
|
val image = reader.acquireLatestImage()
|
||||||
|
val bitmap = imageToBitmap(image)
|
||||||
|
image?.close()
|
||||||
|
|
||||||
|
saveBitmapToFile(bitmap)
|
||||||
|
|
||||||
|
// 停止捕获并释放资源
|
||||||
|
stopScreenCapture()
|
||||||
|
}, null)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun imageToBitmap(image: Image?): Bitmap {
|
||||||
|
val planes = image?.planes
|
||||||
|
val buffer: ByteBuffer = planes!![0].buffer
|
||||||
|
val pixelStride = planes[0].pixelStride
|
||||||
|
val rowStride = planes[0].rowStride
|
||||||
|
val rowPadding = rowStride - pixelStride * image.width
|
||||||
|
|
||||||
|
val bitmap = Bitmap.createBitmap(
|
||||||
|
image.width + rowPadding / pixelStride,
|
||||||
|
image.height,
|
||||||
|
Bitmap.Config.ARGB_8888
|
||||||
|
)
|
||||||
|
bitmap.copyPixelsFromBuffer(buffer)
|
||||||
|
return bitmap
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun saveBitmapToFile(bitmap: Bitmap) {
|
||||||
|
val fileName = "screenshot_${System.currentTimeMillis()}.png"
|
||||||
|
val storageDir = File(activity.getExternalFilesDir(null), "Screenshots")
|
||||||
|
if (!storageDir.exists()) {
|
||||||
|
storageDir.mkdirs()
|
||||||
|
}
|
||||||
|
val file = File(storageDir, fileName)
|
||||||
|
|
||||||
|
try {
|
||||||
|
val fos = FileOutputStream(file)
|
||||||
|
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)
|
||||||
|
fos.flush()
|
||||||
|
fos.close()
|
||||||
|
Log.d("Screenshot", "Screenshot saved to ${file.absolutePath}")
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun stopScreenCapture() {
|
||||||
|
mediaProjection?.stop()
|
||||||
|
imageReader?.setOnImageAvailableListener(null, null)
|
||||||
|
imageReader?.close()
|
||||||
|
mediaProjection = null
|
||||||
|
imageReader = null
|
||||||
|
Log.d("Screenshot", "Screen capture stopped")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -139,6 +139,66 @@
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="5dp"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="55dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:text="5号线:"
|
||||||
|
android:textColor="#333333"
|
||||||
|
android:textSize="11sp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/radar5"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="29dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:background="@drawable/edittext_bg"
|
||||||
|
android:inputType="text"
|
||||||
|
android:padding="6dp"
|
||||||
|
android:textColor="#333333"
|
||||||
|
android:textSize="11sp" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="8dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="55dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:text="6号线:"
|
||||||
|
android:textColor="#333333"
|
||||||
|
android:textSize="11sp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/radar6"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="29dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:background="@drawable/edittext_bg"
|
||||||
|
android:inputType="text"
|
||||||
|
android:padding="6dp"
|
||||||
|
android:textColor="#333333"
|
||||||
|
android:textSize="11sp" />
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|
@ -791,9 +851,9 @@
|
||||||
android:layout_height="40dp"
|
android:layout_height="40dp"
|
||||||
android:layout_marginLeft="2dp"
|
android:layout_marginLeft="2dp"
|
||||||
android:layout_marginRight="2dp"
|
android:layout_marginRight="2dp"
|
||||||
android:layout_weight="0.85"
|
android:layout_weight="1"
|
||||||
android:text="保存配置"
|
android:text="保存配置"
|
||||||
android:textSize="9sp" />
|
android:textSize="10sp" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/send2"
|
android:id="@+id/send2"
|
||||||
|
|
@ -801,9 +861,9 @@
|
||||||
android:layout_height="40dp"
|
android:layout_height="40dp"
|
||||||
android:layout_marginLeft="2dp"
|
android:layout_marginLeft="2dp"
|
||||||
android:layout_marginRight="2dp"
|
android:layout_marginRight="2dp"
|
||||||
android:layout_weight="0.85"
|
android:layout_weight="1"
|
||||||
android:text="开始测量"
|
android:text="开始测量"
|
||||||
android:textSize="9sp" />
|
android:textSize="10sp" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/poll"
|
android:id="@+id/poll"
|
||||||
|
|
@ -811,9 +871,20 @@
|
||||||
android:layout_height="40dp"
|
android:layout_height="40dp"
|
||||||
android:layout_marginLeft="2dp"
|
android:layout_marginLeft="2dp"
|
||||||
android:layout_marginRight="2dp"
|
android:layout_marginRight="2dp"
|
||||||
android:layout_weight="0.85"
|
android:layout_weight="1"
|
||||||
android:text="保存数据"
|
android:text="保存数据"
|
||||||
android:textSize="9sp" />
|
android:textSize="10sp" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/measureDistance"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:layout_marginLeft="2dp"
|
||||||
|
android:layout_marginRight="2dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="测量距离"
|
||||||
|
android:textSize="10sp" />
|
||||||
|
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/measure"
|
android:id="@+id/measure"
|
||||||
|
|
@ -821,9 +892,9 @@
|
||||||
android:layout_height="40dp"
|
android:layout_height="40dp"
|
||||||
android:layout_marginLeft="3dp"
|
android:layout_marginLeft="3dp"
|
||||||
android:layout_marginRight="3dp"
|
android:layout_marginRight="3dp"
|
||||||
android:layout_weight="0.85"
|
android:layout_weight="1"
|
||||||
android:text="计算弧垂"
|
android:text="计算弧垂"
|
||||||
android:textSize="9sp" />
|
android:textSize="10sp" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/clear"
|
android:id="@+id/clear"
|
||||||
|
|
@ -831,9 +902,9 @@
|
||||||
android:layout_height="40dp"
|
android:layout_height="40dp"
|
||||||
android:layout_marginLeft="2dp"
|
android:layout_marginLeft="2dp"
|
||||||
android:layout_marginRight="2dp"
|
android:layout_marginRight="2dp"
|
||||||
android:layout_weight="0.85"
|
android:layout_weight="1"
|
||||||
android:text="清空数据"
|
android:text="清空数据"
|
||||||
android:textSize="9sp" />
|
android:textSize="10sp" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/video"
|
android:id="@+id/video"
|
||||||
|
|
@ -845,16 +916,6 @@
|
||||||
android:text="视频"
|
android:text="视频"
|
||||||
android:textSize="9sp" />
|
android:textSize="9sp" />
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/measureDistance"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="40dp"
|
|
||||||
android:layout_marginLeft="2dp"
|
|
||||||
android:layout_marginRight="2dp"
|
|
||||||
android:layout_weight="0.65"
|
|
||||||
android:text="测距"
|
|
||||||
android:textSize="9sp" />
|
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/record"
|
android:id="@+id/record"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue