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