parent
50144a2290
commit
44fc5cdcda
|
|
@ -2,6 +2,8 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.bonus.wrjtest">
|
||||
<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
|
||||
android:allowBackup="true"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
|
|
|
|||
|
|
@ -1,11 +1,14 @@
|
|||
package com.bonus.wrjtest
|
||||
|
||||
import ScreenshotHelper
|
||||
import android.Manifest
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Activity
|
||||
import android.app.ProgressDialog
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.content.pm.PackageManager
|
||||
import android.graphics.Bitmap
|
||||
import android.os.*
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
|
|
@ -35,8 +38,11 @@ import org.w3c.dom.Text
|
|||
import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
import java.io.IOException
|
||||
import java.text.SimpleDateFormat
|
||||
import java.time.LocalTime
|
||||
import java.time.format.DateTimeFormatter
|
||||
import java.util.*
|
||||
import kotlin.collections.ArrayList
|
||||
|
||||
|
||||
class MainActivity : AppCompatActivity() {
|
||||
|
|
@ -48,6 +54,8 @@ class MainActivity : AppCompatActivity() {
|
|||
lateinit var radar2: TextView
|
||||
lateinit var radar3: TextView
|
||||
lateinit var radar4: TextView
|
||||
lateinit var radar5: TextView
|
||||
lateinit var radar6: TextView
|
||||
lateinit var gps: TextView
|
||||
lateinit var gpsMode: TextView
|
||||
lateinit var pitchAngle: TextView
|
||||
|
|
@ -147,6 +155,8 @@ class MainActivity : AppCompatActivity() {
|
|||
*/
|
||||
private var isRecord = 0;
|
||||
|
||||
private lateinit var screenshotHelper: ScreenshotHelper
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.test)
|
||||
|
|
@ -154,8 +164,10 @@ class MainActivity : AppCompatActivity() {
|
|||
val myApplication = application as MyApplication
|
||||
// 在 Activity 或其他有 Context 的地方
|
||||
logger = KotlinLogger.getInstance(this)
|
||||
screenshotHelper = ScreenshotHelper(this)
|
||||
measureDataDao = MeasureDataDao(myApplication.getDbHelper())
|
||||
measurementDataDao = MeasurementDataDao(myApplication.getDbHelper())
|
||||
initPermission()
|
||||
//初始化视图
|
||||
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)
|
||||
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<RadarPointBean> = 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("")
|
||||
|
|
|
|||
|
|
@ -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 方法
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
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
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
|
@ -791,9 +851,9 @@
|
|||
android:layout_height="40dp"
|
||||
android:layout_marginLeft="2dp"
|
||||
android:layout_marginRight="2dp"
|
||||
android:layout_weight="0.85"
|
||||
android:layout_weight="1"
|
||||
android:text="保存配置"
|
||||
android:textSize="9sp" />
|
||||
android:textSize="10sp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/send2"
|
||||
|
|
@ -801,9 +861,9 @@
|
|||
android:layout_height="40dp"
|
||||
android:layout_marginLeft="2dp"
|
||||
android:layout_marginRight="2dp"
|
||||
android:layout_weight="0.85"
|
||||
android:layout_weight="1"
|
||||
android:text="开始测量"
|
||||
android:textSize="9sp" />
|
||||
android:textSize="10sp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/poll"
|
||||
|
|
@ -811,9 +871,20 @@
|
|||
android:layout_height="40dp"
|
||||
android:layout_marginLeft="2dp"
|
||||
android:layout_marginRight="2dp"
|
||||
android:layout_weight="0.85"
|
||||
android:layout_weight="1"
|
||||
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
|
||||
android:id="@+id/measure"
|
||||
|
|
@ -821,9 +892,9 @@
|
|||
android:layout_height="40dp"
|
||||
android:layout_marginLeft="3dp"
|
||||
android:layout_marginRight="3dp"
|
||||
android:layout_weight="0.85"
|
||||
android:layout_weight="1"
|
||||
android:text="计算弧垂"
|
||||
android:textSize="9sp" />
|
||||
android:textSize="10sp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/clear"
|
||||
|
|
@ -831,9 +902,9 @@
|
|||
android:layout_height="40dp"
|
||||
android:layout_marginLeft="2dp"
|
||||
android:layout_marginRight="2dp"
|
||||
android:layout_weight="0.85"
|
||||
android:layout_weight="1"
|
||||
android:text="清空数据"
|
||||
android:textSize="9sp" />
|
||||
android:textSize="10sp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/video"
|
||||
|
|
@ -845,16 +916,6 @@
|
|||
android:text="视频"
|
||||
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
|
||||
android:id="@+id/record"
|
||||
android:layout_width="0dp"
|
||||
|
|
|
|||
Loading…
Reference in New Issue