diff --git a/sixaunyi/.gitignore b/sixaunyi/.gitignore
new file mode 100644
index 0000000..aa724b7
--- /dev/null
+++ b/sixaunyi/.gitignore
@@ -0,0 +1,15 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/sixaunyi/.idea/.gitignore b/sixaunyi/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/sixaunyi/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/sixaunyi/.idea/compiler.xml b/sixaunyi/.idea/compiler.xml
new file mode 100644
index 0000000..fb7f4a8
--- /dev/null
+++ b/sixaunyi/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/.idea/deploymentTargetDropDown.xml b/sixaunyi/.idea/deploymentTargetDropDown.xml
new file mode 100644
index 0000000..d776305
--- /dev/null
+++ b/sixaunyi/.idea/deploymentTargetDropDown.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/.idea/gradle.xml b/sixaunyi/.idea/gradle.xml
new file mode 100644
index 0000000..a2d7c21
--- /dev/null
+++ b/sixaunyi/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/.idea/misc.xml b/sixaunyi/.idea/misc.xml
new file mode 100644
index 0000000..cc4873f
--- /dev/null
+++ b/sixaunyi/.idea/misc.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/.idea/sonarlint/issuestore/0/3/0336633037f72ee431c162e8d6cbc29d1cd6fa5d b/sixaunyi/.idea/sonarlint/issuestore/0/3/0336633037f72ee431c162e8d6cbc29d1cd6fa5d
new file mode 100644
index 0000000..9fac4f7
--- /dev/null
+++ b/sixaunyi/.idea/sonarlint/issuestore/0/3/0336633037f72ee431c162e8d6cbc29d1cd6fa5d
@@ -0,0 +1,5 @@
+
+C
+java:S1604"(Make this anonymous inner class a lambda(
+P
+java:S1161":Add the "@Override" annotation above this method signature(
\ No newline at end of file
diff --git a/sixaunyi/.idea/sonarlint/issuestore/0/5/05efc8b1657769a27696d478ded1e95f38737233 b/sixaunyi/.idea/sonarlint/issuestore/0/5/05efc8b1657769a27696d478ded1e95f38737233
new file mode 100644
index 0000000..e69de29
diff --git a/sixaunyi/.idea/sonarlint/issuestore/1/2/12963d86ac5c2888cc2a9ae459de5665bc06b01f b/sixaunyi/.idea/sonarlint/issuestore/1/2/12963d86ac5c2888cc2a9ae459de5665bc06b01f
new file mode 100644
index 0000000..5d32c84
--- /dev/null
+++ b/sixaunyi/.idea/sonarlint/issuestore/1/2/12963d86ac5c2888cc2a9ae459de5665bc06b01f
@@ -0,0 +1,5 @@
+
+>
+java:S1604"(Make this anonymous inner class a lambda(ʆ
+P
+java:S1161":Add the "@Override" annotation above this method signature(
\ No newline at end of file
diff --git a/sixaunyi/.idea/sonarlint/issuestore/2/a/2afbb999f001938c88fa43fc2ef52abf0f8213e4 b/sixaunyi/.idea/sonarlint/issuestore/2/a/2afbb999f001938c88fa43fc2ef52abf0f8213e4
new file mode 100644
index 0000000..e69de29
diff --git a/sixaunyi/.idea/sonarlint/issuestore/7/7/776a4b5f215e52628a4164ac15ef90fa338360ce b/sixaunyi/.idea/sonarlint/issuestore/7/7/776a4b5f215e52628a4164ac15ef90fa338360ce
new file mode 100644
index 0000000..e69de29
diff --git a/sixaunyi/.idea/sonarlint/issuestore/7/e/7e2dc811cc280952b5bbbfb02aa0e4fa16a75d7c b/sixaunyi/.idea/sonarlint/issuestore/7/e/7e2dc811cc280952b5bbbfb02aa0e4fa16a75d7c
new file mode 100644
index 0000000..e69de29
diff --git a/sixaunyi/.idea/sonarlint/issuestore/8/9/892f839083a73d776402535dde27e522288853c9 b/sixaunyi/.idea/sonarlint/issuestore/8/9/892f839083a73d776402535dde27e522288853c9
new file mode 100644
index 0000000..e69de29
diff --git a/sixaunyi/.idea/sonarlint/issuestore/9/e/9e08934d811afe28fbc77aaa3c0d747b94348db9 b/sixaunyi/.idea/sonarlint/issuestore/9/e/9e08934d811afe28fbc77aaa3c0d747b94348db9
new file mode 100644
index 0000000..e69de29
diff --git a/sixaunyi/.idea/sonarlint/issuestore/f/b/fbe448ebfc3eb2d4e308f6b8b043666f5b57235e b/sixaunyi/.idea/sonarlint/issuestore/f/b/fbe448ebfc3eb2d4e308f6b8b043666f5b57235e
new file mode 100644
index 0000000..e69de29
diff --git a/sixaunyi/.idea/sonarlint/issuestore/index.pb b/sixaunyi/.idea/sonarlint/issuestore/index.pb
new file mode 100644
index 0000000..bfc72ba
--- /dev/null
+++ b/sixaunyi/.idea/sonarlint/issuestore/index.pb
@@ -0,0 +1,19 @@
+
+z
+Japp/src/androidTest/java/com/example/sixaunyi/ExampleInstrumentedTest.java,7\e\7e2dc811cc280952b5bbbfb02aa0e4fa16a75d7c
+F
+app/proguard-rules.pro,9\e\9e08934d811afe28fbc77aaa3c0d747b94348db9
+X
+(gradle/wrapper/gradle-wrapper.properties,f\b\fbe448ebfc3eb2d4e308f6b8b043666f5b57235e
+A
+gradle.properties,2\a\2afbb999f001938c88fa43fc2ef52abf0f8213e4
+k
+;app/src/test/java/com/example/sixaunyi/ExampleUnitTest.java,8\9\892f839083a73d776402535dde27e522288853c9
+i
+9app/src/main/java/com/example/sixaunyi/FirstFragment.java,0\3\0336633037f72ee431c162e8d6cbc29d1cd6fa5d
+?
+settings.gradle,0\5\05efc8b1657769a27696d478ded1e95f38737233
+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
\ No newline at end of file
diff --git a/sixaunyi/app/.gitignore b/sixaunyi/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/sixaunyi/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/sixaunyi/app/build.gradle b/sixaunyi/app/build.gradle
new file mode 100644
index 0000000..1f65d5b
--- /dev/null
+++ b/sixaunyi/app/build.gradle
@@ -0,0 +1,58 @@
+plugins {
+ id 'com.android.application'
+}
+
+android {
+ compileSdk 32
+
+ defaultConfig {
+ applicationId "com.example.sixaunyi"
+ minSdk 22
+ targetSdk 32
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+ buildFeatures {
+ viewBinding true
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.3.0'
+ implementation 'com.google.android.material:material:1.4.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
+ implementation 'androidx.navigation:navigation-fragment:2.3.5'
+ implementation 'androidx.navigation:navigation-ui:2.3.5'
+ implementation 'com.google.android.gms:play-services-maps:17.0.1'
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ //Google推荐的EasyPermission库
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //Material库
+ implementation 'com.google.android.material:material:1.6.1'
+ implementation 'androidx.media:media:1.3.0'
+
+
+ //定位功能
+ /*implementation 'com.amap.api:location:latest.integration'
+ //搜索功能
+ implementation 'com.amap.api:search:latest.integration'*/
+
+
+}
\ No newline at end of file
diff --git a/sixaunyi/app/libs/AMap3DMap_9.6.0_AMapSearch_9.5.0_AMapLocation_6.2.0_20230116.jar b/sixaunyi/app/libs/AMap3DMap_9.6.0_AMapSearch_9.5.0_AMapLocation_6.2.0_20230116.jar
new file mode 100644
index 0000000..88f5bd5
Binary files /dev/null and b/sixaunyi/app/libs/AMap3DMap_9.6.0_AMapSearch_9.5.0_AMapLocation_6.2.0_20230116.jar differ
diff --git a/sixaunyi/app/libs/arm64-v8a/libAMapSDK_MAP_v9_6_0.so b/sixaunyi/app/libs/arm64-v8a/libAMapSDK_MAP_v9_6_0.so
new file mode 100644
index 0000000..55afb6b
Binary files /dev/null and b/sixaunyi/app/libs/arm64-v8a/libAMapSDK_MAP_v9_6_0.so differ
diff --git a/sixaunyi/app/libs/armeabi-v7a/libAMapSDK_MAP_v9_6_0.so b/sixaunyi/app/libs/armeabi-v7a/libAMapSDK_MAP_v9_6_0.so
new file mode 100644
index 0000000..de0b88d
Binary files /dev/null and b/sixaunyi/app/libs/armeabi-v7a/libAMapSDK_MAP_v9_6_0.so differ
diff --git a/sixaunyi/app/libs/armeabi/libAMapSDK_MAP_v9_6_0.so b/sixaunyi/app/libs/armeabi/libAMapSDK_MAP_v9_6_0.so
new file mode 100644
index 0000000..de0b88d
Binary files /dev/null and b/sixaunyi/app/libs/armeabi/libAMapSDK_MAP_v9_6_0.so differ
diff --git a/sixaunyi/app/libs/x86_64/libAMapSDK_MAP_v9_6_0.so b/sixaunyi/app/libs/x86_64/libAMapSDK_MAP_v9_6_0.so
new file mode 100644
index 0000000..7283219
Binary files /dev/null and b/sixaunyi/app/libs/x86_64/libAMapSDK_MAP_v9_6_0.so differ
diff --git a/sixaunyi/app/proguard-rules.pro b/sixaunyi/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/sixaunyi/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/sixaunyi/app/release/app-release.apk b/sixaunyi/app/release/app-release.apk
new file mode 100644
index 0000000..cc0d509
Binary files /dev/null and b/sixaunyi/app/release/app-release.apk differ
diff --git a/sixaunyi/app/release/output-metadata.json b/sixaunyi/app/release/output-metadata.json
new file mode 100644
index 0000000..1f9a9ed
--- /dev/null
+++ b/sixaunyi/app/release/output-metadata.json
@@ -0,0 +1,20 @@
+{
+ "version": 3,
+ "artifactType": {
+ "type": "APK",
+ "kind": "Directory"
+ },
+ "applicationId": "com.example.sixaunyi",
+ "variantName": "release",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "attributes": [],
+ "versionCode": 1,
+ "versionName": "1.0",
+ "outputFile": "app-release.apk"
+ }
+ ],
+ "elementType": "File"
+}
\ No newline at end of file
diff --git a/sixaunyi/app/src/androidTest/java/com/example/sixaunyi/ExampleInstrumentedTest.java b/sixaunyi/app/src/androidTest/java/com/example/sixaunyi/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..a75e967
--- /dev/null
+++ b/sixaunyi/app/src/androidTest/java/com/example/sixaunyi/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.example.sixaunyi;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("com.example.sixaunyi", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/AndroidManifest.xml b/sixaunyi/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..fa4c93f
--- /dev/null
+++ b/sixaunyi/app/src/main/AndroidManifest.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/java/com/example/sixaunyi/FirstFragment.java b/sixaunyi/app/src/main/java/com/example/sixaunyi/FirstFragment.java
new file mode 100644
index 0000000..39bc90a
--- /dev/null
+++ b/sixaunyi/app/src/main/java/com/example/sixaunyi/FirstFragment.java
@@ -0,0 +1,46 @@
+package com.example.sixaunyi;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.navigation.fragment.NavHostFragment;
+import com.example.sixaunyi.databinding.FragmentFirstBinding;
+
+public class FirstFragment extends Fragment {
+
+private FragmentFirstBinding binding;
+
+ @Override
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState
+ ) {
+
+ binding = FragmentFirstBinding.inflate(inflater, container, false);
+ return binding.getRoot();
+
+ }
+
+ public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ binding.buttonFirst.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ NavHostFragment.findNavController(FirstFragment.this)
+ .navigate(R.id.action_FirstFragment_to_SecondFragment);
+ }
+ });
+ }
+
+@Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ binding = null;
+ }
+
+}
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/java/com/example/sixaunyi/LoginActivity.java b/sixaunyi/app/src/main/java/com/example/sixaunyi/LoginActivity.java
new file mode 100644
index 0000000..5ba1712
--- /dev/null
+++ b/sixaunyi/app/src/main/java/com/example/sixaunyi/LoginActivity.java
@@ -0,0 +1,79 @@
+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;
+import java.util.HashMap;
+import java.util.Map;
+
+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");
+ mUsers.put("tiequan", "8731");
+ mUsers.put("zhenghaoyuan", "6666");
+ }
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_login);
+ // 获取输入框和按钮的实例
+ 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();
+ });
+ }
+ private void attemptLogin() {
+ String username = mUsername.getText().toString();
+ 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);
+ } 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;
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/sixaunyi/app/src/main/java/com/example/sixaunyi/MainActivity.java b/sixaunyi/app/src/main/java/com/example/sixaunyi/MainActivity.java
new file mode 100644
index 0000000..87953a6
--- /dev/null
+++ b/sixaunyi/app/src/main/java/com/example/sixaunyi/MainActivity.java
@@ -0,0 +1,791 @@
+package com.example.sixaunyi;
+
+import static androidx.constraintlayout.motion.utils.Oscillator.TAG;
+
+import static java.lang.Math.PI;
+
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.Manifest;
+import android.annotation.SuppressLint;
+import android.content.Intent;
+import android.graphics.BitmapFactory;
+import android.location.Location;
+import android.nfc.Tag;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.View;
+import android.widget.ImageButton;
+import android.widget.TextView;
+import android.widget.Toast;
+import android.animation.Animator;
+import android.animation.ValueAnimator;
+import com.amap.api.location.AMapLocation;
+import com.amap.api.location.AMapLocationClient;
+import com.amap.api.location.AMapLocationClientOption;
+import com.amap.api.location.AMapLocationListener;
+import com.amap.api.maps.AMap;
+import com.amap.api.maps.AMapUtils;
+import com.amap.api.maps.LocationSource;
+import com.amap.api.maps.MapView;
+import com.amap.api.maps.model.BitmapDescriptorFactory;
+import com.amap.api.maps.model.LatLng;
+import com.amap.api.maps.model.Marker;
+import com.amap.api.maps.model.MarkerOptions;
+import com.amap.api.maps.model.animation.Animation;
+import com.amap.api.maps.model.animation.TranslateAnimation;
+import com.amap.api.services.core.AMapException;
+import com.amap.api.services.core.LatLonPoint;
+import com.amap.api.services.core.PoiItem;
+import com.amap.api.services.geocoder.GeocodeResult;
+import com.amap.api.services.geocoder.GeocodeSearch;
+import com.amap.api.services.geocoder.RegeocodeAddress;
+import com.amap.api.services.geocoder.RegeocodeQuery;
+import com.amap.api.services.geocoder.RegeocodeResult;
+import com.amap.api.services.poisearch.PoiResult;
+import com.amap.api.services.poisearch.PoiSearch;
+import com.google.android.material.floatingactionbutton.FloatingActionButton;
+import android.view.animation.LinearInterpolator;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.SocketException;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import pub.devrel.easypermissions.AfterPermissionGranted;
+import pub.devrel.easypermissions.EasyPermissions;
+
+public class MainActivity extends AppCompatActivity implements AMapLocationListener, LocationSource,
+ AMap.OnMapLongClickListener, GeocodeSearch.OnGeocodeSearchListener, AMap.OnMarkerDragListener,
+ AMap.OnMarkerClickListener{
+
+ //请求权限码
+ private static final int REQUEST_PERMISSIONS = 9527;
+ //声明AMapLocationClient类对象
+ public AMapLocationClient mLocationClient = null;
+ //声明AMapLocationClientOption对象
+ public AMapLocationClientOption mLocationOption = null;
+ private MapView mapView = null;
+ private String city;
+ private LatLng Current_latlng;
+ //地图控制器*********非常重要!!!!!!
+ private AMap aMap = null;
+ //位置更改监听
+ private LocationSource.OnLocationChangedListener mListener;
+ //地理编码搜索
+ private GeocodeSearch geocodeSearch;
+ //解析成功标识码
+ private static final int PARSE_SUCCESS_CODE = 1000;
+ //城市码
+ private String cityCode = null;
+ //浮动按钮
+ private FloatingActionButton fabPOI;
+ //浮动按钮 清空地图标点
+ private FloatingActionButton ClearMarker_btn;
+ //浮动按钮 更换活动
+ private ImageButton ChangeAct_btn;
+ //标点列表
+ private List markerList = new ArrayList<>();
+ //标识参数类
+ private MarkerOptions markerOption = new MarkerOptions();
+ //
+ private DatagramSocket reveSocket;
+ private String value;
+ private ExecutorService mThreadPool = Executors.newCachedThreadPool();
+ //private ActivityResultLauncher launcher;
+
+ ////////////////////////////可修改部分/////////////////////////////
+ private final LatLng Monitorlatlng = new LatLng(28.258348849051746,113.04552182879037);
+ private final static String Recieve_IP = "192.168.39.46";
+ private final static int RECEIVE_PORT = 9987;
+ private final static String SEND_to_IP = "192.168.39.47";
+ private final static int SEND_PORT = 8888;
+ /////////////////////////////////////////////////////////////////
+ private InetAddress serverAddr;
+ private String Angle;
+ private String MonitorAngle;
+ private float distance;
+ private float MonitorDistance;
+ private UdpReceiveThread udpReceiveThread;
+
+ @SuppressLint("MissingInflatedId")
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ if (savedInstanceState != null) {
+ // 从保存的状态数据中恢复状态
+ value = savedInstanceState.getString("key");
+ }
+
+ ClearMarker_btn = findViewById(R.id.clearMarker_btn);
+ ChangeAct_btn = findViewById(R.id.change_btn);
+ ChangeAct_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ changeAct();
+ }
+ });
+ initLocation();
+ //初始化地图
+ initMap(savedInstanceState);
+ //检查安卓版本
+ checkingAndroidVersion();
+
+ udpReceiveThread = new UdpReceiveThread();
+ udpReceiveThread.startListening();
+ addSensorMarker(Monitorlatlng);
+ }
+ /**
+ * 检查Android版本
+ */
+ private void checkingAndroidVersion() {
+ //Android6.0及以上先获取权限再定位
+ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
+ requestPermission();
+ }
+ //Android6.0以下直接定位
+ else {
+ //直接定位
+ mLocationClient.startLocation();
+ }
+ }
+ /**
+ * 动态请求权限
+ */
+ @AfterPermissionGranted(REQUEST_PERMISSIONS)
+ private void requestPermission() {
+ String[] permissions = {
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE
+ };
+
+ if (EasyPermissions.hasPermissions(this, permissions)) {
+ //有权限
+ //******
+ Log.d(TAG, "已获得权限,可以定位啦!");
+ showMsg("已获得权限,可以定位啦!");
+ //开始定位
+ mLocationClient.startLocation();
+ } else {
+ //false 无权限
+ EasyPermissions.requestPermissions(this, "需要权限", REQUEST_PERMISSIONS, permissions);
+ }
+ }
+ //提示框显示文本
+ private void showMsg(String msg) {
+ Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
+ }
+ /**
+ * 请求权限结果
+ * @param requestCode
+ * @param permissions
+ * @param grantResults
+ */
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ //设置请求到的权限结果
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
+ }
+
+ /******** 初始化定位 *******/
+ private void initLocation() {
+ //初始化定位
+ try {
+ mLocationClient = new AMapLocationClient(getApplicationContext());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ if (mLocationClient != null) {
+ //设置定位回调监听
+ mLocationClient.setLocationListener(this);
+ //初始化AMapLocationClientOption对象
+ mLocationOption = new AMapLocationClientOption();
+ //设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。
+ mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
+ //获取最近3s内精度最高的一次定位结果:
+ //设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。
+ mLocationOption.setOnceLocationLatest(true);
+ //设置是否返回地址信息(默认返回地址信息)
+ mLocationOption.setNeedAddress(true);
+ //设置定位请求超时时间,单位是毫秒,默认30000毫秒,建议超时时间不要低于8000毫秒。
+ mLocationOption.setHttpTimeOut(20000);
+ //关闭缓存机制,高精度定位会产生缓存。
+ mLocationOption.setLocationCacheEnable(false);
+ //给定位客户端对象设置定位参数
+ mLocationClient.setLocationOption(mLocationOption);
+ }
+ }
+ /**
+ * 初始化地图
+ * @param savedInstanceState
+ */
+ private void initMap(Bundle savedInstanceState) {
+ //因为mapView为null,所以要加上这个括号,不可常规的mapView.findViewById
+ mapView = (MapView) findViewById(R.id.map_view);
+ //在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图
+ mapView.onCreate(savedInstanceState);
+ //初始化地图控制器对象
+ aMap = mapView.getMap();
+ // 设置定位监听
+ aMap.setLocationSource(this);
+ // 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
+ aMap.setMyLocationEnabled(true);
+ //设置最小缩放等级为16 ,缩放级别范围为[3, 20]
+ aMap.setMinZoomLevel(18);
+ //设置地图标志点击事件
+ aMap.setOnMarkerClickListener(this);
+ //设置地图标志拖拽事件
+ aMap.setOnMarkerDragListener(this);
+ //开启室内地图
+ //aMap.showIndoorMap(true);
+ //设置地图长按事件
+ aMap.setOnMapLongClickListener(this);
+ //构造 GeocodeSearch 对象
+ try {
+ geocodeSearch = new GeocodeSearch(this);
+ } catch (AMapException e) {
+ e.printStackTrace();
+ }
+ //设置监听
+ geocodeSearch.setOnGeocodeSearchListener(this);
+ }
+
+ /**
+ * 激活定位
+ */
+ @Override
+ public void activate(OnLocationChangedListener onLocationChangedListener) {
+ mListener = onLocationChangedListener;
+ if (mLocationClient == null) {
+ mLocationClient.startLocation();//启动定位
+ }
+ }
+ /**
+ * 停止定位
+ */
+ @Override
+ public void deactivate() {
+ mListener = null;
+ if (mLocationClient != null) {
+ mLocationClient.stopLocation();
+ mLocationClient.onDestroy();
+ }
+ mLocationClient = null;
+ }
+
+
+ @Override
+ public void onLocationChanged(AMapLocation aMapLocation) {
+ if (aMapLocation != null) {
+ //定位成功
+ if (aMapLocation.getErrorCode() == 0) {
+ //地址
+ String address = aMapLocation.getAddress();
+ //城市赋值
+ city = aMapLocation.getCity();
+ //当前位置经纬度坐标
+ Current_latlng = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude());
+
+ //获取纬度
+ double latitude = aMapLocation.getLatitude();
+ //获取经度
+ double longitude = aMapLocation.getLongitude();
+
+ Log.d("MainActivity", aMapLocation.getCity());
+ showMsg(address);
+ //停止定位后,本地定位服务并不会被销毁
+ mLocationClient.stopLocation();
+ if (mListener != null) {
+ // 显示系统图标
+ mListener.onLocationChanged(aMapLocation);
+ }
+ //显示浮动按钮
+ fabPOI.show();
+ //赋值
+ cityCode = aMapLocation.getCityCode();
+ }
+ else {
+ //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
+ Log.e("AmapError", "location Error, ErrCode:"
+ + aMapLocation.getErrorCode() + ", errInfo:"
+ + aMapLocation.getErrorInfo());
+ }
+ }
+ }
+ /***********************Activity相关函数,其中添加了保证mapView与activity同步相关函数******************/
+ @Override
+ protected void onResume() {
+ super.onResume();
+ //在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
+ mapView.onResume();
+ }
+ @Override
+ protected void onPause() {
+ super.onPause();
+ //在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
+ mapView.onPause();
+ }
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putString("key", value);
+ //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
+ mapView.onSaveInstanceState(outState);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ //销毁定位客户端,同时销毁本地定位服务。
+ if (mLocationClient != null) {
+ mLocationClient.onDestroy();
+ }
+ //在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
+ mapView.onDestroy();
+ }
+ /******************************************************************/
+ /* * * 长按地图响应函数 * * */
+ //LatLng 为高德地图包自带的存储坐标对象
+ @Override
+ public void onMapLongClick(LatLng latLng) {
+ distance = AMapUtils.calculateLineDistance(Current_latlng,latLng);
+ Angle = calcAngle(Current_latlng.latitude, Current_latlng.longitude, latLng.latitude,latLng.longitude);
+ MonitorAngle = calcAngle(Current_latlng.latitude, Current_latlng.longitude, 113.05370390725032,28.256794281117525);
+ //showMsg("长按了地图,经度:"+latLng.longitude+",纬度:"+latLng.latitude);
+ Log.i(TAG, String.valueOf(latLng.longitude));
+ Log.i(TAG, String.valueOf(latLng.latitude));
+ showMsg("直线距离:"+distance+"米"+"角度"+Angle);
+ //坐标转地址113.05370390725032 28.256794281117525
+ latlonToAddress(latLng);
+ //添加标点
+ addMarker(latLng);
+ }
+
+ /**
+ * 添加地图标点
+ * @param latLng
+ */
+ private void addMarker(LatLng latLng) {
+ //显示浮动按钮
+ ClearMarker_btn.show();
+ //添加标点
+ Marker marker = aMap.addMarker(markerOption
+ .position(latLng)
+ .draggable(true)
+ //标点图标
+ .icon(BitmapDescriptorFactory.
+ fromBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.img)))
+ //备注
+ .title("路径点")
+ .snippet("距离:")
+
+ );
+ marker.showInfoWindow();
+ markerList.add(marker);
+ }
+
+ // 添加传感器标点
+ private Marker sensorMarker = null;
+
+ private void addSensorMarker(LatLng latLng) {
+ // 显示浮动按钮
+ // 添加传感器标点
+ MarkerOptions sensorMarkerOption = new MarkerOptions();
+ sensorMarker = aMap.addMarker(sensorMarkerOption
+ .position(latLng)
+ .draggable(false)
+ // 标点图标
+ .icon(BitmapDescriptorFactory.
+ fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.sensor)))
+ // 备注
+ .title("传感器")
+
+ );
+ sensorMarker.showInfoWindow();
+ }
+
+ // 添加无人机标点
+ private Marker droneMarker = null;
+
+ private void addDroneMarker() {
+ // 添加无人机标点
+ MarkerOptions droneMarkerOption = new MarkerOptions();
+ droneMarker = aMap.addMarker(droneMarkerOption
+ .position(Current_latlng)
+ .draggable(false)
+ // 标点图标
+ .icon(BitmapDescriptorFactory.
+ fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.drone)))
+ // 备注
+ .title("无人机")
+ .snippet("距离:")
+ );
+ droneMarker.showInfoWindow();
+ }
+
+ // 移动无人机标点到传感器标点并显示平移动画
+ public static class SmoothMoveUtil {
+
+ private Marker droneMarker;
+ private LatLng startLatLng;
+ private LatLng endLatLng;
+ private long duration;
+
+ public SmoothMoveUtil(Marker marker) {
+ this.droneMarker = marker;
+ }
+ public void moveDroneMarker(LatLng sensorLatLng, long duration) {
+ if (droneMarker != null) {
+ startLatLng = droneMarker.getPosition();
+ endLatLng = sensorLatLng;
+ this.duration = duration;
+ // 开始动画
+ startSmoothMove();
+ }
+ }
+
+ private void startSmoothMove() {
+ LatLngInterpolator latLngInterpolator = new LatLngInterpolator.LinearFixed();
+ ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);
+ valueAnimator.setDuration(duration);
+ valueAnimator.setInterpolator(new LinearInterpolator());
+ valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ float fraction = animation.getAnimatedFraction();
+ LatLng newPosition = latLngInterpolator.interpolate(fraction, startLatLng, endLatLng);
+ droneMarker.setPosition(newPosition);
+ }
+ });
+ valueAnimator.addListener(new Animator.AnimatorListener() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ // 动画结束
+ droneMarker.setPosition(endLatLng);
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+ }
+ });
+ valueAnimator.start();
+ }
+
+ // LatLng 插值器接口——算经纬度过渡用的
+ public interface LatLngInterpolator {
+ LatLng interpolate(float fraction, LatLng a, LatLng b);
+
+ class LinearFixed implements LatLngInterpolator {
+ @Override
+ public LatLng interpolate(float fraction, LatLng a, LatLng b) {
+ double lat = (b.latitude - a.latitude) * fraction + a.latitude;
+ double lngDelta = b.longitude - a.longitude;
+
+ // 如果跨越了 180 度经度,则进行调整
+ if (Math.abs(lngDelta) > 180) {
+ lngDelta -= Math.signum(lngDelta) * 360;
+ }
+
+ double lng = lngDelta * fraction + a.longitude;
+ return new LatLng(lat, lng);
+ }
+ }
+ }
+ }
+
+ /**
+ * 清空地图Marker
+ * @param view
+ */
+ public void clearAllMarker(View view) {
+ if (markerList != null && markerList.size()>0){
+ for (Marker markerItem : markerList) {
+ markerItem.remove();
+ }
+ }
+ ClearMarker_btn.hide();
+ }
+
+ public void moveDrone(){
+ SmoothMoveUtil moveUtil = new SmoothMoveUtil(droneMarker);
+ long time = (long) MonitorDistance/2*1000;
+ moveUtil.moveDroneMarker(Monitorlatlng,time);
+ }
+
+ public void changeAct() {
+ udpReceiveThread.stopListening();
+ Intent intent = new Intent(MainActivity.this, VideoActivity.class);
+ Bundle b = new Bundle();
+ b.putString("Angle", MonitorAngle);
+ b.putFloat("Distance", MonitorDistance);
+ intent.putExtras(b);
+ int requestCode = 1; // 可以是任何非负整数
+ startActivity(intent);
+
+ }
+
+ /**
+ * Marker点击事件
+ *
+ * @param marker
+ * @return
+ */
+ @Override
+ public boolean onMarkerClick(Marker marker) {
+ Log.d(TAG,"点击了标点");
+ //显示InfoWindow
+ /*
+ if (!marker.isInfoWindowShown()) {
+ //显示
+ marker.showInfoWindow();
+ } else {
+ //隐藏
+ marker.hideInfoWindow();
+ }
+ */
+ return true;
+ }
+
+ /**
+ * 开始拖动
+ * @param marker
+ */
+ @Override
+ public void onMarkerDragStart(Marker marker) {
+ Log.d(TAG,"开始拖动");
+ }
+
+ /**
+ * 拖动中
+ * @param marker
+ */
+ @Override
+ public void onMarkerDrag(Marker marker) {
+ Log.d(TAG,"拖动中");
+ }
+
+ /**
+ * 拖动完成
+ * @param marker
+ */
+ @Override
+ public void onMarkerDragEnd(Marker marker) {
+ Log.d(TAG,"拖动完成");
+ }
+
+
+ /* * * 通过坐标获取地址 * * *
+ *
+ * @param latLng
+ */
+ private void latlonToAddress(LatLng latLng) {
+ //位置点 通过经纬度进行构建
+ LatLonPoint latLonPoint = new LatLonPoint(latLng.latitude, latLng.longitude);
+ //逆编码查询 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
+ RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 20, GeocodeSearch.AMAP);
+ //异步获取地址信息
+ geocodeSearch.getFromLocationAsyn(query);
+ }
+ /*****************************坐标转地址****************************
+ * @param regeocodeResult
+ * @param rCode
+ */
+ @Override
+ public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int rCode) {
+ if(rCode == PARSE_SUCCESS_CODE){
+ RegeocodeAddress regeocodeAddress = regeocodeResult.getRegeocodeAddress();
+ //显示解析后的地址
+ showMsg("地址:"+regeocodeAddress.getFormatAddress());
+ } else {
+ showMsg("获取地址失败");
+ }
+ }
+
+ @Override
+ public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
+
+ }
+
+ public class UdpReceiveThread extends Thread {
+ private static final String TAG = "UdpReceiveThread";
+ private static final int mRECEIVE_PORT = RECEIVE_PORT;
+ private boolean mRunning;
+ private String mReceiveIp = Recieve_IP;
+ private String mExpectedData = "Motion detected!";
+ private float udpMonitorDistance = MonitorDistance;
+ private String udpMonitorAngle = MonitorAngle;
+
+ @Override
+ public void run() {
+ try {
+ DatagramSocket socket = new DatagramSocket(mRECEIVE_PORT);
+ byte[] buffer = new byte[1024];
+ DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
+ while (mRunning) {
+ Log.i(TAG, "run: 111111111111111111");
+ socket.receive(packet);
+ byte[] data = packet.getData();
+ String receivedString = new String(data, 0, packet.getLength());
+ Log.d(TAG, "Received data: " + receivedString);
+ if (receivedString.equals(mExpectedData)) {
+ Log.i(TAG, "run: 222222222222222222222222222");
+ sendCommand("WARNING "+String.valueOf(udpMonitorDistance)+" "+udpMonitorAngle);
+ Context context = MainActivity.this;
+ showAlert(context,"传感器报警");
+ addDroneMarker();
+ moveDrone();
+ mRunning = false;
+
+
+ }
+ }
+ socket.close();
+
+ } catch (SocketException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ public void showAlert(Context context, String message) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(context);
+ builder.setTitle("警告");
+ builder.setMessage(message);
+ builder.setIcon(R.drawable.warning);
+ builder.setPositiveButton("确定", null);
+
+ AlertDialog dialog = builder.create();
+ dialog.show();
+ }
+
+ public void startListening() {
+ mRunning = true;
+ start();
+ }
+
+ public void stopListening() {
+ mRunning = false;
+ }
+ }
+
+ //以北为0度
+ public static String calcAngle(Double centerLat, Double centerLon, Double anotherLat, Double anotherLon) {
+ //差值
+ double subLat = anotherLat - centerLat;
+ double subLon = anotherLon - centerLon;
+ double angle = 0;
+
+ if (subLat == 0) {
+ //纬度差值为0 表示两点在同一高度 此时点必然在x轴右侧 或者 x轴左侧
+ if (subLon > 0) {
+ //x轴右侧
+ angle = 90;
+ } else if (subLon < 0) {
+ //x轴左侧
+ angle = 270;
+ }
+ } else if (subLon == 0) {
+ //经度差值为0 说明点在y轴上方或者y轴下方
+ if (subLat > 0) {
+ //y轴上方
+ angle = 0;
+ } else if (subLat < 0) {
+ //y轴下方
+ angle = 180;
+ }
+ } else {
+ //根据tan的值,求角度 subLon不能为0 纬度差值 除以 经度差值 = tan的值
+ double v = subLat / subLon;
+ angle = Math.atan(v) * 180 / PI;
+ //angle的值在-180到180之间
+ System.out.println("未处理的角度值:" + (angle));
+ //第二种求角度的方法
+ //angle = Math.atan2(subLat,subLon) * 180 / PI ;
+ //判断数据在第几象限
+ //1、正切小于0 在二四象限
+ if (angle < 0) {
+ if (subLon > 0) {
+ //此时的点在中心点的右下角
+ angle = Math.abs(angle)+ 90;
+ } else if (subLon < 0) {
+ //此时的点在中心点的左上角
+ angle = Math.abs(angle) + 270;
+ }
+ }
+ //2、正切大于0 在一三象限
+ else if (angle > 0) {
+ if (subLon > 0) {
+ //此时的点在中心点的右上角 360-angle
+ angle = 90-angle;
+ } else if (subLat < 0) {
+ // 此时的点在中心点的左下角
+ angle = 270-angle;
+ }
+ }
+ }
+ return String.valueOf(angle);
+ }
+ /*
+ *UDP发送线程
+ */
+ class SendRunnable implements Runnable {
+ byte[] mData;
+ InetAddress mAddress;
+ int mPort;
+
+ public SendRunnable(byte[] data, InetAddress address, int port) {
+ mData = data;
+ mAddress = address;
+ mPort = port;
+ }
+
+ @Override
+ public void run() {
+ try {
+ // 创建发送数据报文
+ DatagramPacket packet = new DatagramPacket(mData, mData.length, mAddress, mPort);
+ // 创建 DatagramSocket 对象并发送数据报文
+ DatagramSocket socket = new DatagramSocket();
+ socket.send(packet);
+
+ // 关闭 DatagramSocket 对象
+ socket.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ //封装好的接口函数
+ private void sendCommand(String str) throws UnknownHostException {
+ byte[] sendData = str.getBytes();
+ InetAddress address = InetAddress.getByName(SEND_to_IP);
+ SendRunnable sendRunnable1 = new SendRunnable(sendData, address, SEND_PORT);
+ mThreadPool.execute(sendRunnable1);
+ }
+
+}
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/java/com/example/sixaunyi/MapApplication.java b/sixaunyi/app/src/main/java/com/example/sixaunyi/MapApplication.java
new file mode 100644
index 0000000..8d60cb8
--- /dev/null
+++ b/sixaunyi/app/src/main/java/com/example/sixaunyi/MapApplication.java
@@ -0,0 +1,27 @@
+package com.example.sixaunyi;
+
+
+import android.app.Application;
+import android.content.Context;
+
+import com.amap.api.location.AMapLocationClient;
+import com.amap.api.maps.MapsInitializer;
+import com.amap.api.services.core.ServiceSettings;
+
+public class MapApplication extends Application {
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ Context context = this;
+ //定位隐私政策同意
+ AMapLocationClient.updatePrivacyShow(context,true,true);
+ AMapLocationClient.updatePrivacyAgree(context,true);
+ //地图隐私政策同意
+ MapsInitializer.updatePrivacyShow(context,true,true);
+ MapsInitializer.updatePrivacyAgree(context,true);
+ //搜索隐私政策同意
+ ServiceSettings.updatePrivacyShow(context,true,true);
+ ServiceSettings.updatePrivacyAgree(context,true);
+ }
+}
diff --git a/sixaunyi/app/src/main/java/com/example/sixaunyi/SecondFragment.java b/sixaunyi/app/src/main/java/com/example/sixaunyi/SecondFragment.java
new file mode 100644
index 0000000..9e2740a
--- /dev/null
+++ b/sixaunyi/app/src/main/java/com/example/sixaunyi/SecondFragment.java
@@ -0,0 +1,46 @@
+package com.example.sixaunyi;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.navigation.fragment.NavHostFragment;
+import com.example.sixaunyi.databinding.FragmentSecondBinding;
+
+public class SecondFragment extends Fragment {
+
+private FragmentSecondBinding binding;
+
+ @Override
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState
+ ) {
+
+ binding = FragmentSecondBinding.inflate(inflater, container, false);
+ return binding.getRoot();
+
+ }
+
+ public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ binding.buttonSecond.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ NavHostFragment.findNavController(SecondFragment.this)
+ .navigate(R.id.action_SecondFragment_to_FirstFragment);
+ }
+ });
+ }
+
+@Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ binding = null;
+ }
+
+}
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/java/com/example/sixaunyi/SettingActivity.java b/sixaunyi/app/src/main/java/com/example/sixaunyi/SettingActivity.java
new file mode 100644
index 0000000..fc201aa
--- /dev/null
+++ b/sixaunyi/app/src/main/java/com/example/sixaunyi/SettingActivity.java
@@ -0,0 +1,181 @@
+package com.example.sixaunyi;
+
+import static androidx.constraintlayout.motion.utils.Oscillator.TAG;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.preference.PreferenceManager;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.CompoundButton;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.SeekBar;
+import android.widget.Switch;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+public class SettingActivity extends AppCompatActivity {
+
+ private final static String SEND_to_IP = "192.168.39.47";
+ private SeekBar Speed_btn;
+ private Switch Battery_btn;
+ private ImageButton return_btn;
+ private final static int SEND_PORT = 8888;
+ private ExecutorService mThreadPool = Executors.newCachedThreadPool();
+ private Switch photo_btn;
+ private Context context;
+ private SharedPreferences sharedPreferences;
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_setting);
+ Speed_btn= findViewById(R.id.speed);
+ return_btn=findViewById(R.id.returns);
+ photo_btn = findViewById(R.id.photo);
+ Battery_btn = findViewById(R.id.Battery_warning);
+ TextView tvProgress = (TextView) findViewById(R.id.tvProgress);
+ sharedPreferences = getSharedPreferences("control_state", MODE_PRIVATE);
+ boolean photo_btn_state= sharedPreferences.getBoolean("photo_btn_state", false);
+ photo_btn.setChecked(photo_btn_state);
+ // 恢复SeekBar状态
+ int speedProgress = sharedPreferences.getInt("speed_progress", 0);
+ Speed_btn.setProgress(speedProgress);
+ tvProgress.setText(String.valueOf(speedProgress+10));
+ photo_btn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ // 保存Switch状态
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putBoolean("photo_btn_state", isChecked);
+ editor.apply();
+ }
+ });
+ Speed_btn.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ tvProgress.setText(String.valueOf(progress+10));
+ int speed=progress+10;
+ String s = "SPEED " + Integer.toString(speed);
+ try {
+ sendCommand(s);
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+ }
+
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putInt("speed_progress", progress);
+ editor.apply();
+
+ }
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {}
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {}
+
+ });
+ Battery_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (Battery_btn.isChecked()) {
+ try {
+ sendCommand("battery_warning");
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+ }
+ }else
+ {
+ try {
+ sendCommand("warning_cancel");
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ });
+ return_btn.setOnClickListener(new View.OnClickListener(){
+ public void onClick(View v) {
+ Intent intent = new Intent(SettingActivity.this, VideoActivity.class);
+ // 启动目标 Activity
+ finish();
+ }
+ });
+ photo_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (photo_btn.isChecked()) {
+ try {
+ sendCommand("photo_high");
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+ }
+ }else
+ {
+ try {
+ sendCommand("photo_low");
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ });
+ }
+ /*
+ * UDP数据发送线程
+ * */
+ class SendRunnable implements Runnable {
+ byte[] mData;
+ InetAddress mAddress;
+ int mPort;
+ public SendRunnable(byte[] data, InetAddress address, int port) {
+ mData = data;
+ mAddress = address;
+ mPort = port;
+ }
+
+ @Override
+ public void run() {
+ try {
+ // 创建发送数据报文
+ DatagramPacket packet = new DatagramPacket(mData, mData.length, mAddress, mPort);
+ // 创建 DatagramSocket 对象并发送数据报文
+ DatagramSocket socket = new DatagramSocket();
+ socket.send(packet);
+
+ // 关闭 DatagramSocket 对象
+ socket.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /*封装函数*/
+ private void sendCommand(String str) throws UnknownHostException {
+ byte[] sendData = str.getBytes();
+ InetAddress address = InetAddress.getByName(SEND_to_IP);
+ SendRunnable sendRunnable1 = new SendRunnable(sendData, address, SEND_PORT);
+ mThreadPool.execute(sendRunnable1);
+ }
+
+
+}
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/java/com/example/sixaunyi/VideoActivity.java b/sixaunyi/app/src/main/java/com/example/sixaunyi/VideoActivity.java
new file mode 100644
index 0000000..88c0ab5
--- /dev/null
+++ b/sixaunyi/app/src/main/java/com/example/sixaunyi/VideoActivity.java
@@ -0,0 +1,813 @@
+package com.example.sixaunyi;
+
+import static androidx.constraintlayout.motion.utils.Oscillator.TAG;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+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;
+import android.view.animation.Animation;
+import android.widget.Button;
+import android.widget.CompoundButton;
+import android.widget.ImageButton;
+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为同一个
+ private final static int SEND_PORT = 8888; //发送端口号
+ private final static int RECEIVE_PORT = 9999; //接收端口号
+ private static boolean listenStatus = true; //接收线程的循环标识
+ private byte[] buf;
+ static Bitmap bp;
+ private DatagramSocket reveSocket;
+ private DatagramSocket sendSocket;
+ private static InetAddress serverAddr;
+ private SendHandler sendHandler = new SendHandler();
+ private ReceiveHandler receiveHandler = new ReceiveHandler();
+ private Button Trans_to_Detect;
+ private ImageView imgShow;
+ private Button btn;
+ private ImageButton Forward_btn;
+ private ImageButton Back_btn;
+ private ImageButton Left_btn;
+ private ImageButton Right_btn;
+ private ImageButton Down_btn;
+ private ImageButton Up_btn;
+ private ImageButton TurnLeft_btn;
+ private ImageButton TurnRight_btn;
+ 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部分:发送视频流
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_control);
+ imgShow = findViewById(R.id.imageView);
+ Forward_btn = findViewById(R.id.forward_button);
+ Back_btn = findViewById(R.id.backward_button);
+ Left_btn = findViewById(R.id.left_button);
+ Right_btn = findViewById(R.id.right_button);
+ Down_btn = findViewById(R.id.down_button);
+ Up_btn = findViewById(R.id.up_button);
+ TurnLeft_btn = findViewById(R.id.rotate_left_button);
+ Landing_btn = findViewById(R.id.landing_button);
+ 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); // 闪烁时间间隔
+ anim.setStartOffset(20);
+ anim.setRepeatMode(Animation.REVERSE);
+ anim.setRepeatCount(Animation.INFINITE);
+ battery_warning.startAnimation(anim);
+ Intent i = getIntent();
+ mdistance = i.getFloatExtra("Distance",0);
+ mangle = i.getStringExtra("Angle");
+ warning_thread = new UdpDataThread();
+ warning_thread.start();
+ try {
+ Condition_Init();
+ } 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(){
+
+ TakeOff_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ try {
+ sendCommand("TAKEOFF");
+ } catch (UnknownHostException e) {
+ throw new RuntimeException(e);
+ }
+ Log.i(TAG, "onClick: TTTTTTTTTTTTTTakeoff");
+ }
+ });
+ Landing_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ try {
+ sendCommand("LAND");
+ } catch (UnknownHostException e) {
+ throw new RuntimeException(e);
+ }
+ Log.i(TAG, "onClick: LLLLLLLLLLLLLLLLLLand");
+ }
+ });
+ 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");
+ }
+ });
+ Back_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ try {
+ sendCommand("BACKWORD");
+ } catch (UnknownHostException e) {
+ throw new RuntimeException(e);
+ }
+ Log.i(TAG, "onClick: BBBBBBBBackward");
+ }
+ });
+ Left_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ try {
+ sendCommand("LEFT");
+ } catch (UnknownHostException e) {
+ throw new RuntimeException(e);
+ }
+ Log.i(TAG, "onClick: LLLLLLLLLLLLeft");
+ }
+ });
+ Right_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ try {
+ sendCommand("RIGHT");
+ } catch (UnknownHostException e) {
+ throw new RuntimeException(e);
+ }
+ Log.i(TAG, "onClick: RRRRRRRRRRight");
+ }
+ });
+ Down_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ try {
+ sendCommand("DOWN");
+ } catch (UnknownHostException e) {
+ throw new RuntimeException(e);
+ }
+ Log.i(TAG, "onClick: DDDDDDDDDown");
+ }
+ });
+ Up_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ try {
+ sendCommand("UP");
+ } catch (UnknownHostException e) {
+ throw new RuntimeException(e);
+ }
+ Log.i(TAG, "onClick: UUUUUUUUUUUUUUp");
+ }
+ });
+ TurnLeft_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ try {
+ sendCommand("TURN_LEFT");
+ } catch (UnknownHostException e) {
+ throw new RuntimeException(e);
+ }
+ Log.i(TAG, "onClick: TTTTTTTTTurnLLLLLLLLLLeft");
+ }
+ });
+ TurnRight_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ try {
+ sendCommand("TURN_RIGHT");
+ } catch (UnknownHostException e) {
+ throw new RuntimeException(e);
+ }
+ Log.i(TAG, "onClick: TTTTTTTTTTTTurnRRRRRRRRRRight");
+ }
+ });
+
+ }
+
+ private void Condition_Init() throws UnknownHostException {
+ ReceiveHandler receiveHandler = new ReceiveHandler();
+ UdpReceiveThread StreamThread = new UdpReceiveThread(Recieve_IP,RECEIVE_PORT,receiveHandler);
+ try {
+ StreamThread.startListen();
+ StreamThread.start();
+ } catch (SocketException | UnknownHostException e) {
+ e.printStackTrace();
+ }
+ Mode_btn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (isChecked) {
+ // 执行功能2
+ try {
+ changetoManual();
+ Control_Button_Init();
+ } catch (UnknownHostException e) {
+ throw new RuntimeException(e);
+ }
+ } else {
+ // 执行功能1
+// 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 changetoManual() throws UnknownHostException {
+ sendCommand("STOP");
+ }
+
+ class ReceiveHandler extends Handler{
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what == 1) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ int targetWidth = imgShow.getWidth();
+ int targetHeight = imgShow.getHeight();
+ Bitmap scaledBitmap = Bitmap.createScaledBitmap(bp, targetWidth, targetHeight, true);
+ imgShow.setImageBitmap(scaledBitmap);
+ }
+ });
+ }
+ }
+ }
+
+ class SendHandler extends Handler {
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+ }
+ }
+ /*
+ * UDP数据接受线程
+ * */
+ public class UdpReceiveThread extends Thread {
+ private DatagramSocket reveSocket;
+ private String Recieve_IP;
+ private int RECEIVE_PORT;
+ private Handler receiveHandler;
+
+ public UdpReceiveThread(String ip, int port, Handler handler) {
+ this.Recieve_IP = ip;
+ this.RECEIVE_PORT = port;
+ this.receiveHandler = handler;
+ }
+
+ public void startListen() throws SocketException, UnknownHostException {
+ reveSocket = new DatagramSocket(RECEIVE_PORT);
+ }
+
+ public void stopListen() {
+ if (reveSocket != null && !reveSocket.isClosed()) {
+ listenStatus = false;
+ //reveSocket.close();
+ }
+ }
+
+ @Override
+ public void run() {
+ try {
+ InetAddress serverAddr = InetAddress.getByName(Recieve_IP);
+
+ while (listenStatus) {
+ byte[] inBuf = new byte[1024 * 1024];
+ DatagramPacket inPacket = new DatagramPacket(inBuf, inBuf.length);
+ reveSocket.receive(inPacket);
+ if (!inPacket.getAddress().equals(serverAddr)) {
+ throw new IOException("未知名的报文");
+ }
+ ByteArrayInputStream in = new ByteArrayInputStream(inPacket.getData());
+ receiveHandler.sendEmptyMessage(1);
+ bp = BitmapFactory.decodeStream(in);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /*
+ * UDP数据发送线程,Runnable方法
+ * */
+ class SendRunnable implements Runnable {
+ byte[] mData;
+ InetAddress mAddress;
+ int mPort;
+
+ public SendRunnable(byte[] data, InetAddress address, int port) {
+ mData = data;
+ mAddress = address;
+ mPort = port;
+ }
+
+ @Override
+ public void run() {
+ try {
+ // 创建发送数据报文
+ DatagramPacket packet = new DatagramPacket(mData, mData.length, mAddress, mPort);
+ // 创建 DatagramSocket 对象并发送数据报文
+ DatagramSocket socket = new DatagramSocket();
+ socket.send(packet);
+ // 关闭 DatagramSocket 对象
+ socket.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /*封装函数*/
+ private void sendCommand(String str) throws UnknownHostException {
+ byte[] sendData = str.getBytes();
+ InetAddress address = InetAddress.getByName(SEND_to_IP);
+ SendRunnable sendRunnable1 = new SendRunnable(sendData, address, SEND_PORT);
+ mThreadPool.execute(sendRunnable1);
+ }
+
+ /*
+ *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];
+ }
+
+ @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(), "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("接收到数据:" + batteryStatus);
+ System.out.println("接收到数据:" + speedStatus);
+ System.out.println("接收到数据:" + distanceStatus);
+ // 在这里处理收到的数据,可以根据实际需求进行解析或其他操作
+ }
+ } catch (IOException | JSONException e) {
+ e.printStackTrace();
+ } finally {
+ if (socket != null) {
+ socket.close();
+ }
+ }
+ }
+
+ public void stopThread() {
+ running = false;
+ }
+ }
+
+ 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{
+
+ private final int BG_COLOR = Color.parseColor("#2D2E32"); // 背景颜色
+ private static final int GUIDE_TEXT_COLOR = Color.WHITE; // 引导文本颜色
+ private static final int GUIDE_TEXT_SIZE = 100; // 引导文本大小
+ private static final int INDICATOR_COLOR = Color.WHITE; // 指示器颜色
+ private static final int INDICATOR_RADIUS = 40; // 指示器半径
+ private static final int INDICATOR_GAP = 300; // 指示器间距
+ private static final int ARROW_COLOR = Color.WHITE; // 箭头颜色
+ private static final int ARROW_SIZE = 20; // 箭头大小
+
+ private static final int STATE_LOCKED = 0; // 锁屏状态
+ private static final int STATE_DRAGGING = 1; // 拖动状态
+ private static final int STATE_UNLOCKED = 2; // 解锁状态
+
+ private Paint mPaint;
+ private Path mPath;
+ private int mViewWidth;
+ private int mViewHeight;
+ private int mIndicatorCount;
+ private int mCurrentIndex;
+ private float mLastX;
+ private boolean mIsUnlocked;
+ private int mState;
+
+ private OnUnlockListener mOnUnlockListener;
+
+ public abstract static class OnUnlockListener {
+ public class SimpleOnUnlockListener extends OnUnlockListener {
+ @Override
+ public void onUnlock() {
+ // 默认空实现
+ }
+ }
+ public abstract void onUnlock();
+ }
+
+ public void setOnUnlockListener(OnUnlockListener listener) {
+ this.mOnUnlockListener = listener;
+ }
+
+ public SlideUnlockView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init();
+ }
+
+ private void init() {
+ mPaint = new Paint();
+ mPaint.setAntiAlias(true); // 抗锯齿
+ mPaint.setStyle(Paint.Style.FILL);
+
+ mPath = new Path();
+
+ mIsUnlocked = false;
+ mState = STATE_LOCKED;
+
+ // 指示器个数为 3
+ mIndicatorCount = 3;
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ mViewWidth = w;
+ mViewHeight = h;
+ }
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ switch (mState) {
+ case STATE_LOCKED:
+ drawGuideText(canvas);
+ drawIndicatorCircles(canvas);
+ break;
+ case STATE_DRAGGING:
+ drawUnlockPath(canvas);
+ drawUnlockArrow(canvas);
+ break;
+ case STATE_UNLOCKED:
+ if (mOnUnlockListener != null) {
+ mOnUnlockListener.onUnlock();
+ }
+ break;
+ }
+ }
+
+ private void drawGuideText(Canvas canvas) {
+ mPaint.setColor(BG_COLOR);
+ canvas.drawRect(0, 0, mViewWidth, mViewHeight, mPaint);
+
+ mPaint.setColor(GUIDE_TEXT_COLOR);
+ mPaint.setTextSize(GUIDE_TEXT_SIZE);
+ String guideText = "即将起飞";
+ float textWidth = mPaint.measureText(guideText);
+ float textX = mViewWidth / 2 - textWidth / 2;
+ float textY = mViewHeight * 2 / 3;
+ canvas.drawText(guideText, textX, textY, mPaint);
+ }
+
+ private void drawIndicatorCircles(Canvas canvas) {
+ mPaint.setColor(INDICATOR_COLOR);
+ float cy = mViewHeight / 2;
+ float startX = mViewWidth / 2 - INDICATOR_GAP * (mIndicatorCount - 1) / 2;
+ float radius = INDICATOR_RADIUS;
+ Path path = new Path();
+ for (int i = 0; i < mIndicatorCount; i++) {
+ float cx = startX + INDICATOR_GAP * i;
+ path.addCircle(cx, cy, radius, Path.Direction.CCW);
+ }
+ canvas.drawPath(path, mPaint);
+ }
+
+ private void drawUnlockPath(Canvas canvas) {
+ mPaint.setColor(INDICATOR_COLOR);
+ float cy = mViewHeight / 2;
+ float startX = mViewWidth / 2 - INDICATOR_GAP * (mIndicatorCount - 1) / 2;
+ float currentX = Math.max(Math.min(mLastX, mViewWidth - INDICATOR_RADIUS), startX + INDICATOR_GAP * mCurrentIndex);
+ Path path = new Path();
+ path.moveTo(startX + INDICATOR_RADIUS, cy);
+ path.lineTo(currentX - INDICATOR_RADIUS, cy);
+ path.arcTo(new RectF(currentX - INDICATOR_RADIUS, cy - INDICATOR_RADIUS,
+ currentX + INDICATOR_RADIUS, cy + INDICATOR_RADIUS), -90, 180);
+ path.lineTo(startX + INDICATOR_GAP * (mIndicatorCount - 1), cy);
+ canvas.drawPath(path, mPaint);
+ }
+
+ private void drawUnlockArrow(Canvas canvas) {
+ mPaint.setColor(ARROW_COLOR);
+ mPaint.setStyle(Paint.Style.STROKE);
+ mPaint.setStrokeWidth(5);
+ Path arrowPath = new Path();
+ float x = Math.max(Math.min(mLastX, mViewWidth - INDICATOR_RADIUS - ARROW_SIZE), mViewWidth / 2 + INDICATOR_GAP * (mCurrentIndex - 1));
+ float y = mViewHeight / 2;
+ arrowPath.moveTo(x - ARROW_SIZE, y - ARROW_SIZE);
+ arrowPath.lineTo(x, y);
+ arrowPath.lineTo(x - ARROW_SIZE, y + ARROW_SIZE);
+ canvas.drawPath(arrowPath, mPaint);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ float x = event.getX();
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ if (mState == STATE_LOCKED) {
+ mState = STATE_DRAGGING;
+ mCurrentIndex = 0;
+ invalidate();
+ return true;
+ }
+ break;
+ case MotionEvent.ACTION_MOVE:
+ if (mState == STATE_DRAGGING) {
+ mLastX = x;
+ int index = (int) ((x - mViewWidth / 2) / INDICATOR_GAP);
+ index = Math.max(Math.min(index, mIndicatorCount - 1), 0);
+ if (index != mCurrentIndex) {
+ mCurrentIndex = index;
+ invalidate();
+ }
+ if (mCurrentIndex == mIndicatorCount - 1) {
+ mState = STATE_UNLOCKED;
+ mIsUnlocked = true;
+ }
+ return true;
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
+ if (mState == STATE_DRAGGING) {
+ mState = STATE_LOCKED;
+ mCurrentIndex = 0;
+ invalidate();
+ return true;
+ }
+ break;
+ }
+ return super.onTouchEvent(event);
+ }
+ }
+
+ private void shutdown(){
+ warning_thread.stopThread();
+ mThreadPool.shutdownNow();
+ }
+
+ @Override
+ public void onBackPressed() {
+ // 返回到 MainActivity
+ Intent intent = new Intent(this, MainActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ startActivity(intent);
+ finish(); // 结束 VideoActivity
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ // 关闭线程
+ shutdown();
+ }
+}
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/jniLibs/arm64-v8a/libAMapSDK_MAP_v9_6_0.so b/sixaunyi/app/src/main/jniLibs/arm64-v8a/libAMapSDK_MAP_v9_6_0.so
new file mode 100644
index 0000000..55afb6b
Binary files /dev/null and b/sixaunyi/app/src/main/jniLibs/arm64-v8a/libAMapSDK_MAP_v9_6_0.so differ
diff --git a/sixaunyi/app/src/main/jniLibs/armeabi-v7a/libAMapSDK_MAP_v9_6_0.so b/sixaunyi/app/src/main/jniLibs/armeabi-v7a/libAMapSDK_MAP_v9_6_0.so
new file mode 100644
index 0000000..de0b88d
Binary files /dev/null and b/sixaunyi/app/src/main/jniLibs/armeabi-v7a/libAMapSDK_MAP_v9_6_0.so differ
diff --git a/sixaunyi/app/src/main/jniLibs/armeabi/libAMapSDK_MAP_v9_6_0.so b/sixaunyi/app/src/main/jniLibs/armeabi/libAMapSDK_MAP_v9_6_0.so
new file mode 100644
index 0000000..de0b88d
Binary files /dev/null and b/sixaunyi/app/src/main/jniLibs/armeabi/libAMapSDK_MAP_v9_6_0.so differ
diff --git a/sixaunyi/app/src/main/jniLibs/x86_64/libAMapSDK_MAP_v9_6_0.so b/sixaunyi/app/src/main/jniLibs/x86_64/libAMapSDK_MAP_v9_6_0.so
new file mode 100644
index 0000000..7283219
Binary files /dev/null and b/sixaunyi/app/src/main/jniLibs/x86_64/libAMapSDK_MAP_v9_6_0.so differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/auto.png b/sixaunyi/app/src/main/res/drawable-v24/auto.png
new file mode 100644
index 0000000..1a2d922
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/auto.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/down.png b/sixaunyi/app/src/main/res/drawable-v24/down.png
new file mode 100644
index 0000000..17d8d52
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/down.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/sixaunyi/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/sixaunyi/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/drawable-v24/icon_clear.png b/sixaunyi/app/src/main/res/drawable-v24/icon_clear.png
new file mode 100644
index 0000000..6c04847
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/icon_clear.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/img.png b/sixaunyi/app/src/main/res/drawable-v24/img.png
new file mode 100644
index 0000000..49aa26d
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/img.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/landing.png b/sixaunyi/app/src/main/res/drawable-v24/landing.png
new file mode 100644
index 0000000..54d1eb6
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/landing.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/manual.png b/sixaunyi/app/src/main/res/drawable-v24/manual.png
new file mode 100644
index 0000000..b4918b5
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/manual.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/movebackward.png b/sixaunyi/app/src/main/res/drawable-v24/movebackward.png
new file mode 100644
index 0000000..8f9d61a
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/movebackward.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/moveforward.png b/sixaunyi/app/src/main/res/drawable-v24/moveforward.png
new file mode 100644
index 0000000..f1c091b
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/moveforward.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/moveleft.png b/sixaunyi/app/src/main/res/drawable-v24/moveleft.png
new file mode 100644
index 0000000..d8c5e28
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/moveleft.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/moveright.png b/sixaunyi/app/src/main/res/drawable-v24/moveright.png
new file mode 100644
index 0000000..f5ea78f
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/moveright.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/record.png b/sixaunyi/app/src/main/res/drawable-v24/record.png
new file mode 100644
index 0000000..aa8b4ec
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/record.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/returns.png b/sixaunyi/app/src/main/res/drawable-v24/returns.png
new file mode 100644
index 0000000..dbf7443
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/returns.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/selfhome.png b/sixaunyi/app/src/main/res/drawable-v24/selfhome.png
new file mode 100644
index 0000000..db334af
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/selfhome.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/setting.png b/sixaunyi/app/src/main/res/drawable-v24/setting.png
new file mode 100644
index 0000000..70fcdc5
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/setting.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/shoudong.png b/sixaunyi/app/src/main/res/drawable-v24/shoudong.png
new file mode 100644
index 0000000..9d09198
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/shoudong.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/status.png b/sixaunyi/app/src/main/res/drawable-v24/status.png
new file mode 100644
index 0000000..3fa8562
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/status.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/takeoff.png b/sixaunyi/app/src/main/res/drawable-v24/takeoff.png
new file mode 100644
index 0000000..f9da59b
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/takeoff.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/turnleft.png b/sixaunyi/app/src/main/res/drawable-v24/turnleft.png
new file mode 100644
index 0000000..313b309
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/turnleft.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/turnright.png b/sixaunyi/app/src/main/res/drawable-v24/turnright.png
new file mode 100644
index 0000000..9e1c988
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/turnright.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/up.png b/sixaunyi/app/src/main/res/drawable-v24/up.png
new file mode 100644
index 0000000..6ac00d0
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/up.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/warning.png b/sixaunyi/app/src/main/res/drawable-v24/warning.png
new file mode 100644
index 0000000..7b4eb89
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/warning.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/wurenji.png b/sixaunyi/app/src/main/res/drawable-v24/wurenji.png
new file mode 100644
index 0000000..ad89365
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/wurenji.png differ
diff --git a/sixaunyi/app/src/main/res/drawable-v24/zidongkongzhi.png b/sixaunyi/app/src/main/res/drawable-v24/zidongkongzhi.png
new file mode 100644
index 0000000..479e8d1
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable-v24/zidongkongzhi.png differ
diff --git a/sixaunyi/app/src/main/res/drawable/android.png b/sixaunyi/app/src/main/res/drawable/android.png
new file mode 100644
index 0000000..0caf395
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable/android.png differ
diff --git a/sixaunyi/app/src/main/res/drawable/bg.png b/sixaunyi/app/src/main/res/drawable/bg.png
new file mode 100644
index 0000000..ab41860
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable/bg.png differ
diff --git a/sixaunyi/app/src/main/res/drawable/drone.png b/sixaunyi/app/src/main/res/drawable/drone.png
new file mode 100644
index 0000000..f70e2ad
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable/drone.png differ
diff --git a/sixaunyi/app/src/main/res/drawable/ic_launcher_background.xml b/sixaunyi/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/sixaunyi/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sixaunyi/app/src/main/res/drawable/icon_favorite_red.xml b/sixaunyi/app/src/main/res/drawable/icon_favorite_red.xml
new file mode 100644
index 0000000..6ec39d1
--- /dev/null
+++ b/sixaunyi/app/src/main/res/drawable/icon_favorite_red.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/sixaunyi/app/src/main/res/drawable/selector_toggle_background.xml b/sixaunyi/app/src/main/res/drawable/selector_toggle_background.xml
new file mode 100644
index 0000000..d16fd9a
--- /dev/null
+++ b/sixaunyi/app/src/main/res/drawable/selector_toggle_background.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/sixaunyi/app/src/main/res/drawable/selector_toggle_icon.xml b/sixaunyi/app/src/main/res/drawable/selector_toggle_icon.xml
new file mode 100644
index 0000000..d1f3a63
--- /dev/null
+++ b/sixaunyi/app/src/main/res/drawable/selector_toggle_icon.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/drawable/sensor.png b/sixaunyi/app/src/main/res/drawable/sensor.png
new file mode 100644
index 0000000..8df9504
Binary files /dev/null and b/sixaunyi/app/src/main/res/drawable/sensor.png differ
diff --git a/sixaunyi/app/src/main/res/drawable/txt_radiuborder.xml b/sixaunyi/app/src/main/res/drawable/txt_radiuborder.xml
new file mode 100644
index 0000000..add562e
--- /dev/null
+++ b/sixaunyi/app/src/main/res/drawable/txt_radiuborder.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/layout-land/activity_control.xml b/sixaunyi/app/src/main/res/layout-land/activity_control.xml
new file mode 100644
index 0000000..e51286e
--- /dev/null
+++ b/sixaunyi/app/src/main/res/layout-land/activity_control.xml
@@ -0,0 +1,271 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sixaunyi/app/src/main/res/layout/activity_control.xml b/sixaunyi/app/src/main/res/layout/activity_control.xml
new file mode 100644
index 0000000..77d9ef6
--- /dev/null
+++ b/sixaunyi/app/src/main/res/layout/activity_control.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/layout/activity_detect.xml b/sixaunyi/app/src/main/res/layout/activity_detect.xml
new file mode 100644
index 0000000..f47b233
--- /dev/null
+++ b/sixaunyi/app/src/main/res/layout/activity_detect.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
diff --git a/sixaunyi/app/src/main/res/layout/activity_login.xml b/sixaunyi/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..b30c9ba
--- /dev/null
+++ b/sixaunyi/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/layout/activity_main.xml b/sixaunyi/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..762567a
--- /dev/null
+++ b/sixaunyi/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sixaunyi/app/src/main/res/layout/activity_setting.xml b/sixaunyi/app/src/main/res/layout/activity_setting.xml
new file mode 100644
index 0000000..fa7367f
--- /dev/null
+++ b/sixaunyi/app/src/main/res/layout/activity_setting.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sixaunyi/app/src/main/res/layout/activity_video.xml b/sixaunyi/app/src/main/res/layout/activity_video.xml
new file mode 100644
index 0000000..30db315
--- /dev/null
+++ b/sixaunyi/app/src/main/res/layout/activity_video.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sixaunyi/app/src/main/res/layout/content_detect.xml b/sixaunyi/app/src/main/res/layout/content_detect.xml
new file mode 100644
index 0000000..1590f1d
--- /dev/null
+++ b/sixaunyi/app/src/main/res/layout/content_detect.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/layout/custom_dialog.xml b/sixaunyi/app/src/main/res/layout/custom_dialog.xml
new file mode 100644
index 0000000..7d1743f
--- /dev/null
+++ b/sixaunyi/app/src/main/res/layout/custom_dialog.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
diff --git a/sixaunyi/app/src/main/res/layout/custom_info_contents.xml b/sixaunyi/app/src/main/res/layout/custom_info_contents.xml
new file mode 100644
index 0000000..b0f6f79
--- /dev/null
+++ b/sixaunyi/app/src/main/res/layout/custom_info_contents.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sixaunyi/app/src/main/res/layout/custom_info_window.xml b/sixaunyi/app/src/main/res/layout/custom_info_window.xml
new file mode 100644
index 0000000..35e03cd
--- /dev/null
+++ b/sixaunyi/app/src/main/res/layout/custom_info_window.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sixaunyi/app/src/main/res/layout/dialog_takeoff.xml b/sixaunyi/app/src/main/res/layout/dialog_takeoff.xml
new file mode 100644
index 0000000..f0075de
--- /dev/null
+++ b/sixaunyi/app/src/main/res/layout/dialog_takeoff.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/layout/fragment_first.xml b/sixaunyi/app/src/main/res/layout/fragment_first.xml
new file mode 100644
index 0000000..8a8ce58
--- /dev/null
+++ b/sixaunyi/app/src/main/res/layout/fragment_first.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/layout/fragment_second.xml b/sixaunyi/app/src/main/res/layout/fragment_second.xml
new file mode 100644
index 0000000..0cdc85a
--- /dev/null
+++ b/sixaunyi/app/src/main/res/layout/fragment_second.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/sixaunyi/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/sixaunyi/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/sixaunyi/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/sixaunyi/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/sixaunyi/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
Binary files /dev/null and b/sixaunyi/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/sixaunyi/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/sixaunyi/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
Binary files /dev/null and b/sixaunyi/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/sixaunyi/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/sixaunyi/app/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000..4f0f1d6
Binary files /dev/null and b/sixaunyi/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/sixaunyi/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/sixaunyi/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..62b611d
Binary files /dev/null and b/sixaunyi/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/sixaunyi/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/sixaunyi/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000..948a307
Binary files /dev/null and b/sixaunyi/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/sixaunyi/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/sixaunyi/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..1b9a695
Binary files /dev/null and b/sixaunyi/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/sixaunyi/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/sixaunyi/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..28d4b77
Binary files /dev/null and b/sixaunyi/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/sixaunyi/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/sixaunyi/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9287f50
Binary files /dev/null and b/sixaunyi/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/sixaunyi/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/sixaunyi/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..aa7d642
Binary files /dev/null and b/sixaunyi/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/sixaunyi/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/sixaunyi/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9126ae3
Binary files /dev/null and b/sixaunyi/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/sixaunyi/app/src/main/res/navigation/nav_graph.xml b/sixaunyi/app/src/main/res/navigation/nav_graph.xml
new file mode 100644
index 0000000..a6808fb
--- /dev/null
+++ b/sixaunyi/app/src/main/res/navigation/nav_graph.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/values-land/dimens.xml b/sixaunyi/app/src/main/res/values-land/dimens.xml
new file mode 100644
index 0000000..10125a3
--- /dev/null
+++ b/sixaunyi/app/src/main/res/values-land/dimens.xml
@@ -0,0 +1,3 @@
+
+ 48dp
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/values-night/themes.xml b/sixaunyi/app/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..ea0ce2d
--- /dev/null
+++ b/sixaunyi/app/src/main/res/values-night/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/values-w1240dp/dimens.xml b/sixaunyi/app/src/main/res/values-w1240dp/dimens.xml
new file mode 100644
index 0000000..ec434d3
--- /dev/null
+++ b/sixaunyi/app/src/main/res/values-w1240dp/dimens.xml
@@ -0,0 +1,3 @@
+
+ 200dp
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/values-w600dp/dimens.xml b/sixaunyi/app/src/main/res/values-w600dp/dimens.xml
new file mode 100644
index 0000000..10125a3
--- /dev/null
+++ b/sixaunyi/app/src/main/res/values-w600dp/dimens.xml
@@ -0,0 +1,3 @@
+
+ 48dp
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/values/attrs.xml b/sixaunyi/app/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..ef817d5
--- /dev/null
+++ b/sixaunyi/app/src/main/res/values/attrs.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/values/colors.xml b/sixaunyi/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..f8c6127
--- /dev/null
+++ b/sixaunyi/app/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/values/dimens.xml b/sixaunyi/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..b789d50
--- /dev/null
+++ b/sixaunyi/app/src/main/res/values/dimens.xml
@@ -0,0 +1,3 @@
+
+ 16dp
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/values/strings.xml b/sixaunyi/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..38d37e2
--- /dev/null
+++ b/sixaunyi/app/src/main/res/values/strings.xml
@@ -0,0 +1,25 @@
+
+ sixaunyi
+ DetectActivity
+
+ First Fragment
+ Second Fragment
+ Next
+ Previous
+ 下降按钮
+ 上升旋转
+ 向左按钮
+ 向右按钮
+ 向前按钮
+ 向后按钮
+ 向左旋转
+ 向右旋转
+ 设置
+ 开始录制
+ 查看状态
+ 降落按钮
+ 降落按钮
+ 自动返航按钮
+ Hello first fragment
+ Hello second fragment. Arg: %1$s
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/values/styles.xml b/sixaunyi/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..ad1b81d
--- /dev/null
+++ b/sixaunyi/app/src/main/res/values/styles.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/values/themes.xml b/sixaunyi/app/src/main/res/values/themes.xml
new file mode 100644
index 0000000..39e68a9
--- /dev/null
+++ b/sixaunyi/app/src/main/res/values/themes.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/values/transparent.xml b/sixaunyi/app/src/main/res/values/transparent.xml
new file mode 100644
index 0000000..0c6e578
--- /dev/null
+++ b/sixaunyi/app/src/main/res/values/transparent.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/xml/backup_rules.xml b/sixaunyi/app/src/main/res/xml/backup_rules.xml
new file mode 100644
index 0000000..fa0f996
--- /dev/null
+++ b/sixaunyi/app/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/main/res/xml/data_extraction_rules.xml b/sixaunyi/app/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 0000000..9ee9997
--- /dev/null
+++ b/sixaunyi/app/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sixaunyi/app/src/test/java/com/example/sixaunyi/ExampleUnitTest.java b/sixaunyi/app/src/test/java/com/example/sixaunyi/ExampleUnitTest.java
new file mode 100644
index 0000000..2862267
--- /dev/null
+++ b/sixaunyi/app/src/test/java/com/example/sixaunyi/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.example.sixaunyi;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/sixaunyi/build.gradle b/sixaunyi/build.gradle
new file mode 100644
index 0000000..e5299b8
--- /dev/null
+++ b/sixaunyi/build.gradle
@@ -0,0 +1,10 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+plugins {
+ id 'com.android.application' version '7.2.2' apply false
+ id 'com.android.library' version '7.2.2' apply false
+}
+
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
\ No newline at end of file
diff --git a/sixaunyi/gradle.properties b/sixaunyi/gradle.properties
new file mode 100644
index 0000000..dab7c28
--- /dev/null
+++ b/sixaunyi/gradle.properties
@@ -0,0 +1,21 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app"s APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Enables namespacing of each library's R class so that its R class includes only the
+# resources declared in the library itself and none from the library's dependencies,
+# thereby reducing the size of the R class for that library
+android.nonTransitiveRClass=true
\ No newline at end of file
diff --git a/sixaunyi/gradle/wrapper/gradle-wrapper.jar b/sixaunyi/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..e708b1c
Binary files /dev/null and b/sixaunyi/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/sixaunyi/gradle/wrapper/gradle-wrapper.properties b/sixaunyi/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..c65246d
--- /dev/null
+++ b/sixaunyi/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Mar 29 00:41:14 CST 2023
+distributionBase=GRADLE_USER_HOME
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
+distributionPath=wrapper/dists
+zipStorePath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
diff --git a/sixaunyi/gradlew b/sixaunyi/gradlew
new file mode 100644
index 0000000..4f906e0
--- /dev/null
+++ b/sixaunyi/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/sixaunyi/gradlew.bat b/sixaunyi/gradlew.bat
new file mode 100644
index 0000000..107acd3
--- /dev/null
+++ b/sixaunyi/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/sixaunyi/settings.gradle b/sixaunyi/settings.gradle
new file mode 100644
index 0000000..126a340
--- /dev/null
+++ b/sixaunyi/settings.gradle
@@ -0,0 +1,16 @@
+pluginManagement {
+ repositories {
+ gradlePluginPortal()
+ google()
+ mavenCentral()
+ }
+}
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+rootProject.name = "sixaunyi"
+include ':app'