From 44fc5cdcda464e4b6b83e9407bc7adea5438fb6d Mon Sep 17 00:00:00 2001 From: hayu <1604366271@qq.com> Date: Sun, 27 Apr 2025 16:14:36 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=85=AD=E5=88=86=E8=A3=82=E5=AF=BC?= =?UTF-8?q?=E7=BA=BF=E8=AF=86=E5=88=AB=202=E3=80=81=E6=88=AA=E5=9B=BE?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=203=E3=80=81=E5=A2=9E=E5=8A=A0=E6=97=A0?= =?UTF-8?q?=E4=BA=BA=E6=9C=BA=E6=82=AC=E5=81=9C=E5=A4=A9=E7=BA=BF=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 2 + .../java/com/bonus/wrjtest/MainActivity.kt | 161 ++++++++++++++---- .../bonus/wrjtest/db/MeasurementDataDao.java | 14 +- .../wrjtest/entity/MeasurementDataBean.java | 24 +++ .../bonus/wrjtest/utils/ScreenshotHelper.kt | 120 +++++++++++++ app/src/main/res/layout/test.xml | 101 ++++++++--- 6 files changed, 364 insertions(+), 58 deletions(-) create mode 100644 app/src/main/java/com/bonus/wrjtest/utils/ScreenshotHelper.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ebf01d3..f8889bc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + = 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) radar3 = findViewById(R.id.radar3) radar4 = findViewById(R.id.radar4) + radar5 = findViewById(R.id.radar5) + radar6 = findViewById(R.id.radar6) gps = findViewById(R.id.gps) gpsMode = findViewById(R.id.gpsMode) pitchAngle = findViewById(R.id.pitchAngle) @@ -459,20 +482,53 @@ class MainActivity : AppCompatActivity() { } // 记录无人机悬停数据 R.id.record -> { - if (isRecord==0){ - isRecord=1; - record.setText("停止") - } else{ - isRecord=0; - record.setText("记录") - } - sendMsg(5) + + screenshotHelper.startScreenCapture() + +// if (isRecord==0){ +// isRecord=1; +// record.setText("停止") +// } else{ +// 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.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 dataString = "${coordinate.lon},${coordinate.lat},${coordinate.h}" @@ -539,6 +595,8 @@ class MainActivity : AppCompatActivity() { 1 -> measurementDataBean.wire2Data = dataString 2 -> measurementDataBean.wire3Data = dataString 3 -> measurementDataBean.wire4Data = dataString + 4 -> measurementDataBean.wire5Data = dataString + 5 -> measurementDataBean.wire6Data = dataString } } measurementDataBean.time=DateTimeHelper.getNowDate() @@ -655,7 +713,7 @@ class MainActivity : AppCompatActivity() { } } } else { - if (resultDataSb.length == 104) { + if (resultDataSb.length == 120) { //因为有分包现象,判断头尾 if (resultDataSb.startsWith("F0F0F0") && resultDataSb.endsWith("CCDD")) { returnData.setText("") @@ -673,34 +731,39 @@ class MainActivity : AppCompatActivity() { val angle3 = data.substring(24, 28) val distance4 = data.substring(28, 32) val angle4 = data.substring(32, 36) - val pitchAngle1 = data.substring(36, 44) - val rollAngle1 = data.substring(44, 52) - val azimuthAngle1 = data.substring(52, 56) - val lon = data.substring(56, 66) - val lat = data.substring(66, 76) - val h = data.substring(76, 82) - val qual = data.substring(82, 84) + val distance5 = data.substring(36, 40) + val angle5 = data.substring(40, 44) + val distance6 = data.substring(44, 48) + val angle6 = data.substring(48, 52) - 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 hAngleNum = data.substring(86, 90) + val hAngleNum = data.substring(102, 106) //垂直角 - val vAngleNum = data.substring(90, 94) - - var radarDistance1: Double = - ByteUtil.hexToDecimalInt(distance1).toDouble() / 1000.0 + val vAngleNum = data.substring(106, 110) + var radarDistance1: Double =ByteUtil.hexToDecimalInt(distance1).toDouble() / 1000.0 var radarAngle1: Double = ByteUtil.hexToDecimalInt(angle1).toDouble() / 100.0 - var radarDistance2: Double = - ByteUtil.hexToDecimalInt(distance2).toDouble() / 1000.0 + var radarDistance2: Double =ByteUtil.hexToDecimalInt(distance2).toDouble() / 1000.0 var radarAngle2: Double = ByteUtil.hexToDecimalInt(angle2).toDouble() / 100.0 - var radarDistance3: Double = - ByteUtil.hexToDecimalInt(distance3).toDouble() / 1000.0 + var radarDistance3: Double =ByteUtil.hexToDecimalInt(distance3).toDouble() / 1000.0 var radarAngle3: Double = ByteUtil.hexToDecimalInt(angle3).toDouble() / 100.0 - var radarDistance4: Double = - ByteUtil.hexToDecimalInt(distance4).toDouble() / 1000.0 + var radarDistance4: Double =ByteUtil.hexToDecimalInt(distance4).toDouble() / 1000.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 //最大角度为22.5,减掉22.5,看到的是与最佳角度差距多少 @@ -711,7 +774,9 @@ class MainActivity : AppCompatActivity() { RadarPointBean(radarAngle1, radarDistance1), RadarPointBean(radarAngle2, radarDistance2), RadarPointBean(radarAngle3, radarDistance3), - RadarPointBean(radarAngle4, radarDistance4) + RadarPointBean(radarAngle4, radarDistance4), + RadarPointBean(radarAngle5, radarDistance5), + RadarPointBean(radarAngle6, radarDistance6) ) // 解析俯仰角和横滚角 var pitchAngle2: Double = ByteUtil.hexToSignedDecimalInt(pitchAngle1).toDouble() / 100.0 @@ -737,6 +802,8 @@ class MainActivity : AppCompatActivity() { radar2.setText("${radarDistance2}m, ${radarAngle2-pitchAngle2}°") radar3.setText("${radarDistance3}m, ${radarAngle3-pitchAngle2}°") radar4.setText("${radarDistance4}m, ${radarAngle4-pitchAngle2}°") + radar5.setText("${radarDistance5}m, ${radarAngle5-pitchAngle2}°") + radar6.setText("${radarDistance6}m, ${radarAngle6-pitchAngle2}°") hAngleText.setText("${hAngle}°") vAngleText.setText("${vAngle}°") @@ -750,6 +817,8 @@ class MainActivity : AppCompatActivity() { logger.log("2号线: "+radarDistance2+" , "+(radarAngle2-pitchAngle2)+"",isPrint); logger.log("3号线: "+radarDistance3+" , "+(radarAngle3-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("横滚角: "+rollAngle2+" ",isPrint); logger.log("航向角: "+azimuthAngle2+" ",isPrint); @@ -776,7 +845,7 @@ class MainActivity : AppCompatActivity() { sensorDataBean.h = h2 var calStandardDeviation: MutableList = ArrayList() // 检查 splitNum 是否在 1 到 4 的范围内 - if (splitNum in 1..4) { + if (splitNum in 1..6) { for (i in 0 until splitNum) { calStandardDeviation.add(radarPoints[i]) } @@ -1162,6 +1231,21 @@ class MainActivity : AppCompatActivity() { 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) } @@ -1219,7 +1303,7 @@ class MainActivity : AppCompatActivity() { lineAllPoint.add(point4[i]) lineAllPoint.add(point5[i]) lineAllPoint.add(point6[i]) - sb.append(calculate(span, lineAllPoint, pointNum)).append(",") + sb.append(calculate(span, lineAllPoint, pointNum)).append(" "); } return sb.toString() // sagEditText.setText(sb.toString()) @@ -1372,11 +1456,16 @@ class MainActivity : AppCompatActivity() { Log.e(this::class.java.toString(), obj.toString()) } + /** + * 清空所有文本框、输入框 + */ fun clearAllEditTexts() { radar1.setText("") radar2.setText("") radar3.setText("") radar4.setText("") + radar5.setText("") + radar6.setText("") gps.setText("") gpsMode.setText("") pitchAngle.setText("") diff --git a/app/src/main/java/com/bonus/wrjtest/db/MeasurementDataDao.java b/app/src/main/java/com/bonus/wrjtest/db/MeasurementDataDao.java index 29d0ab3..f5439c6 100644 --- a/app/src/main/java/com/bonus/wrjtest/db/MeasurementDataDao.java +++ b/app/src/main/java/com/bonus/wrjtest/db/MeasurementDataDao.java @@ -37,6 +37,8 @@ public class MeasurementDataDao { "`wire2Data` varchar(100)," + "`wire3Data` varchar(100)," + "`wire4Data` varchar(100)," + + "`wire5Data` varchar(100)," + + "`wire6Data` varchar(100)," + "`sagValue` varchar(100)," + "`time` varchar(100)" + ")"; @@ -51,8 +53,8 @@ public class MeasurementDataDao { String sql = "INSERT OR REPLACE INTO `bm_measurement_data` (" + "`splitType`,`span`,`h`,`loopType`, `wirePosition`, `wirePositionName`, `rollAngle`, `pitchAngle`, `yawAngle`, " + "`radarLongitude`, `radarLatitude`, `radarElevation`, `wire1Data`, `wire2Data`, `wire3Data`, " + - "`wire4Data`, `sagValue`, `time`) " + - "VALUES (?, ?, ?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + "`wire4Data`,`wire5Data`,`wire6Data`, `sagValue`, `time`) " + + "VALUES (?, ?, ?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; try { this.dbHelper.execSQL(sql, new Object[]{ measurementData.getSplitType(), @@ -71,6 +73,8 @@ public class MeasurementDataDao { measurementData.getWire2Data(), measurementData.getWire3Data(), measurementData.getWire4Data(), + measurementData.getWire5Data(), + measurementData.getWire6Data(), measurementData.getSagValue(), measurementData.getTime() }); @@ -111,6 +115,8 @@ public class MeasurementDataDao { data.setWire2Data(cr.getString(cr.getColumnIndex("wire2Data"))); data.setWire3Data(cr.getString(cr.getColumnIndex("wire3Data"))); 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.setTime(cr.getString(cr.getColumnIndex("time"))); dataList.add(data); @@ -156,6 +162,8 @@ public class MeasurementDataDao { data.setWire2Data(cr.getString(cr.getColumnIndex("wire2Data"))); data.setWire3Data(cr.getString(cr.getColumnIndex("wire3Data"))); 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.setTime(cr.getString(cr.getColumnIndex("time"))); } @@ -226,6 +234,8 @@ public class MeasurementDataDao { data.setWire2Data(cr.getString(cr.getColumnIndex("wire2Data"))); data.setWire3Data(cr.getString(cr.getColumnIndex("wire3Data"))); 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.setTime(cr.getString(cr.getColumnIndex("time"))); // 根据实际字段补充其他 setter 方法 diff --git a/app/src/main/java/com/bonus/wrjtest/entity/MeasurementDataBean.java b/app/src/main/java/com/bonus/wrjtest/entity/MeasurementDataBean.java index 0d2b0f6..d6117ba 100644 --- a/app/src/main/java/com/bonus/wrjtest/entity/MeasurementDataBean.java +++ b/app/src/main/java/com/bonus/wrjtest/entity/MeasurementDataBean.java @@ -87,6 +87,14 @@ public class MeasurementDataBean { * 4号线经纬度高程 */ private String wire4Data; + /** + * 5号线经纬度高程 + */ + private String wire5Data; + /** + * 6号线经纬度高程 + */ + private String wire6Data; /** @@ -260,4 +268,20 @@ public class MeasurementDataBean { public void setH(double 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; + } } \ No newline at end of file diff --git a/app/src/main/java/com/bonus/wrjtest/utils/ScreenshotHelper.kt b/app/src/main/java/com/bonus/wrjtest/utils/ScreenshotHelper.kt new file mode 100644 index 0000000..9c27ca5 --- /dev/null +++ b/app/src/main/java/com/bonus/wrjtest/utils/ScreenshotHelper.kt @@ -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") + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/test.xml b/app/src/main/res/layout/test.xml index c9cc3b1..b2721ea 100644 --- a/app/src/main/res/layout/test.xml +++ b/app/src/main/res/layout/test.xml @@ -139,6 +139,66 @@ + + + + + + + + + + + + + + + + + + android:textSize="10sp" />