diff --git a/src/readme.md b/src/readme.md
new file mode 100644
index 0000000..3642a4d
--- /dev/null
+++ b/src/readme.md
@@ -0,0 +1 @@
+srouce code
diff --git a/src/sixaunyi/.idea/deploymentTargetDropDown.xml b/src/sixaunyi/.idea/deploymentTargetDropDown.xml
new file mode 100644
index 0000000..d776305
--- /dev/null
+++ b/src/sixaunyi/.idea/deploymentTargetDropDown.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/sixaunyi/.idea/sonarlint/issuestore/7/7/776a4b5f215e52628a4164ac15ef90fa338360ce b/src/sixaunyi/.idea/sonarlint/issuestore/7/7/776a4b5f215e52628a4164ac15ef90fa338360ce
new file mode 100644
index 0000000..e69de29
diff --git a/src/sixaunyi/.idea/sonarlint/issuestore/9/6/9668392b13e33166876f2a7d3f10eb5405e757ad b/src/sixaunyi/.idea/sonarlint/issuestore/9/6/9668392b13e33166876f2a7d3f10eb5405e757ad
new file mode 100644
index 0000000..1a7779d
--- /dev/null
+++ b/src/sixaunyi/.idea/sonarlint/issuestore/9/6/9668392b13e33166876f2a7d3f10eb5405e757ad
@@ -0,0 +1,33 @@
+
+o
+java:S2293Z"YReplace the type specification in this constructor call with the diamond operator ("<>").(ռ
+K
+java:S1066"/Merge this if statement with the enclosing one.(܈
+K
+java:S1066"/Merge this if statement with the enclosing one.(
+>
+java:S1604"(Make this anonymous inner class a lambda(
+i
+java:S1104%"SMake TV_show a static final constant or non-public and provide accessors if needed.(
+>
+java:S2189""Add an end condition to this loop.(
+>
+java:S2189""Add an end condition to this loop.(
+k java:S116!"VRename this field "receive_Msg" to match the regular expression '^[a-z][a-zA-Z0-9]*$'.(
+g java:S116%"RRename this field "TV_show" to match the regular expression '^[a-z][a-zA-Z0-9]*$'.(
+^
+java:S1659#"CDeclare "total1" and all following declarations on a separate line.(Ƒ
+c java:S100<"NRename this method name to match the regular expression '^[a-z][a-zA-Z0-9]*$'.(͚
+h
+java:S3776~"RRefactor this method to reduce its Cognitive Complexity from 50 to the 15 allowed.(
+u
+java:S2142"^Either re-interrupt this method or rethrow the "InterruptedException" that can be caught here.(
+W java:S125"Use isEmpty() to check whether the collection is empty or not.(
+u
+java:S2142"^Either re-interrupt this method or rethrow the "InterruptedException" that can be caught here.(䠹
+V java:S106"9Replace this use of System.out or System.err by a logger.(81
+A
+java:S1068$"+Remove this unused "button0" private field.(
\ No newline at end of file
diff --git a/src/sixaunyi/.idea/sonarlint/issuestore/index.pb b/src/sixaunyi/.idea/sonarlint/issuestore/index.pb
index 30ab46f..d34424b 100644
--- a/src/sixaunyi/.idea/sonarlint/issuestore/index.pb
+++ b/src/sixaunyi/.idea/sonarlint/issuestore/index.pb
@@ -13,17 +13,11 @@ i
9app/src/main/java/com/example/sixaunyi/FirstFragment.java,0\3\0336633037f72ee431c162e8d6cbc29d1cd6fa5d
?
settings.gradle,0\5\05efc8b1657769a27696d478ded1e95f38737233
-@
-app/build.gradle,f\4\f4a01d6a4fcb971362ec00a83903fd3902f52164
-k
-;app/src/main/java/com/example/sixaunyi/ControlActivity.java,c\9\c99a584c2117ed2df42496451bb97ac1147f5ea0
j
:app/src/main/java/com/example/sixaunyi/SecondFragment.java,1\2\12963d86ac5c2888cc2a9ae459de5665bc06b01f
+j
+:app/src/main/java/com/example/sixaunyi/MapApplication.java,7\7\776a4b5f215e52628a4164ac15ef90fa338360ce
+j
+:app/src/main/java/com/example/sixaunyi/DetectActivity.java,9\6\9668392b13e33166876f2a7d3f10eb5405e757ad
k
-;app/src/main/java/com/example/sixaunyi/SettingActivity.java,2\a\2ab0711d9aa5839cecbb6cf0ed96f5a3f6470de5
-i
-9app/src/main/java/com/example/sixaunyi/VideoActivity.java,7\1\71fd1993763df2214bbdad8cfee650733993fe44
-P
- app/src/main/AndroidManifest.xml,8\c\8c55c3ccc257e5907959013f99656e4c8ec3903e
-h
-8app/src/main/java/com/example/sixaunyi/MainActivity.java,7\c\7c120b7216f76ce98d1573d90803ab36f481640c
\ No newline at end of file
+;app/src/main/java/com/example/sixaunyi/ControlActivity.java,c\9\c99a584c2117ed2df42496451bb97ac1147f5ea0
\ No newline at end of file
diff --git a/src/sixaunyi/app/build.gradle b/src/sixaunyi/app/build.gradle
index 8d7d5e6..1f65d5b 100644
--- a/src/sixaunyi/app/build.gradle
+++ b/src/sixaunyi/app/build.gradle
@@ -46,6 +46,7 @@ dependencies {
implementation 'pub.devrel:easypermissions:3.0.0'
//Material库
implementation 'com.google.android.material:material:1.6.1'
+ implementation 'androidx.media:media:1.3.0'
//定位功能
diff --git a/src/sixaunyi/app/src/main/AndroidManifest.xml b/src/sixaunyi/app/src/main/AndroidManifest.xml
index a874084..844cd7a 100644
--- a/src/sixaunyi/app/src/main/AndroidManifest.xml
+++ b/src/sixaunyi/app/src/main/AndroidManifest.xml
@@ -51,6 +51,7 @@
diff --git a/src/sixaunyi/app/src/main/java/com/example/sixaunyi/LoginActivity.java b/src/sixaunyi/app/src/main/java/com/example/sixaunyi/LoginActivity.java
index 7531f91..5ba1712 100644
--- a/src/sixaunyi/app/src/main/java/com/example/sixaunyi/LoginActivity.java
+++ b/src/sixaunyi/app/src/main/java/com/example/sixaunyi/LoginActivity.java
@@ -1,8 +1,12 @@
package com.example.sixaunyi;
import android.app.Activity;
+import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
@@ -14,6 +18,8 @@ public class LoginActivity extends AppCompatActivity {
private EditText mUsername;
private EditText mPassword;
private Button mLoginButton;
+ private CheckBox Account_remember;
+ private SharedPreferences sharedPreferences;
private Map mUsers = new HashMap<>();
{
mUsers.put("admin", "123456");
@@ -28,6 +34,14 @@ public class LoginActivity extends AppCompatActivity {
mUsername = findViewById(R.id.username);
mPassword = findViewById(R.id.password);
mLoginButton = findViewById(R.id.login);
+ Account_remember = findViewById(R.id.remember_check);
+ sharedPreferences = getSharedPreferences("account", Context.MODE_PRIVATE);
+ String username = sharedPreferences.getString("username", "");
+ String password =sharedPreferences.getString("password", "");
+ boolean isChecked = sharedPreferences.getBoolean("checkbox_state", false);
+ mUsername.setText(username);
+ mPassword.setText(password);
+ Account_remember.setChecked(isChecked);
// 设置登录按钮的点击事件
mLoginButton.setOnClickListener(v -> {
attemptLogin();
@@ -38,15 +52,23 @@ public class LoginActivity extends AppCompatActivity {
String password = mPassword.getText().toString();
boolean if_correct = verifyUser(username,password);
if (if_correct) {
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putString("username", username);
+ editor.putBoolean("checkbox_state", Account_remember.isChecked());
+ editor.apply();
+ if (Account_remember.isChecked()){
+ editor.putString("password", password);
+ }else{
+ editor.putString("password", "");
+ }
+ editor.apply();
Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
- finish(); // 关闭登录界面
} else {
Toast.makeText(this, "用户名或密码错误", Toast.LENGTH_SHORT).show();
}
}
-
private boolean verifyUser(String username, String password){
if (mUsers.containsKey(username) && mUsers.get(username).equals(password)) {
return true;
diff --git a/src/sixaunyi/app/src/main/java/com/example/sixaunyi/MainActivity.java b/src/sixaunyi/app/src/main/java/com/example/sixaunyi/MainActivity.java
index 23fdf80..c2faa9b 100644
--- a/src/sixaunyi/app/src/main/java/com/example/sixaunyi/MainActivity.java
+++ b/src/sixaunyi/app/src/main/java/com/example/sixaunyi/MainActivity.java
@@ -527,6 +527,7 @@ public class MainActivity extends AppCompatActivity implements AMapLocationList
public void changeAct(View view) {
udpReceiveThread.stopListening();
Intent intent = new Intent(MainActivity.this, VideoActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
Bundle b = new Bundle();
b.putString("Angle", MonitorAngle);
b.putFloat("Distance", MonitorDistance);
@@ -640,7 +641,7 @@ public class MainActivity extends AppCompatActivity implements AMapLocationList
Log.d(TAG, "Received data: " + receivedString);
if (receivedString.equals(mExpectedData)) {
Log.i(TAG, "run: 222222222222222222222222222");
- sendCommand("WARNING");
+ sendCommand("WARNING "+String.valueOf(udpMonitorDistance)+" "+udpMonitorAngle);
Context context = MainActivity.this;
showAlert(context,"传感器报警");
addDroneMarker();
diff --git a/src/sixaunyi/app/src/main/java/com/example/sixaunyi/VideoActivity.java b/src/sixaunyi/app/src/main/java/com/example/sixaunyi/VideoActivity.java
index 28d4e07..e640036 100644
--- a/src/sixaunyi/app/src/main/java/com/example/sixaunyi/VideoActivity.java
+++ b/src/sixaunyi/app/src/main/java/com/example/sixaunyi/VideoActivity.java
@@ -17,13 +17,21 @@ import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
+import android.media.MediaCodec;
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecList;
+import android.media.MediaFormat;
+import android.media.MediaScannerConnection;
import android.os.Bundle;
+import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract;
import android.util.AttributeSet;
import android.util.Log;
+import android.view.LayoutInflater;
import android.view.MotionEvent;
+import android.view.Surface;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
@@ -35,19 +43,26 @@ import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.*;
+import java.nio.ByteBuffer;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-
import android.os.Bundle;
import android.widget.ToggleButton;
+
public class VideoActivity extends AppCompatActivity {
private final static String SEND_to_IP = "192.168.39.47"; //填写接收方IP
private final static String Recieve_IP = "192.168.39.47";//填服务器IP,与send_to_IP为同一个
@@ -75,13 +90,19 @@ public class VideoActivity extends AppCompatActivity {
private ImageButton Setting_btn;
private ImageButton TakeOff_btn;
private ImageButton Landing_btn;
+ private ImageButton Record_btn;
private ToggleButton Mode_btn;
+ private ImageButton selfHome_btn;
private String mangle;
private float mdistance;
// 创建一个可缓存的线程池
private ExecutorService mThreadPool = Executors.newCachedThreadPool();
private UdpDataThread warning_thread;
private TextView battery_warning;
+ private ImageButton show_status;
+ private String batteryStatus="未获取";
+ private String speedStatus="未获取";
+ private String distanceStatus="未获取";
//ReceiveData()显示到imageView
//manager部分:打开线程,接收
//model部分:发送视频流
@@ -102,8 +123,28 @@ public class VideoActivity extends AppCompatActivity {
TurnRight_btn = findViewById(R.id.rotate_right_button);
TakeOff_btn = findViewById(R.id.takeoff_button);
Mode_btn = findViewById(R.id.toggleButton2);
+ Record_btn = findViewById(R.id.start_record_button);
Setting_btn = findViewById(R.id.setting_button);
+ Setting_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(VideoActivity.this, SettingActivity.class);
+ startActivity(intent);
+ }
+ });
+ selfHome_btn = findViewById(R.id.self_home);
+ selfHome_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ try {
+ sendCommand("DIRECTHOME");
+ } catch (UnknownHostException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
battery_warning =findViewById(R.id.warning);
+ show_status=findViewById(R.id.show_status_button);
battery_warning.setTextColor(Color.RED);
Animation anim = new AlphaAnimation(0.0f, 1.0f);
anim.setDuration(500); // 闪烁时间间隔
@@ -121,6 +162,13 @@ public class VideoActivity extends AppCompatActivity {
} catch (UnknownHostException e) {
throw new RuntimeException(e);
}
+ show_status.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // 在这里编写 ImageButton 的点击事件处理逻辑
+ showPopup(speedStatus,batteryStatus,distanceStatus);
+ }
+ });
}
private void Control_Button_Init(){
@@ -147,16 +195,16 @@ public class VideoActivity extends AppCompatActivity {
}
});
Forward_btn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- try {
- sendCommand("FORWARD");
- } catch (UnknownHostException e) {
- throw new RuntimeException(e);
- }
- Log.i(TAG, "onClick: FFFFFFFForward");
- }
- });
+ @Override
+ public void onClick(View v) {
+ try {
+ sendCommand("FORWARD");
+ } catch (UnknownHostException e) {
+ throw new RuntimeException(e);
+ }
+ Log.i(TAG, "onClick: FFFFFFFForward");
+ }
+ });
Back_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -234,17 +282,10 @@ public class VideoActivity extends AppCompatActivity {
Log.i(TAG, "onClick: TTTTTTTTTTTTurnRRRRRRRRRRight");
}
});
- Setting_btn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent(VideoActivity.this, SettingActivity.class);
- startActivity(intent);
- }
- });
+
}
private void Condition_Init() throws UnknownHostException {
- sendCommand("AUTO");
ReceiveHandler receiveHandler = new ReceiveHandler();
UdpReceiveThread StreamThread = new UdpReceiveThread(Recieve_IP,RECEIVE_PORT,receiveHandler);
try {
@@ -266,19 +307,22 @@ public class VideoActivity extends AppCompatActivity {
}
} else {
// 执行功能1
- try {
- changetoAuto();
- } catch (UnknownHostException e) {
- throw new RuntimeException(e);
- }
+// try {
+// changetoAuto();
+// } catch (UnknownHostException e) {
+// throw new RuntimeException(e);
+// }
}
}
});
+ Record_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ saveVideo(bp);
+ }
+ });
}
- private void changetoAuto() throws UnknownHostException {
- sendCommand("AUTO");
- }
private void changetoManual() throws UnknownHostException {
sendCommand("STOP");
@@ -291,7 +335,10 @@ public class VideoActivity extends AppCompatActivity {
runOnUiThread(new Runnable() {
@Override
public void run() {
- imgShow.setImageBitmap(bp);
+ int targetWidth = imgShow.getWidth();
+ int targetHeight = imgShow.getHeight();
+ Bitmap scaledBitmap = Bitmap.createScaledBitmap(bp, targetWidth, targetHeight, true);
+ imgShow.setImageBitmap(scaledBitmap);
}
});
}
@@ -304,7 +351,6 @@ public class VideoActivity extends AppCompatActivity {
super.handleMessage(msg);
}
}
-
/*
* UDP数据接受线程
* */
@@ -375,7 +421,6 @@ public class VideoActivity extends AppCompatActivity {
// 创建 DatagramSocket 对象并发送数据报文
DatagramSocket socket = new DatagramSocket();
socket.send(packet);
-
// 关闭 DatagramSocket 对象
socket.close();
} catch (IOException e) {
@@ -393,14 +438,14 @@ public class VideoActivity extends AppCompatActivity {
}
/*
- *UDP数据接收线程
+ *UDP数据接收线程
*/
public class UdpDataThread extends Thread {
private DatagramSocket socket;
private boolean running;
private byte[] buffer;
private static final int BUFFER_SIZE = 1024; // 设置接收缓冲区大小
-
+ private JSONObject jsonObject;
public UdpDataThread() {
buffer = new byte[BUFFER_SIZE];
}
@@ -408,21 +453,26 @@ public class VideoActivity extends AppCompatActivity {
@Override
public void run() {
running = true;
-
try {
socket = new DatagramSocket(6666); // 设置接收端口号
while (running) {
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
- String receivedData = new String(packet.getData(), 0, packet.getLength());
- if (receivedData.equals("电量低于10%")) {
- battery_warning.setText(receivedData);}else{
+ String receivedData = new String(packet.getData(), 0, packet.getLength(), "UTF-8");
+ jsonObject = new JSONObject(receivedData);
+ batteryStatus = jsonObject.getString("battery");
+ speedStatus = jsonObject.getString("speed");
+ distanceStatus = jsonObject.getString("distance");
+ if (batteryStatus.equals("10")) {
+ battery_warning.setText("电量仅剩"+batteryStatus);}else{
battery_warning.setText("");
}
- System.out.println("接收到数据:" + receivedData);
+ System.out.println("接收到数据:" + batteryStatus);
+ System.out.println("接收到数据:" + speedStatus);
+ System.out.println("接收到数据:" + distanceStatus);
// 在这里处理收到的数据,可以根据实际需求进行解析或其他操作
}
- } catch (IOException e) {
+ } catch (IOException | JSONException e) {
e.printStackTrace();
} finally {
if (socket != null) {
@@ -435,43 +485,129 @@ public class VideoActivity extends AppCompatActivity {
running = false;
}
}
- //初始化UDP发送线程
-// private static void sendCommand(String Sendstr) throws UnknownHostException {
-// InetAddress sendIP = InetAddress.getByName(SEND_to_IP); // 目标 IP 地址
-// int sendPort = 8888; // 目标端口号
-// byte[] sendData = Sendstr.getBytes(); // 要发送的数据
-// UdpSendThread sendCommandThread = new UdpSendThread(sendIP, sendPort, sendData); // 创建新的线程对象
-// sendCommandThread.start(); // 启动线程发送数据
-// }
-
-
-
-
-
-//设置按钮
-// public void showDialog(View view) {
-// Dialog dialog = new Dialog(VideoActivity.this);
-// dialog.setContentView(R.layout.dialog_takeoff);
-//
-// SlideUnlockView slideUnlockView = (SlideUnlockView) dialog.findViewById(R.id.slide_unlock_view);
-// slideUnlockView.setOnUnlockListener(new SlideUnlockView.OnUnlockListener() {
-// @Override
-// public void onUnlock() {
-// // 在用户滑动解锁后执行操作
-//// try {
-//// sendCommand("TAKEOFF"+"___"+angle+"___"+String.valueOf(distance));
-//// } catch (UnknownHostException e) {
-//// throw new RuntimeException(e);
-//// }
-// UdpReceiveThread udpReceiveThread = new UdpReceiveThread();
-// udpReceiveThread.start();
-//
-// Log.i(TAG, "onClick: 2222222222222222222222222");
-//
-// }
-// });
-// dialog.show();
-// }
+
+ private String findEncoderCodecName(String mimeType) {
+ MediaCodecList codecList = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
+ int numCodecs = codecList.getCodecInfos().length;
+ for (int i = 0; i < numCodecs; i++) {
+ MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i);
+ if (!codecInfo.isEncoder()) {
+ continue;
+ }
+ String[] types = codecInfo.getSupportedTypes();
+ for (String type : types) {
+ if (type.equalsIgnoreCase(mimeType)) {
+ return codecInfo.getName();
+ }
+ }
+ }
+ return null;
+ }
+
+ MediaCodec codec;
+ private void saveVideo(Bitmap videoBitmap) {
+ try {
+ String codecName = findEncoderCodecName(MediaFormat.MIMETYPE_VIDEO_AVC);
+ if (codecName != null) {
+ codec = MediaCodec.createByCodecName(codecName);
+
+ // 根据视频尺寸设置编码器参数
+ MediaFormat format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, videoBitmap.getWidth(), videoBitmap.getHeight());
+ format.setInteger(MediaFormat.KEY_BIT_RATE, 2000000);
+ format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
+ format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
+ format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);
+
+ // 配置编码器并启动
+ codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
+ Surface inputSurface = codec.createInputSurface();
+ codec.start();
+
+ // 创建保存视频的路径和文件名
+ String fileName = "video_" + System.currentTimeMillis() + ".mp4";
+ String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) + "/" + fileName;
+ File videoFile = new File(filePath);
+
+ FileOutputStream fileOutputStream = new FileOutputStream(videoFile);
+ BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
+
+ // 循环编码每一帧
+ boolean isInputDone = false;
+ boolean isOutputDone = false;
+ while (!isOutputDone) {
+ if (!isInputDone) {
+ int index = codec.dequeueInputBuffer(10000);
+ if (index >= 0) {
+ ByteBuffer inputBuffer = codec.getInputBuffer(index);
+ inputBuffer.clear();
+ Canvas canvas = inputSurface.lockCanvas(null);
+ canvas.drawBitmap(videoBitmap, 0, 0, null);
+ inputSurface.unlockCanvasAndPost(canvas);
+ codec.queueInputBuffer(index, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
+ isInputDone = true;
+ }
+ }
+
+ MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
+ int outputIndex = codec.dequeueOutputBuffer(bufferInfo, 10000);
+ if (outputIndex >= 0) {
+ ByteBuffer outputBuffer = codec.getOutputBuffer(outputIndex);
+ byte[] outData = new byte[bufferInfo.size];
+ outputBuffer.get(outData);
+ bufferedOutputStream.write(outData);
+ codec.releaseOutputBuffer(outputIndex, false);
+ }
+
+ if ((bufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+ isOutputDone = true;
+ }
+ }
+
+ // 关闭文件流
+ bufferedOutputStream.flush();
+ bufferedOutputStream.close();
+ fileOutputStream.close();
+
+ // 通知媒体库更新文件
+ MediaScannerConnection.scanFile(this, new String[]{videoFile.getAbsolutePath()}, null, null);
+
+ Toast.makeText(this, "视频保存成功", Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(this, "无法找到支持的视频编码器", Toast.LENGTH_SHORT).show();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (codec != null) {
+ codec.stop();
+ codec.release();
+ }
+ }
+ }
+
+ public void showPopup(String speedStatus,String batteryStatus,String distanceStatus) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ LayoutInflater inflater = getLayoutInflater();
+ View dialogView = inflater.inflate(R.layout.custom_dialog, null);
+ TextView speedstatus = dialogView.findViewById(R.id.speed);
+ speedstatus.setText("当前速度为:"+speedStatus);
+ TextView batterystatus = dialogView.findViewById(R.id.battery);
+ batterystatus.setText("当前电量为:"+batteryStatus);
+ TextView distancestatus = dialogView.findViewById(R.id.distance);
+ distancestatus.setText("当前距离为:"+distanceStatus);
+ builder.setView(dialogView);
+ builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // 点击确定按钮后的操作
+ dialog.dismiss();
+ }
+ });
+
+ AlertDialog dialog = builder.create();
+ dialog.show();
+ }
+
//////////////////////////////滑动开关//////////////////////////////
public static class SlideUnlockView extends View{
@@ -653,4 +789,25 @@ public class VideoActivity extends AppCompatActivity {
return super.onTouchEvent(event);
}
}
+
+ private void shutdown(){
+ warning_thread.stopThread();
+ mThreadPool.shutdownNow();
+ }
+
+ @Override
+ public void onBackPressed() {
+ // 返回到 MainActivity
+ shutdown();
+ Intent intent = new Intent(this, MainActivity.class);
+ startActivity(intent);
+ finish(); // 结束 VideoActivity
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ // 关闭线程
+ shutdown();
+ }
}
\ No newline at end of file
diff --git a/src/sixaunyi/app/src/main/res/drawable-v24/selfhome.png b/src/sixaunyi/app/src/main/res/drawable-v24/selfhome.png
new file mode 100644
index 0000000..db334af
Binary files /dev/null and b/src/sixaunyi/app/src/main/res/drawable-v24/selfhome.png differ
diff --git a/src/sixaunyi/app/src/main/res/layout-land/activity_control.xml b/src/sixaunyi/app/src/main/res/layout-land/activity_control.xml
index e57105c..e51286e 100644
--- a/src/sixaunyi/app/src/main/res/layout-land/activity_control.xml
+++ b/src/sixaunyi/app/src/main/res/layout-land/activity_control.xml
@@ -246,6 +246,17 @@
android:text="ToggleButton"
android:textOff=""
android:textOn="" />
+
@@ -52,4 +53,4 @@
-
+
\ No newline at end of file
diff --git a/src/sixaunyi/app/src/main/res/layout/custom_dialog.xml b/src/sixaunyi/app/src/main/res/layout/custom_dialog.xml
new file mode 100644
index 0000000..7d1743f
--- /dev/null
+++ b/src/sixaunyi/app/src/main/res/layout/custom_dialog.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
diff --git a/src/sixaunyi/app/src/main/res/values/strings.xml b/src/sixaunyi/app/src/main/res/values/strings.xml
index 26b2329..38d37e2 100644
--- a/src/sixaunyi/app/src/main/res/values/strings.xml
+++ b/src/sixaunyi/app/src/main/res/values/strings.xml
@@ -19,6 +19,7 @@
查看状态
降落按钮
降落按钮
+ 自动返航按钮
Hello first fragment
Hello second fragment. Arg: %1$s
\ No newline at end of file