浏览代码

改版本

zhanghongrui 1 天之前
父节点
当前提交
aa3c758c0d
共有 100 个文件被更改,包括 1585 次插入778 次删除
  1. 0 9
      OneBottomNavigationBar/src/main/res/drawable/rounded_corners.xml
  2. 5 4
      app/build.gradle
  3. 1 1
      app/debug/output-metadata.json
  4. 二进制
      app/debug/taishiganzhi_debug_v1.0.0_20250721.apk
  5. 1 1
      app/release/output-metadata.json
  6. 二进制
      app/release/taishiganzhi_release_v1.0.0.zip
  7. 二进制
      app/release/taishiganzhi_release_v1.0.0.apk
  8. 5 0
      app/src/main/AndroidManifest.xml
  9. 0 30
      app/src/main/assets/json_list.json
  10. 0 27
      app/src/main/assets/json_list2.json
  11. 0 32
      app/src/main/assets/map_list.json
  12. 14 1
      app/src/main/java/com/sjkj/appthreefloor_tsgz/activity/ExoPlayerActivity.java
  13. 94 0
      app/src/main/java/com/sjkj/appthreefloor_tsgz/activity/ExoPlayerActivity2.java
  14. 1 1
      app/src/main/java/com/sjkj/appthreefloor_tsgz/activity/MonitoringCenterActivity.java
  15. 2 4
      base-lib/src/main/java/com/sjkj/base_lib/camera/dh/vm/CameraViewModel.java
  16. 1 1
      app/src/main/java/com/sjkj/appthreefloor_tsgz/activity/viewModel/MainViewModel.java
  17. 62 1
      app/src/main/java/com/sjkj/appthreefloor_tsgz/adapter/MessageDetailsAdapter.java
  18. 1 1
      base-lib/src/main/java/com/sjkj/base_lib/camera/dh/bean/CameraBean.java
  19. 1 1
      base-lib/src/main/java/com/sjkj/base_lib/camera/dh/bean/CameraDetailsBean.java
  20. 15 6
      app/src/main/java/com/sjkj/appthreefloor_tsgz/bean/EventMessageDetailsBean.java
  21. 0 1
      app/src/main/java/com/sjkj/appthreefloor_tsgz/bean/ResourceVisualizationBean.java
  22. 130 0
      app/src/main/java/com/sjkj/appthreefloor_tsgz/communication/AudioManager.java
  23. 245 0
      app/src/main/java/com/sjkj/appthreefloor_tsgz/communication/AudioRecorderButton.java
  24. 101 0
      app/src/main/java/com/sjkj/appthreefloor_tsgz/communication/DialogManager.java
  25. 78 0
      app/src/main/java/com/sjkj/appthreefloor_tsgz/communication/MediaManager.java
  26. 16 0
      app/src/main/java/com/sjkj/appthreefloor_tsgz/fragment/EventFragment.java
  27. 93 3
      app/src/main/java/com/sjkj/appthreefloor_tsgz/fragment/EventMessageFragment.java
  28. 9 1
      app/src/main/java/com/sjkj/appthreefloor_tsgz/login/LoginActivity.java
  29. 2 1
      app/src/main/java/com/sjkj/appthreefloor_tsgz/map/MapMarkBean.java
  30. 10 13
      base-lib/src/main/java/com/sjkj/base_lib/net/request/DeviceListRequest.java
  31. 4 3
      app/src/main/java/com/sjkj/appthreefloor_tsgz/net/GetPlayerUrlRequest.java
  32. 5 1
      app/src/main/java/com/sjkj/appthreefloor_tsgz/net/RetrofitService.java
  33. 1 1
      app/src/main/java/com/sjkj/appthreefloor_tsgz/net/UploadFileRequest.java
  34. 48 0
      app/src/main/java/com/sjkj/appthreefloor_tsgz/utils/AmrUtils.java
  35. 265 0
      app/src/main/java/com/sjkj/appthreefloor_tsgz/utils/AudioPlayView.java
  36. 58 0
      app/src/main/java/com/sjkj/appthreefloor_tsgz/utils/KeybordS.java
  37. 250 0
      app/src/main/java/com/sjkj/appthreefloor_tsgz/utils/RSA.java
  38. 0 191
      app/src/main/java/com/sjkj/appthreefloor_tsgz/utils/StatusBarUtil.java
  39. 0 5
      app/src/main/res/anim/actionsheet_dialog_in.xml
  40. 0 5
      app/src/main/res/anim/actionsheet_dialog_out.xml
  41. 0 7
      app/src/main/res/anim/activity_out.xml
  42. 0 11
      app/src/main/res/anim/progress.xml
  43. 0 11
      app/src/main/res/anim/push_bottom_in.xml
  44. 0 11
      app/src/main/res/anim/push_bottom_out.xml
  45. 二进制
      app/src/main/res/drawable-hdpi/ic_launcher_logo_siping_tsgz_small.png
  46. 0 170
      app/src/main/res/drawable-v24/ic_launcher_background.xml
  47. 0 30
      app/src/main/res/drawable-v24/ic_launcher_foreground.xml
  48. 二进制
      app/src/main/res/drawable-xhdpi/default_image.png
  49. 二进制
      app/src/main/res/drawable-xhdpi/ic_launcher_logo_siping_tsgz_small.png
  50. 二进制
      base-lib/src/main/res/mipmap-xxhdpi/play_online_ani_ptz_right_h.png
  51. 二进制
      app/src/main/res/drawable-xxhdpi/blue_round.9.png
  52. 二进制
      app/src/main/res/drawable-xxhdpi/cancel.png
  53. 二进制
      base-lib/src/main/res/mipmap-xxhdpi/play_online_ani_ptz_left_h.png
  54. 二进制
      app/src/main/res/drawable-xxhdpi/dialog_loading_bg.9.png
  55. 二进制
      app/src/main/res/drawable-xxhdpi/ic_san.png
  56. 二进制
      app/src/main/res/drawable-xxhdpi/icon_add.png
  57. 二进制
      app/src/main/res/drawable-xxhdpi/icon_banner.png
  58. 二进制
      app/src/main/res/drawable-xxhdpi/icon_choose.png
  59. 二进制
      app/src/main/res/drawable-xxhdpi/icon_daily.png
  60. 二进制
      app/src/main/res/drawable-xxhdpi/icon_dx.png
  61. 二进制
      app/src/main/res/drawable-xxhdpi/keyboard.png
  62. 二进制
      app/src/main/res/drawable-xxhdpi/recorder.png
  63. 二进制
      app/src/main/res/drawable-xxhdpi/v1.png
  64. 二进制
      app/src/main/res/drawable-xxhdpi/v2.png
  65. 二进制
      app/src/main/res/drawable-xxhdpi/v3.png
  66. 二进制
      app/src/main/res/drawable-xxhdpi/v4.png
  67. 二进制
      app/src/main/res/drawable-xxhdpi/v5.png
  68. 二进制
      app/src/main/res/drawable-xxhdpi/v6.png
  69. 二进制
      app/src/main/res/drawable-xxhdpi/v7.png
  70. 二进制
      app/src/main/res/drawable-xxhdpi/v_anim1.png
  71. 二进制
      app/src/main/res/drawable-xxhdpi/v_anim2.png
  72. 二进制
      app/src/main/res/drawable-xxhdpi/v_anim3.png
  73. 二进制
      app/src/main/res/drawable-xxhdpi/voice.png
  74. 二进制
      app/src/main/res/drawable-xxhdpi/voice_to_short.png
  75. 0 10
      app/src/main/res/drawable/bar_text_select.xml
  76. 0 14
      app/src/main/res/drawable/bg_event.xml
  77. 0 7
      app/src/main/res/drawable/bg_event_completed_select.xml
  78. 0 6
      app/src/main/res/drawable/bg_tsgz_blue.xml
  79. 0 11
      app/src/main/res/drawable/bg_yuan_shape.xml
  80. 11 0
      app/src/main/res/drawable/btn_recorder_normal.xml
  81. 10 0
      app/src/main/res/drawable/btn_recording.xml
  82. 0 5
      app/src/main/res/drawable/gp_indicator_drawable.xml
  83. 0 9
      app/src/main/res/drawable/ic_back.xml
  84. 0 5
      app/src/main/res/drawable/ic_baseline_event_note_24.xml
  85. 0 9
      app/src/main/res/drawable/ic_home.xml
  86. 0 12
      app/src/main/res/drawable/ic_me.xml
  87. 0 9
      app/src/main/res/drawable/ic_periphery.xml
  88. 0 9
      app/src/main/res/drawable/ic_tsgz.xml
  89. 8 0
      app/src/main/res/drawable/play_anim.xml
  90. 0 9
      app/src/main/res/drawable/rounded_corners.xml
  91. 0 9
      app/src/main/res/drawable/rounded_leftbootom_rightbootom.xml
  92. 0 6
      app/src/main/res/drawable/selector_event.xml
  93. 0 6
      app/src/main/res/drawable/selector_home.xml
  94. 0 6
      app/src/main/res/drawable/selector_me.xml
  95. 0 7
      app/src/main/res/drawable/shape_background_white_change.xml
  96. 0 10
      app/src/main/res/drawable/shape_login_btn_solid_black.xml
  97. 1 1
      app/src/main/res/layout/activity_camera_list.xml
  98. 0 33
      app/src/main/res/layout/activity_exo.xml
  99. 37 0
      app/src/main/res/layout/dialog_recorder.xml
  100. 0 0
      app/src/main/res/layout/fragment_event_message.xml

+ 0 - 9
OneBottomNavigationBar/src/main/res/drawable/rounded_corners.xml

@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <solid android:color="#FFFFFF"/> <!-- 背景颜色 -->
-    <corners
-        android:topLeftRadius="20dp"
-        android:topRightRadius="20dp"
-        android:bottomLeftRadius="0dp"
-        android:bottomRightRadius="0dp"/>
-</shape>

+ 5 - 4
app/build.gradle

@@ -46,7 +46,7 @@ android {
         sourceCompatibility JavaVersion.VERSION_1_8
         targetCompatibility JavaVersion.VERSION_1_8
     }
-//    ndkVersion '22.1.7171670'
+   ndkVersion '22.1.7171670'
     packagingOptions {
         exclude 'META-INF/proguard/coroutines.pro'
     }
@@ -70,8 +70,6 @@ dependencies {
     implementation 'com.google.android.exoplayer:exoplayer-ui:2.15.1'
     // implementation 'com.google.android.exoplayer:exoplayer-dash:latest_version'
     implementation 'com.google.android.exoplayer:exoplayer-hls:2.15.1'
-    implementation 'com.github.ittianyu:BottomNavigationViewEx:2.0.4'
-    implementation 'com.readystatesoftware.systembartint:systembartint:1.0.3'
     // 基础依赖包,必须要依赖
     implementation 'com.geyifeng.immersionbar:immersionbar:3.2.2'
     implementation "androidx.core:core-ktx:1.5.0"
@@ -80,7 +78,10 @@ dependencies {
     implementation 'androidx.coordinatorlayout:coordinatorlayout:1.1.0'
     implementation 'org.greenrobot:eventbus:3.2.0'
     implementation 'com.github.getActivity:EasyWindow:11.0'
-
+    implementation "de.mrmaffen:vlc-android-sdk:2.0.6"
+    //implementation 'org.videolan.android:libvlc-all:3.3.15' // 引入 VLC 播放器库
+    //Vlc 播放器
+    //implementation 'com.github.Stypho:VLC-Android-SDK:latest_version'
 
 }
 

+ 1 - 1
app/debug/output-metadata.json

@@ -13,7 +13,7 @@
       "attributes": [],
       "versionCode": 10000,
       "versionName": "1.0.0",
-      "outputFile": "taishiganzhi_debug_v1.0.0_20250721.apk"
+      "outputFile": "taishiganzhi_debug_v1.0.0_20250820.apk"
     }
   ],
   "elementType": "File"

二进制
app/debug/taishiganzhi_debug_v1.0.0_20250721.apk


+ 1 - 1
app/release/output-metadata.json

@@ -13,7 +13,7 @@
       "attributes": [],
       "versionCode": 10000,
       "versionName": "1.0.0",
-      "outputFile": "taishiganzhi_release_v1.0.0_20250721.apk"
+      "outputFile": "taishiganzhi_release_v1.0.0_20250825.apk"
     }
   ],
   "elementType": "File"

二进制
app/release/taishiganzhi_release_v1.0.0.zip


二进制
app/release/taishiganzhi_release_v1.0.0.apk


+ 5 - 0
app/src/main/AndroidManifest.xml

@@ -166,6 +166,11 @@
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:theme="@style/AppNoTitleTheme" />
         <activity
+            android:screenOrientation="landscape"
+            android:name="com.sjkj.appthreefloor_tsgz.activity.ExoPlayerActivity2"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:theme="@style/AppNoTitleTheme" />
+        <activity
             android:name="com.amap.api.navi.AmapRouteActivity"
             android:screenOrientation="portrait"
             android:configChanges="orientation|keyboardHidden|screenSize|navigation"

+ 0 - 30
app/src/main/assets/json_list.json

@@ -1,30 +0,0 @@
-{
-  "code": 200,
-  "data": [
-    {
-      "name": "消防力量",
-      "value": "fireforce"
-    },
-    {
-      "name": "消防栓",
-      "value": "firehydrant"
-    },
-    {
-      "name": "泡沫液",
-      "value": "foamliquid"
-    },
-    {
-      "name": "专职站",
-      "value": "fulltimestation"
-    },
-    {
-      "name": "重点场所",
-      "value": "keyplace"
-    },
-    {
-      "name": "其他联动力量",
-      "value": "otherlinkageforce"
-    }
-  ],
-  "msg": "操作成功"
-}

+ 0 - 27
app/src/main/assets/json_list2.json

@@ -1,27 +0,0 @@
-{
-  "code": 200,
-  "data": [
-    {
-      "distance": "60283.59",
-      "id": "1c6d2c6bb5a84077be00f1d96396c2b0",
-      "latitude": "43.83689",
-      "longitude": "125.47588",
-      "name": "1号取水口"
-    },
-    {
-      "distance": "73875.52",
-      "id": "624c04ded04b45a6b135826a9e081765",
-      "latitude": "43.82005",
-      "longitude": "125.3001",
-      "name": "仁和"
-    },
-    {
-      "distance": "83918.36",
-      "id": "824514d969224a848fa7136dda68ce39",
-      "latitude": "43.90767",
-      "longitude": "125.19573",
-      "name": "全安"
-    }
-  ],
-  "msg": "操作成功"
-}

+ 0 - 32
app/src/main/assets/map_list.json

@@ -1,32 +0,0 @@
-{
-  "code": 200,
-  "data": {
-    "cameras": [
-      {
-        "cameraCode": "22030300001321100364",
-        "cameraFactory": "1",
-        "cameraId": "0724a48c6d4f430ca022bfb5bca8073d",
-        "cameraName": "四平市伊通县西苇乡长泡子村北",
-        "cameraRadius": "0",
-        "cameraType": "1",
-        "latitude": "43.148702",
-        "longitude": "125.329884"
-      }
-    ],
-    "detail": {
-      "企业名称": "测试1234",
-      "企业类别": "民营加油站",
-      "修改人": "孙伟",
-      "修改时间": "2023-08-03 14:54:06",
-      "创建人": "null",
-      "创建时间": "2023-08-03 14:04:02",
-      "地址": "null",
-      "备注": "",
-      "所属部门": "四平市",
-      "纬度": "23",
-      "经度": "123",
-      "联系电话": "15888888888",
-      "负责人": "测试人"
-    }
-  }
-}

+ 14 - 1
app/src/main/java/com/sjkj/appthreefloor_tsgz/activity/ExoPlayerActivity.java

@@ -2,6 +2,7 @@ package com.sjkj.appthreefloor_tsgz.activity;
 
 import android.content.pm.ActivityInfo;
 import android.net.Uri;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.WindowManager;
@@ -11,6 +12,8 @@ import androidx.lifecycle.ViewModelProvider;
 
 import com.google.android.exoplayer2.ExoPlayer;
 import com.google.android.exoplayer2.MediaItem;
+import com.google.android.exoplayer2.PlaybackException;
+import com.google.android.exoplayer2.Player;
 import com.google.android.exoplayer2.SimpleExoPlayer;
 import com.google.android.exoplayer2.ui.AspectRatioFrameLayout;
 import com.gyf.immersionbar.ImmersionBar;
@@ -77,17 +80,26 @@ public class ExoPlayerActivity extends BaseActivity {
 
     private void initializePlayer(String url) {
 
+        url = "http://192.168.4.82:8080/profile/stream.m3u8";
+        Log.d("zhr1231", url);
         player = new SimpleExoPlayer.Builder(this).build();
         binding.playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL);
         binding.playerView.setUseController(false); // 设置为不使用控制器
         binding.playerView.setPlayer(player);
+        player.addListener(new Player.Listener() {
+            @Override
+            public void onPlayerError(PlaybackException error) {
+                Player.Listener.super.onPlayerError(error);
+                Log.d("zhr1231", error.getErrorCodeName() + "===" + error.errorCode);
+            }
+        });
 
         // 准备M3U8流的MediaItem
         MediaItem mediaItem = MediaItem.fromUri(Uri.parse(url));
         player.setMediaItem(mediaItem);
         player.prepare();
         player.play();
-       // toggleFullScreen();
+        // toggleFullScreen();
 
     }
 
@@ -129,6 +141,7 @@ public class ExoPlayerActivity extends BaseActivity {
             public void onError(Throwable e) {
                 super.onError(e);
                 ToastUtils.show("获取视频源失败");
+                initializePlayer("");
 //                if (!TextUtils.isEmpty(e.getMessage())) {
 //                    ToastUtils.show(e.getMessage());
 //                }

+ 94 - 0
app/src/main/java/com/sjkj/appthreefloor_tsgz/activity/ExoPlayerActivity2.java

@@ -0,0 +1,94 @@
+package com.sjkj.appthreefloor_tsgz.activity;
+
+import android.content.pm.ActivityInfo;
+import android.media.MediaPlayer;
+import android.util.Log;
+import android.view.SurfaceHolder;
+import android.view.WindowManager;
+
+import androidx.lifecycle.ViewModelProvider;
+
+import com.gyf.immersionbar.ImmersionBar;
+import com.sjkj.appthreefloor_tsgz.R;
+import com.sjkj.appthreefloor_tsgz.activity.viewModel.PlayViewModel;
+import com.sjkj.appthreefloor_tsgz.databinding.PlayActivity2Binding;
+import com.sjkj.base_lib.view.BaseActivity;
+
+public class ExoPlayerActivity2 extends BaseActivity {
+    private PlayViewModel viewModel;
+    private PlayActivity2Binding binding;
+    private MediaPlayer mediaPlayer;
+
+    @Override
+    public void initBinding() {
+        binding = (PlayActivity2Binding) getViewDataBinding();
+        viewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(PlayViewModel.class);
+        binding.setViewModel(viewModel);
+        binding.setLifecycleOwner(this);
+    }
+
+    @Override
+    public void initListener() {
+        super.initListener();
+
+    }
+
+    @Override
+    public void initView() {
+        super.initView();
+        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
+        ImmersionBar.with(ExoPlayerActivity2.this)
+                .statusBarDarkFont(true, 0.2f)
+                .statusBarColor(R.color.white)
+                .init();
+        // 强制设置为横屏
+        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+        SurfaceHolder holder = binding.surfaceView.getHolder();
+        holder.addCallback(new SurfaceHolder.Callback() {
+            @Override
+            public void surfaceCreated(SurfaceHolder holder) {
+                playVideo();
+            }
+
+            private void playVideo() {
+                mediaPlayer = new MediaPlayer();
+                try {
+                    mediaPlayer.setDataSource("rtsp://192.168.100.3:9100/dss/monitor/param/cameraid=1000026%40514%2410%26substream=1|rtsp://116.142.80.11:9101/dss/monitor/param/cameraid=1000026%40514%2410%26substream=1?token=62155");
+                    mediaPlayer.setDisplay(binding.surfaceView.getHolder());
+                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
+                        @Override
+                        public void onPrepared(MediaPlayer mediaPlayer) {
+                            mediaPlayer.start();
+                        }
+                    });
+                    mediaPlayer.prepareAsync();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    Log.d("zhr1231",e.getMessage());
+                }
+            }
+
+
+            @Override
+            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+            }
+
+            @Override
+            public void surfaceDestroyed(SurfaceHolder holder) {
+                if (mediaPlayer != null) {
+                    mediaPlayer.stop();
+                    mediaPlayer.release();
+                }
+            }
+        });
+
+    }
+
+
+    @Override
+    protected int initLayout() {
+        return R.layout.play_activity2;
+    }
+
+
+}

+ 1 - 1
app/src/main/java/com/sjkj/appthreefloor_tsgz/activity/MonitoringCenterActivity.java

@@ -22,6 +22,7 @@ import com.scwang.smartrefresh.layout.api.RefreshLayout;
 import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener;
 import com.scwang.smartrefresh.layout.listener.OnRefreshListener;
 import com.sjkj.appthreefloor_tsgz.R;
+import com.sjkj.appthreefloor_tsgz.activity.viewModel.CameraViewModel;
 import com.sjkj.appthreefloor_tsgz.adapter.CameraAdapter;
 import com.sjkj.appthreefloor_tsgz.adapter.RightAdapter;
 import com.sjkj.appthreefloor_tsgz.app.App;
@@ -33,7 +34,6 @@ import com.sjkj.appthreefloor_tsgz.net.CameraAllListRequest;
 import com.sjkj.appthreefloor_tsgz.net.CameraTypeListRequest;
 import com.sjkj.appthreefloor_tsgz.net.GetDictTypeRequest;
 import com.sjkj.base_lib.adapter.BaseRecAdapter;
-import com.sjkj.base_lib.camera.dh.vm.CameraViewModel;
 import com.sjkj.base_lib.entity.Params;
 import com.sjkj.base_lib.net.domain.interactor.ProcessErrorSubscriber;
 import com.sjkj.base_lib.utils.ToastUtils;

+ 2 - 4
base-lib/src/main/java/com/sjkj/base_lib/camera/dh/vm/CameraViewModel.java

@@ -1,11 +1,11 @@
-package com.sjkj.base_lib.camera.dh.vm;
+package com.sjkj.appthreefloor_tsgz.activity.viewModel;
 
 import androidx.databinding.ObservableBoolean;
 import androidx.databinding.ObservableField;
 import androidx.databinding.ObservableInt;
 
+import com.sjkj.appthreefloor_tsgz.bean.CameraDetailsBean;
 import com.sjkj.base_lib.R;
-import com.sjkj.base_lib.camera.dh.bean.CameraDetailsBean;
 import com.sjkj.base_lib.vm.BaseViewModel;
 
 
@@ -15,9 +15,7 @@ public class CameraViewModel extends BaseViewModel {
     public ObservableField<Double> latitude = new ObservableField<>(43.6080665800000);
     public ObservableField<String> keyword = new ObservableField<>("");
     public ObservableField<String> tip = new ObservableField<>("");
-    public ObservableField<Integer> selectedFrameId = new ObservableField<Integer>(R.id.item04_tv);
     public ObservableField<String> pageNumberText = new ObservableField<String>("1/1");
-    public ObservableField<Integer> selectedStreamId = new ObservableField<Integer>(R.id.item01_tv);
     public ObservableBoolean isShowCameraControlView = new ObservableBoolean(false);
     public ObservableInt currentPageIndex =new ObservableInt(0);
     /**

+ 1 - 1
app/src/main/java/com/sjkj/appthreefloor_tsgz/activity/viewModel/MainViewModel.java

@@ -2,7 +2,7 @@ package com.sjkj.appthreefloor_tsgz.activity.viewModel;
 
 import androidx.databinding.ObservableField;
 
-import com.sjkj.base_lib.camera.dh.bean.CameraBean;
+import com.sjkj.appthreefloor_tsgz.bean.CameraBean;
 import com.sjkj.base_lib.vm.BaseViewModel;
 
 import java.util.List;

+ 62 - 1
app/src/main/java/com/sjkj/appthreefloor_tsgz/adapter/MessageDetailsAdapter.java

@@ -1,8 +1,10 @@
 package com.sjkj.appthreefloor_tsgz.adapter;
 
+import android.animation.ValueAnimator;
 import android.content.Context;
+import android.media.MediaPlayer;
 import android.text.TextUtils;
-import android.util.Log;
+import android.view.View;
 
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
@@ -11,7 +13,9 @@ import com.sjkj.appthreefloor_tsgz.R;
 import com.sjkj.appthreefloor_tsgz.bean.EventMessageDetailsBean;
 import com.sjkj.appthreefloor_tsgz.bean.FileCenterBean;
 import com.sjkj.appthreefloor_tsgz.bean.ImageBean;
+import com.sjkj.appthreefloor_tsgz.communication.MediaManager;
 import com.sjkj.appthreefloor_tsgz.databinding.ItemMessageDetailsBinding;
+import com.sjkj.appthreefloor_tsgz.utils.AmrUtils;
 import com.sjkj.appthreefloor_tsgz.utils.ImageUtils;
 import com.sjkj.appthreefloor_tsgz.utils.VideoUtils;
 import com.sjkj.base_lib.adapter.BaseRecAdapter;
@@ -25,6 +29,9 @@ public class MessageDetailsAdapter extends BaseRecAdapter<EventMessageDetailsBea
     private EventImageShowAdapter adapter;
     private FileCenterAdapter fileAdapter;
     private VideoAdapter videoAdapter;
+    private ValueAnimator valueAnimator;
+    private ValueAnimator shangcivalueAnimator;
+    //AnimationDrawable animation;
 
     public MessageDetailsAdapter(Context context) {
         super(context);
@@ -119,14 +126,39 @@ public class MessageDetailsAdapter extends BaseRecAdapter<EventMessageDetailsBea
 
             for (int i = 0; i < list.size(); i++) {
                 if (ImageUtils.isImage(list.get(i))) {
+                    binding.llVoice.setVisibility(View.GONE);
                     ImageBean imageBean = new ImageBean();
                     imageBean.setRealUrl(AppTools.getImageBaseUrl() + list.get(i));
                     imageBeanList.add(imageBean);
                 } else if (VideoUtils.isVideoFile(list.get(i))) {
+                    binding.llVoice.setVisibility(View.GONE);
                     ImageBean imageBean = new ImageBean();
                     imageBean.setRealUrl(AppTools.getImageBaseUrl() + list.get(i));
                     videoBeanList.add(imageBean);
+                } else if (AmrUtils.isAmr(list.get(i))) {
+                    binding.llVoice.setVisibility(View.VISIBLE);
+                    int finalI = i;
+                    binding.idRecorderLength.setOnClickListener(new View.OnClickListener() {
+                        @Override
+                        public void onClick(View view) {
+
+//                            if (onItemPlayClickListener != null) {
+//                                onItemPlayClickListener.onItemPlayClick(AppTools.getImageBaseUrl()+list.get(finalI));
+//                            }
+//                            if (animation != null) {
+//                                animation.stop();
+//                                animation = null;
+//                                binding.idRecorderAnim.setBackgroundResource(R.drawable.adj_left);
+//
+//                                // binding.idRecorderAnim.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.adj_left));
+//                            }
+
+                            PlayVoice(binding, AppTools.getImageBaseUrl() + list.get(finalI), position, bean);
+                        }
+                    });
+
                 } else {
+                    binding.llVoice.setVisibility(View.GONE);
                     FileCenterBean.FileCenter fileCenter = new FileCenterBean.FileCenter();
                     fileCenter.setPath(AppTools.getBaseUrl() + list.get(i));
                     file.add(fileCenter);
@@ -147,6 +179,26 @@ public class MessageDetailsAdapter extends BaseRecAdapter<EventMessageDetailsBea
         }
     }
 
+    private void PlayVoice(ItemMessageDetailsBinding binding, String str, int position, EventMessageDetailsBean bean) {
+
+
+
+        if (valueAnimator != null) {
+            valueAnimator.cancel();
+            valueAnimator = null;
+        }
+        binding.idRecorderAnim.startAnimation();
+        valueAnimator = binding.idRecorderAnim.getAnimator();
+        MediaManager.playSound(str, new MediaPlayer.OnCompletionListener() {
+            @Override
+            public void onCompletion(MediaPlayer mp) {
+                 binding.idRecorderAnim.stopAnimation();
+               // binding.idRecorderAnim.setBackground(context.getResources().getDrawable(R.drawable.adj_left));
+                // animation.stop();
+            }
+        });
+    }
+
     public interface OnItemPhotoClickListener {
         void onItemPhotoClick(int position, int index);
     }
@@ -159,9 +211,18 @@ public class MessageDetailsAdapter extends BaseRecAdapter<EventMessageDetailsBea
         void onItemVideoClick(String videoUrl);
     }
 
+    public interface OnItemPlayClickListener {
+        void onItemPlayClick(String url);
+    }
+
     private OnItemPhotoClickListener onItemPhotoClickListener;
     private OnItemFileClickListener onItemFileClickListener;
     private OnItemVideoClickListener onItemVideoClickListener;
+    private OnItemPlayClickListener onItemPlayClickListener;
+
+    public void setOnItemPlayClickListener(OnItemPlayClickListener listener) {
+        this.onItemPlayClickListener = listener;
+    }
 
     public void setOnItemPhotoClickListener(OnItemPhotoClickListener onItemPhotoClickListener) {
         this.onItemPhotoClickListener = onItemPhotoClickListener;

+ 1 - 1
base-lib/src/main/java/com/sjkj/base_lib/camera/dh/bean/CameraBean.java

@@ -1,4 +1,4 @@
-package com.sjkj.base_lib.camera.dh.bean;
+package com.sjkj.appthreefloor_tsgz.bean;
 
 import java.io.Serializable;
 

+ 1 - 1
base-lib/src/main/java/com/sjkj/base_lib/camera/dh/bean/CameraDetailsBean.java

@@ -1,4 +1,4 @@
-package com.sjkj.base_lib.camera.dh.bean;
+package com.sjkj.appthreefloor_tsgz.bean;
 
 import java.util.List;
 

+ 15 - 6
app/src/main/java/com/sjkj/appthreefloor_tsgz/bean/EventMessageDetailsBean.java

@@ -1,13 +1,22 @@
 package com.sjkj.appthreefloor_tsgz.bean;
 
 public class EventMessageDetailsBean {
-   private String  address;
-   private String  createName;
-   private String  createTime;
-   private String  eventName;
-   private String  files;
-   private String remark;
+    private String address;
+    private String createName;
+    private String createTime;
+    private String eventName;
+    private String files;
+    private String remark;
     private String deptName;
+    private boolean isSelected;
+
+    public boolean isSelected() {
+        return isSelected;
+    }
+
+    public void setSelected(boolean selected) {
+        isSelected = selected;
+    }
 
     public String getDeptName() {
         return deptName;

+ 0 - 1
app/src/main/java/com/sjkj/appthreefloor_tsgz/bean/ResourceVisualizationBean.java

@@ -1,6 +1,5 @@
 package com.sjkj.appthreefloor_tsgz.bean;
 
-import com.sjkj.base_lib.camera.dh.bean.CameraBean;
 
 import java.io.Serializable;
 import java.util.List;

+ 130 - 0
app/src/main/java/com/sjkj/appthreefloor_tsgz/communication/AudioManager.java

@@ -0,0 +1,130 @@
+package com.sjkj.appthreefloor_tsgz.communication;
+
+import android.media.MediaRecorder;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.UUID;
+
+/**
+ * Created by Administrator on 2017/11/28.
+ *
+ *录音管理类
+ */
+
+public class AudioManager {
+
+    private MediaRecorder mMediaRecorder;
+    private String mDir;
+    private String mCurrentFilePath;
+
+    private static AudioManager mInstance;
+
+    private boolean isPrepared;
+    public AudioManager(String dir){
+        mDir = dir;
+    };
+
+
+
+    /**
+     * 回调准备完毕
+     */
+    public interface AudioStateListener {
+        void wellPrepared(String fileName);
+    }
+
+    public AudioStateListener mListener;
+
+    public void setOnAudioStateListener(AudioStateListener listener){
+        mListener = listener;
+    }
+
+    public static AudioManager getInstance(String dir){
+        if (mInstance == null) {
+            synchronized (AudioManager.class) {
+                if (mInstance == null) {
+                    mInstance = new AudioManager(dir);
+                }
+            }
+        }
+        return mInstance;
+    }
+
+
+    /**
+     * 准备
+     */
+    public void prepareAudio() {
+        try {
+            isPrepared = false;
+            File dir = new File(mDir);
+            if (!dir.exists()) {
+                dir.mkdirs();
+            }
+            String fileName = generateFileName();
+
+            File file = new File(dir, fileName);
+
+            mCurrentFilePath = file.getAbsolutePath();
+
+            mMediaRecorder = new MediaRecorder();
+            //设置输出文件
+            mMediaRecorder.setOutputFile(file.getAbsolutePath());
+            //设置MediaRecorder的音频源为麦克风
+            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
+            //设置音频格式
+            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
+            //设置音频的格式为amr
+            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
+            mMediaRecorder.prepare();
+            mMediaRecorder.start();
+            //准备结束
+            isPrepared = true;
+            if (mListener != null) {
+                mListener.wellPrepared(fileName);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+//    生成UUID唯一标示符
+//    算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID
+//    .amr音频文件
+    private String generateFileName() {
+//        return UUID.randomUUID().toString()+".mp3";
+        return UUID.randomUUID().toString()+".amr";
+    }
+
+    public int getVoiceLevel(int maxLevel) {
+        if (isPrepared) {
+            //获得最大的振幅getMaxAmplitude() 1-32767
+            try {
+                return maxLevel * mMediaRecorder.getMaxAmplitude()/32768+1;
+            } catch (Exception e) {
+
+            }
+        }
+        return 1;
+    }
+
+    public void release() {
+        mMediaRecorder.stop();
+        mMediaRecorder.release();
+        mMediaRecorder = null;
+    }
+
+    public void cancel(){
+        release();
+        if(mCurrentFilePath!=null) {
+            File file = new File(mCurrentFilePath);
+            file.delete();
+            mCurrentFilePath = null;
+        }
+    }
+    public String getCurrentFilePath() {
+        return mCurrentFilePath;
+    }
+}
+

+ 245 - 0
app/src/main/java/com/sjkj/appthreefloor_tsgz/communication/AudioRecorderButton.java

@@ -0,0 +1,245 @@
+package com.sjkj.appthreefloor_tsgz.communication;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.os.Handler;
+import android.os.Message;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.Button;
+
+import com.sjkj.appthreefloor_tsgz.R;
+import com.sjkj.base_lib.utils.AppTools;
+
+
+/**
+ * 自定义按钮 实现录音等功能
+ * Created by Administrator on 2017/11/28.
+ */
+
+@SuppressLint("AppCompatCustomView")
+public class AudioRecorderButton extends Button implements AudioManager.AudioStateListener {
+
+    //手指滑动 距离
+    private static final int DISTANCE_Y_CANCEL = 50;
+    //状态
+    private static final int STATE_NORMAL = 1;
+    private static final int STATE_RECORDING = 2;
+    private static final int STATE_WANT_TO_CANCEL = 3;
+    //当前状态
+    private int mCurState = STATE_NORMAL;
+    //已经开始录音
+    private boolean isRecording = false;
+
+    private DialogManager mDialogManager;
+    private AudioManager mAudioManager;
+
+    private float mTime;
+    //是否触发onlongclick
+    private boolean mReady;
+
+    private String fileName;
+
+    public AudioRecorderButton(Context context) {
+        this(context, null);
+    }
+
+    public AudioRecorderButton(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        mDialogManager = new DialogManager(getContext());
+        //偷个懒,并没有判断 是否存在, 是否可读。
+
+//        String dir = Const.audios_path;
+
+        mAudioManager = new AudioManager(AppTools.audios_path);
+        mAudioManager.setOnAudioStateListener(this);
+        //按钮长按 准备录音 包括start
+        setOnLongClickListener(new OnLongClickListener() {
+            @Override
+            public boolean onLongClick(View v) {
+                mReady = true;
+                mAudioManager.prepareAudio();
+                return false;
+            }
+        });
+    }
+
+    /**
+     * 录音完成后的回调
+     */
+    public interface AudioFinishRecorderListener{
+        //时长  和 文件
+        void onFinish(String fileName, float seconds, String filePath);
+    }
+
+    private AudioFinishRecorderListener mListener;
+
+    public void setAudioFinishRecorderListener (AudioFinishRecorderListener listener){
+        mListener = listener;
+    }
+    //获取音量大小的Runnable
+    private Runnable mGetVoiceLevelRunnable = new Runnable() {
+        @Override
+        public void run() {
+            while (isRecording) {
+                try {
+                    Thread.sleep(100);
+                    mTime += 0.1;
+                    mHandler.sendEmptyMessage(MSG_VOICE_CHANGED);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    };
+
+    private static final int MSG_AUDIO_PREPARED = 0X110;
+    private static final int MSG_VOICE_CHANGED = 0X111;
+    private static final int MSG_DIALOG_DIMISS = 0X112;
+
+    private Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_AUDIO_PREPARED :
+                    //TODO 真正现实应该在audio end prepared以后
+                    mDialogManager.showRecordingDialog();
+                    isRecording = true;
+
+                    new Thread(mGetVoiceLevelRunnable).start();
+                    break;
+                case MSG_VOICE_CHANGED :
+                    mDialogManager.updateVoiceLevel(mAudioManager.getVoiceLevel(7));
+
+                    break;
+                case MSG_DIALOG_DIMISS :
+                    mDialogManager.dimissDialog();
+                    break;
+            }
+        }
+    };
+
+    @Override
+    public void wellPrepared(String fileName) {
+        this.fileName = fileName;
+        mHandler.sendEmptyMessage(MSG_AUDIO_PREPARED);
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        int action = event.getAction();
+        int x = (int) event.getX();
+        int y = (int) event.getY();
+        switch (action) {
+            case MotionEvent.ACTION_DOWN:
+                //TODO
+                isRecording = true;
+                changeState(STATE_RECORDING);
+
+                break;
+            case MotionEvent.ACTION_MOVE:
+
+                if (isRecording) {
+
+
+                //根据想x,y的坐标,判断是否想要取消
+                if (wantToCancel(x, y)) {
+
+                    changeState(STATE_WANT_TO_CANCEL);
+                } else {
+
+                    changeState(STATE_RECORDING);
+                }
+                }
+                break;
+            case MotionEvent.ACTION_UP:
+                //如果longclick 没触发
+                if (!mReady) {
+                    reset();
+                    return super.onTouchEvent(event);
+                }
+                //触发了onlongclick 没准备好,但是已经prepared 已经start
+                //所以消除文件夹
+                if(!isRecording||mTime<0.6f){
+                    mDialogManager.tooShort();
+                    mAudioManager.cancel();
+                    mHandler.sendEmptyMessageDelayed(MSG_DIALOG_DIMISS, 1300);
+                }else if(mCurState==STATE_RECORDING){//正常录制结束
+
+                    mDialogManager.dimissDialog();
+                    mAudioManager.release();
+                    if (mListener != null) {
+                        mListener.onFinish(this.fileName, mTime,mAudioManager.getCurrentFilePath());
+                    }
+
+                }else if (mCurState == STATE_RECORDING) {
+
+                    mDialogManager.dimissDialog();
+                    //release
+                    //callbacktoAct
+                } else if (mCurState == STATE_WANT_TO_CANCEL) {
+                    mDialogManager.dimissDialog();
+                    mAudioManager.cancel();
+                    //cancel
+                }
+
+                reset();
+
+                break;
+
+        }
+        return super.onTouchEvent(event);
+    }
+
+    /**
+     * 恢复状态 标志位
+     */
+    private void reset() {
+        isRecording = false;
+        mReady = false;
+        changeState(STATE_NORMAL);
+        mTime = 0;
+
+    }
+
+    private boolean wantToCancel(int x, int y) {
+        //如果左右滑出 button
+        if (x < 0 || x > getWidth()) {
+            return true;
+        }
+        //如果上下滑出 button  加上我们自定义的距离
+        if (y < -DISTANCE_Y_CANCEL || y > getHeight() + DISTANCE_Y_CANCEL) {
+            return true;
+        }
+        return false;
+    }
+
+    //改变状态
+    private void changeState(int state) {
+        if (mCurState != state) {
+            mCurState = state;
+            switch (state) {
+                case STATE_NORMAL:
+                    setBackgroundResource(R.drawable.btn_recorder_normal);
+                    setText(R.string.str_recorder_normal);
+                    break;
+                case STATE_RECORDING:
+                    setBackgroundResource(R.drawable.btn_recording);
+                    setText(R.string.str_recorder_recording);
+
+                    if (isRecording) {
+                        mDialogManager.recording();
+                    }
+                    break;
+                case STATE_WANT_TO_CANCEL:
+                    setBackgroundResource(R.drawable.btn_recording);
+                    setText(R.string.str_recorder_want_cancel);
+                    mDialogManager.wantToCancel();
+                    break;
+            }
+        }
+    }
+
+
+}

+ 101 - 0
app/src/main/java/com/sjkj/appthreefloor_tsgz/communication/DialogManager.java

@@ -0,0 +1,101 @@
+package com.sjkj.appthreefloor_tsgz.communication;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.sjkj.appthreefloor_tsgz.R;
+
+
+/**
+ * 自定义dialog 实现录音提示
+ * Created by Administrator on 2017/11/28.
+ */
+
+public class DialogManager {
+    private Dialog mDialog;
+
+    private ImageView mIcon;
+    private ImageView mVoice;
+
+    private TextView mLable;
+
+    private Context mContext;
+
+    public DialogManager(Context context) {
+        mContext = context;
+    }
+
+    public void showRecordingDialog() {
+        mDialog = new Dialog(mContext, R.style.Theme_AudioDialog);
+        LayoutInflater inflater = LayoutInflater.from(mContext);
+        View view = inflater.inflate(R.layout.dialog_recorder, null);
+        mDialog.setContentView(view);
+
+        mIcon = view.findViewById(R.id.id_recorder_dialog_icon);
+        mVoice = view.findViewById(R.id.id_recorder_dialog_voice);
+        mLable = view.findViewById(R.id.id_recorder_dialog_label);
+
+        mDialog.show();
+    }
+
+    //正在播放时的状态
+    public void recording() {
+        if (mDialog != null && mDialog.isShowing()) {
+            mIcon.setVisibility(View.VISIBLE);
+            mVoice.setVisibility(View.VISIBLE);
+            mLable.setVisibility(View.VISIBLE);
+
+            mIcon.setImageResource(R.drawable.recorder);
+            mLable.setText("手指上划,取消发送");
+        }
+    }
+
+    //想要取消
+    public void wantToCancel() {
+        if (mDialog != null && mDialog.isShowing()) {
+            mIcon.setVisibility(View.VISIBLE);
+            mVoice.setVisibility(View.GONE);
+            mLable.setVisibility(View.VISIBLE);
+
+            mIcon.setImageResource(R.drawable.cancel);
+            mLable.setText("松开手指,取消发送");
+        }
+    }
+
+    //录音时间太短
+    public void tooShort() {
+        if (mDialog != null && mDialog.isShowing()) {
+            mIcon.setVisibility(View.VISIBLE);
+            mVoice.setVisibility(View.GONE);
+            mLable.setVisibility(View.VISIBLE);
+
+            mIcon.setImageResource(R.drawable.voice_to_short);
+            mLable.setText("录音时间过短");
+        }
+    }
+
+    //关闭dialog
+    public void dimissDialog() {
+        if (mDialog != null && mDialog.isShowing()) {
+            mDialog.dismiss();
+            mDialog = null;
+        }
+    }
+
+    /**
+     * 通过level更新voice上的图片
+     *
+     * @param level
+     */
+    public void updateVoiceLevel(int level) {
+        if (mDialog != null && mDialog.isShowing()) {
+
+            int resId = mContext.getResources().getIdentifier("v" + level, "drawable", mContext.getPackageName());
+            mVoice.setImageResource(resId);
+        }
+    }
+}

+ 78 - 0
app/src/main/java/com/sjkj/appthreefloor_tsgz/communication/MediaManager.java

@@ -0,0 +1,78 @@
+package com.sjkj.appthreefloor_tsgz.communication;
+
+import android.media.AudioManager;
+import android.media.MediaPlayer;
+import android.util.Log;
+
+import java.io.IOException;
+
+/**
+ * Created by Administrator on 2017/11/28.
+ * 播放录音类
+ */
+
+public class MediaManager {
+    private static MediaPlayer mMediaPlayer;
+
+    private static boolean isPause;
+
+    //播放录音
+    public static void playSound(String filePath, MediaPlayer.OnCompletionListener onCompletionListener) {
+        if (mMediaPlayer == null) {
+            mMediaPlayer = new MediaPlayer();
+            //播放错误 防止崩溃
+            mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
+                @Override
+                public boolean onError(MediaPlayer mp, int what, int extra) {
+                    mMediaPlayer.reset();
+
+                    return false;
+                }
+            });
+        } else {
+            mMediaPlayer.reset();
+        }
+        try {
+            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
+            mMediaPlayer.setOnCompletionListener(onCompletionListener);
+            mMediaPlayer.setDataSource(filePath);
+            mMediaPlayer.prepare();
+            mMediaPlayer.start();
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 如果 播放时间过长,如30秒
+     * 用户突然来电话了,则需要暂停
+     */
+    public static void pause() {
+        if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
+            mMediaPlayer.pause();
+            isPause = true;
+        }
+    }
+
+    /**
+     * 播放
+     */
+    public static void resume() {
+        if (mMediaPlayer != null && isPause) {
+            mMediaPlayer.start();
+            isPause = false;
+        }
+    }
+
+    /**
+     * activity 被销毁  释放
+     */
+    public static void release() {
+        if (mMediaPlayer != null) {
+            mMediaPlayer.release();
+            mMediaPlayer = null;
+        }
+    }
+}

+ 16 - 0
app/src/main/java/com/sjkj/appthreefloor_tsgz/fragment/EventFragment.java

@@ -224,11 +224,27 @@ public class EventFragment extends BaseFragment /*implements View.OnClickListene
 
 
     @Override
+    public void onResume() {
+        super.onResume();
+        if (isVisible) {
+            //详情页面返回  刷新列表
+            requestListRefresh();
+        }
+    }
+
+    /**
+     * Fragment当前状态是否可见
+     */
+    protected boolean isVisible = false;
+
+    @Override
     public void setMenuVisibility(final boolean visible) {
         super.setMenuVisibility(visible);
+        isVisible = visible;
         if (visible) {
             // Fragment菜单变得可见时的操作
             requestListRefresh();
+
         } else {
             // Fragment菜单变得不可见时的操作
         }

+ 93 - 3
app/src/main/java/com/sjkj/appthreefloor_tsgz/fragment/EventMessageFragment.java

@@ -34,6 +34,7 @@ import com.sjkj.appthreefloor_tsgz.app.App;
 import com.sjkj.appthreefloor_tsgz.bean.EventMessageDetailsBean;
 import com.sjkj.appthreefloor_tsgz.bean.ImageBean;
 import com.sjkj.appthreefloor_tsgz.bean.ImageEventFilesBean;
+import com.sjkj.appthreefloor_tsgz.communication.AudioRecorderButton;
 import com.sjkj.appthreefloor_tsgz.databinding.FragmentEventMessageBinding;
 import com.sjkj.appthreefloor_tsgz.fragment.viewModel.EventFargmentViewModel;
 import com.sjkj.appthreefloor_tsgz.net.EventAddFeedBackRequest;
@@ -41,6 +42,7 @@ import com.sjkj.appthreefloor_tsgz.net.EventMessageListRequest;
 import com.sjkj.appthreefloor_tsgz.net.UploadFileRequest;
 import com.sjkj.appthreefloor_tsgz.utils.DownLoadUtils;
 import com.sjkj.appthreefloor_tsgz.utils.ImageUtils;
+import com.sjkj.appthreefloor_tsgz.utils.KeybordS;
 import com.sjkj.appthreefloor_tsgz.utils.OpenFileUtil;
 import com.sjkj.appthreefloor_tsgz.weight.photoview.PhotoViewActivity;
 import com.sjkj.base_lib.adapter.BaseRecAdapter;
@@ -236,8 +238,93 @@ public class EventMessageFragment extends BaseFragment {
                 });
     }
 
+    public  void sendVoice(List voiceList){
+        showLoadingDialog();
+        Params params = new Params();
+        params.put("eventId", getActivity().getIntent().getStringExtra("id"));
+        params.put("status", "70");
+        params.put("remark", binding.etContent.getText().toString());
+        params.put("eventFiles", voiceList);
+        addFeedBackRequest.setParams(params);
+        addFeedBackRequest.execute(new ProcessErrorSubscriber() {
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                hideLoadingDialog(LoadingDialog.LOADING_FAILED);
+                if (!TextUtils.isEmpty(e.getMessage())) {
+                    ToastUtils.show(e.getMessage());
+                }
+            }
+
+            @Override
+            public void onNext(Object o) {
+                super.onNext(o);
+                hideLoadingDialog(LoadingDialog.LOADING_SUCCESS);
+                ToastUtils.show("操作成功");
+                binding.llPhotoVideo.setVisibility(binding.llPhotoVideo.getVisibility() == View.VISIBLE ? View.GONE : View.GONE);
+                binding.etContent.setText("");
+                binding.etContent.setHint("请输入内容");
+                imageAdapter.refreshList(null);
+                loadData();
+
+            }
+        });
+    }
     @Override
     public void initListener() {
+
+        binding.idRecorderButton.setAudioFinishRecorderListener(new AudioRecorderButton.AudioFinishRecorderListener() {
+            @Override
+            public void onFinish(final String fileName, final float seconds, final String filePath) {
+
+                showLoadingDialog();
+                uploadFileRequest.setFile(new File(filePath));
+                uploadFileRequest.execute(new ProcessErrorSubscriber<ImageEventFilesBean>() {
+                    @Override
+                    public void onError(Throwable e) {
+                        super.onError(e);
+                        ToastUtils.show("上传失败" + e.getMessage());
+                        hideLoadingDialog(LoadingDialog.LOADING_FAILED);
+                    }
+
+                    @Override
+                    public void onNext(ImageEventFilesBean bean) {
+                        super.onNext(bean);
+                        //ToastUtils.show("上传成功" + bean.getWebUrl() + "-=-=");
+                        hideLoadingDialog(LoadingDialog.LOADING_SUCCESS);
+                        List<ImageBean> voiceBeanList=new ArrayList<>();
+                        ImageBean imageBean = new ImageBean();
+                        imageBean.setRealUrl(AppTools.getImageBaseUrl() + bean.getFileUrl());
+                        imageBean.setFileUrl(bean.getFileUrl());
+                        imageBean.setFileName(bean.getFileName());
+                        imageBean.setFileSize(bean.getFileSize());
+                        imageBean.setFileType(bean.getFileType());
+                        voiceBeanList.add(imageBean);
+                        sendVoice(voiceBeanList);
+
+                    }
+                });
+            }
+
+        });
+
+        binding.switchButton.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                if (binding.idRecorderButton.getVisibility() == View.GONE) {
+                    KeybordS.closeKeybord(binding.etContent, getActivity());
+                    binding.idRecorderButton.setVisibility(View.VISIBLE);
+                    binding.switchButton.setBackgroundResource(R.drawable.keyboard);
+                    binding.etContent.setVisibility(View.GONE);
+                } else {
+                    binding.idRecorderButton.setVisibility(View.GONE);
+                    binding.switchButton.setBackgroundResource(R.drawable.voice);
+                    binding.etContent.requestFocus();
+                    binding.etContent.setVisibility(View.VISIBLE);
+                    KeybordS.openKeybord(binding.etContent, getActivity());
+                }
+            }
+        });
         binding.ivPhoto.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
@@ -265,7 +352,7 @@ public class EventMessageFragment extends BaseFragment {
 
 
                 if (TextUtils.isEmpty(binding.etContent.getText().toString()) && imageAdapter.getList() == null) {
-                    ToastUtils.show("请输入内容或上传图片/视频");
+                    ToastUtils.show("请输入内容");
                     return;
                 }
 
@@ -293,8 +380,8 @@ public class EventMessageFragment extends BaseFragment {
                         ToastUtils.show("操作成功");
                         binding.llPhotoVideo.setVisibility(binding.llPhotoVideo.getVisibility() == View.VISIBLE ? View.GONE : View.GONE);
                         binding.etContent.setText("");
-                        binding.etContent.setHint("请输入内容或上传图片/视频");
-                        imageAdapter.clear();
+                        binding.etContent.setHint("请输入内容");
+                        imageAdapter.refreshList(null);
                         loadData();
 
                     }
@@ -444,6 +531,9 @@ public class EventMessageFragment extends BaseFragment {
                 hideLoadingDialog(LoadingDialog.LOADING_SUCCESS);
                 if (list != null && list.size() > 0) {
                     feedBackDetailsBeanList.clear();
+                    for (EventMessageDetailsBean data : list) {
+                        data.setSelected(false);
+                    }
                     feedBackDetailsBeanList.addAll(list);
                     adapter.refreshList(list);
                 }

+ 9 - 1
app/src/main/java/com/sjkj/appthreefloor_tsgz/login/LoginActivity.java

@@ -17,6 +17,7 @@ import com.sjkj.appthreefloor_tsgz.app.App;
 import com.sjkj.appthreefloor_tsgz.databinding.ActivityLoginBinding;
 import com.sjkj.appthreefloor_tsgz.net.LoginRequest;
 import com.sjkj.appthreefloor_tsgz.utils.LongClickUtils;
+import com.sjkj.appthreefloor_tsgz.utils.RSAUtils;
 import com.sjkj.base_lib.app.AppManager;
 import com.sjkj.base_lib.entity.Params;
 import com.sjkj.base_lib.net.domain.interactor.ProcessErrorSubscriber;
@@ -152,11 +153,18 @@ public class LoginActivity extends BaseLoginActivity {
 //            ToastUtils.show("密码不能为空");
 //            return;
 //        }
+        String encryptBytes = "";
+        String publicKey="MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==";
+        try {
+            encryptBytes = RSAUtils.encryptPublicKey(viewModel.password.get().getBytes(), publicKey);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
         showLoadingDialog();
         Params params = new Params();
         // params.put("loginType", "mobile");
         params.put("username", viewModel.username.get());
-        params.put("password", viewModel.password.get());
+        params.put("password", encryptBytes);
         //params.put("code", "5521");
         //params.put("sessionId", viewModel.sessionId.get());
         //params.put("deviceid", PushUtils.getRegistrationId());

+ 2 - 1
app/src/main/java/com/sjkj/appthreefloor_tsgz/map/MapMarkBean.java

@@ -1,6 +1,7 @@
 package com.sjkj.appthreefloor_tsgz.map;
 
-import com.sjkj.base_lib.camera.dh.bean.CameraBean;
+
+import com.sjkj.appthreefloor_tsgz.bean.CameraBean;
 
 import java.io.Serializable;
 import java.util.List;

+ 10 - 13
base-lib/src/main/java/com/sjkj/base_lib/net/request/DeviceListRequest.java

@@ -1,8 +1,8 @@
-package com.sjkj.base_lib.net.request;
+package com.sjkj.appthreefloor_tsgz.net;
 
 import android.content.Context;
 
-import com.sjkj.base_lib.camera.dh.bean.CameraBean;
+import com.sjkj.appthreefloor_tsgz.bean.ExoPlayerBean;
 import com.sjkj.base_lib.entity.Params;
 import com.sjkj.base_lib.entity.ResponseBean;
 import com.sjkj.base_lib.net.RetrofitFactory;
@@ -10,17 +10,15 @@ import com.sjkj.base_lib.net.data.exception.BusinessException;
 import com.sjkj.base_lib.net.domain.interactor.UseCase;
 import com.sjkj.base_lib.utils.AppTools;
 
-import java.util.List;
-
 import rx.Observable;
 import rx.functions.Func1;
 
 /**
- *
+ * 获取视频流
  */
-public class DeviceListRequest extends UseCase {
+public class GetPlayerUrlHKRequest extends UseCase {
     private Context context;
-    private RetrofitBaseService service;
+    private RetrofitService service;
 
     private Params params;
 
@@ -32,18 +30,17 @@ public class DeviceListRequest extends UseCase {
         this.params = params;
     }
 
-    public DeviceListRequest(Context context) {
+    public GetPlayerUrlHKRequest(Context context) {
         this.context = context;
-        service = RetrofitFactory.getRetrofit(AppTools.getBaseUrl(), true, 30L, false).create(RetrofitBaseService.class);
+        service = RetrofitFactory.getRetrofit(AppTools.getBaseUrl()).create(RetrofitService.class);
     }
 
     @Override
     protected Observable buildUseCaseObservable() {
-        return service.deviceList(params).flatMap(new Func1<ResponseBean<List<CameraBean>>, Observable<List<CameraBean>>>() {
+        return service.gethikPreviewURLsHK(params).flatMap(new Func1<ResponseBean<ExoPlayerBean>, Observable<ExoPlayerBean>>() {
             @Override
-            public Observable<List<CameraBean>> call(ResponseBean<List<CameraBean>> responseBean) {
-                if (!ResponseBean.CODE_SUCCESS.
-                        equals(responseBean.getCode())) {
+            public Observable<ExoPlayerBean> call(ResponseBean<ExoPlayerBean> responseBean) {
+                if (!"0".equals(responseBean.getCode())) {
                     return Observable.error(new BusinessException(responseBean.getMsg()));
                 }
                 return Observable.just(responseBean.getData());

+ 4 - 3
app/src/main/java/com/sjkj/appthreefloor_tsgz/net/GetPlayerUrlRequest.java

@@ -1,6 +1,7 @@
 package com.sjkj.appthreefloor_tsgz.net;
 
 import android.content.Context;
+import android.util.Log;
 
 import com.sjkj.appthreefloor_tsgz.bean.ExoPlayerBean;
 import com.sjkj.base_lib.entity.Params;
@@ -37,10 +38,10 @@ public class GetPlayerUrlRequest extends UseCase {
 
     @Override
     protected Observable buildUseCaseObservable() {
-        return service.gethikPreviewURLs(params).flatMap(new Func1<ResponseBean<ExoPlayerBean>, Observable<ExoPlayerBean>>() {
+        return service.gethikPreviewURLs(params).flatMap(new Func1<ResponseBean<Object>, Observable<Object>>() {
             @Override
-            public Observable<ExoPlayerBean> call(ResponseBean<ExoPlayerBean> responseBean) {
-                if (!"0".equals(responseBean.getCode())) {
+            public Observable<Object> call(ResponseBean<Object> responseBean) {
+                if (!"200".equals(responseBean.getCode())) {
                     return Observable.error(new BusinessException(responseBean.getMsg()));
                 }
                 return Observable.just(responseBean.getData());

+ 5 - 1
app/src/main/java/com/sjkj/appthreefloor_tsgz/net/RetrofitService.java

@@ -128,6 +128,10 @@ public interface RetrofitService {
 
     //获取视频流
     @POST("hik/previewURLs")
-    Observable<ResponseBean<ExoPlayerBean>> gethikPreviewURLs(@QueryMap Map<String, Object> params);
+    Observable<ResponseBean<ExoPlayerBean>> gethikPreviewURLsHK(@QueryMap Map<String, Object> params);
+
+    //获取视频流
+    @POST("dh/realtime")
+    Observable<ResponseBean<Object>> gethikPreviewURLs(@QueryMap Map<String, Object> params);
 
 }

+ 1 - 1
app/src/main/java/com/sjkj/appthreefloor_tsgz/net/UploadFileRequest.java

@@ -36,7 +36,7 @@ public class UploadFileRequest extends UseCase {
         this.file = file;
         if (this.file.exists()) {
             double filesSize = FileSizeUtil.getFileOrFilesSize(file.getPath(), 3);
-            Log.e("UploadFileRequest", filesSize+"MB");
+            Log.e("zhrUploadFileRequest", filesSize+"MB");
             RequestBody requestBody = RequestBody.create(file, MediaType.parse("file/*"));
             part = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
         } else {

+ 48 - 0
app/src/main/java/com/sjkj/appthreefloor_tsgz/utils/AmrUtils.java

@@ -0,0 +1,48 @@
+package com.sjkj.appthreefloor_tsgz.utils;
+
+import android.media.MediaMetadataRetriever;
+import android.text.TextUtils;
+
+import java.util.Locale;
+
+public class AmrUtils {
+    public static boolean ISAMR(String end) {
+        if (end.equals("jpg") || end.equals("gif") || end.equals("png") || end.equals("jpeg") || end.equals("bmp") || end.equals("webp") || end.equals("psd") || end.equals("svg") || end.equals("tiff")) {
+
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public static boolean isAmr(String path) {
+        if (TextUtils.isEmpty(path)) {
+            return false;
+        }
+      /*  File file = new File(path);
+        if (!file.exists()) {
+            return false;
+        }*/
+        /* 取得扩展名 */
+        String end = path.substring(path.lastIndexOf(".") + 1, path.length()).toLowerCase(Locale.getDefault());
+        if (end.equals("amr")) {
+            return true;
+        } else {
+            return false;
+        }
+
+    }
+
+    public static String getAmrDuration(String filePath) {
+        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
+        retriever.setDataSource(filePath);
+        String duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
+
+        // 将时长从毫秒转换为分钟:秒格式
+        Long durationInMillis = Long.parseLong(duration);
+        int minutes = (int) (durationInMillis / 1000) / 60;
+        int seconds = (int) (durationInMillis / 1000) % 60;
+
+        return String.format("%02d:%02d", minutes, seconds);
+    }
+}

+ 265 - 0
app/src/main/java/com/sjkj/appthreefloor_tsgz/utils/AudioPlayView.java

@@ -0,0 +1,265 @@
+package com.sjkj.appthreefloor_tsgz.utils;
+
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.content.res.AssetFileDescriptor;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.net.Uri;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.view.animation.LinearInterpolator;
+import android.widget.VideoView;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
+
+import com.sjkj.appthreefloor_tsgz.R;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * @author cwl
+ * @desc 音频播放器控件,有动画,使用DK播放器来播放音频
+ * 线的长度用初始长度+正弦值的绝对值来控制,
+ * 绝对值正弦波正好可以满足慢慢变大再慢慢变小的动画效果。
+ * @Email 377979485@qq.com
+ * @time 2023/8/23 17:12
+ */
+public class AudioPlayView extends View {
+    private static final int LINE_NUM = 15;//画线的数量
+    private Paint paintBorder, paintBg, paintLine;//画笔
+    private Random random;
+
+    public ValueAnimator getAnimator() {
+        return animator;
+    }
+
+    public void setAnimator(ValueAnimator animator) {
+        this.animator = animator;
+    }
+
+    public ValueAnimator animator;
+    private VideoView videoView;//播放器
+    private List<LineBean> list;//画线的集合
+    private double angle, lastAngle;//角度,单位是度——“°”
+    private float animValue;//动画的当前值
+    private float centerX, centerY;//画线的中心点坐标
+    private float marginHorizontal, marginVertical;//画线的间距
+    private float lineWidth, lineAreaWidth;//画线的宽度和线与线直接的宽度
+    private float maxLineHeight, lineHeight;//画线的最大高度和画线的高度
+    @ColorInt
+    private int colorFt;//主色
+
+    public AudioPlayView(Context context) {
+        this(context, null);
+    }
+
+    public AudioPlayView(Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    /**
+     * 初始化
+     */
+    private void init() {
+        colorFt = ContextCompat.getColor(getContext(), R.color.dark);
+
+        paintBorder = new Paint(Paint.ANTI_ALIAS_FLAG);
+        paintBorder.setColor(colorFt);
+        paintBorder.setStyle(Paint.Style.STROKE);
+
+        paintBg = new Paint(Paint.ANTI_ALIAS_FLAG);
+        paintBg.setColor(Color.WHITE);
+        paintBg.setStyle(Paint.Style.FILL_AND_STROKE);
+
+        paintLine = new Paint(Paint.ANTI_ALIAS_FLAG);
+        paintLine.setColor(colorFt);
+        paintLine.setStyle(Paint.Style.FILL_AND_STROKE);
+
+        random = new Random();
+        createIfNoVideoView();
+    }
+
+    /**
+     * 如果没有播放器控件则创建一个
+     */
+    private void createIfNoVideoView() {
+        if (videoView == null) {
+            videoView = new VideoView(getContext());
+        }
+    }
+
+    /**
+     * 设置Asset文件并播放
+     *
+     * @param resId 文件编号
+     */
+    public void setAssetFileDescriptorAndStartPlay(int resId) {
+        createIfNoVideoView();
+        AssetFileDescriptor afd = getResources().openRawResourceFd(resId);
+        // videoView.setAssetFileDescriptor(afd);
+
+        videoView.start();
+        startAnimation();
+    }
+
+    /**
+     * 释放播放器
+     */
+    public void release() {
+        videoView = null;
+    }
+
+    /**
+     * 开始播放
+     *
+     * @param audioFilePath 音频文件资源
+     */
+    public void startPlay(String audioFilePath) {
+        createIfNoVideoView();
+        videoView.setVideoURI(Uri.parse(audioFilePath));
+        videoView.start();
+        startAnimation();
+    }
+
+    /**
+     * 终止播放
+     */
+    public void stopPlay() {
+        createIfNoVideoView();
+        videoView.pause();
+        stopAnimation();
+    }
+
+    /**
+     * 是否在播放
+     *
+     * @return 所求
+     */
+    public boolean isPlaying() {
+        createIfNoVideoView();
+        return videoView.isPlaying();
+    }
+
+    /**
+     * 开始动画
+     */
+    public void startAnimation() {
+        if (animator != null && animator.isRunning()) {
+            animator.cancel();
+
+            animator = null;
+        }
+        animator = ValueAnimator.ofFloat(0, 180);
+        animator.addUpdateListener(animation -> {
+            animValue = (float) animation.getAnimatedValue();
+            invalidate();
+        });
+        animator.setRepeatMode(ValueAnimator.RESTART);
+        animator.setRepeatCount(ValueAnimator.INFINITE);
+        animator.setDuration(1200);
+        animator.setInterpolator(new LinearInterpolator());
+        animator.start();
+    }
+
+    /**
+     * 停止动画
+     */
+    public void stopAnimation() {
+        if (animator != null && animator.isRunning()) {
+            animator.cancel();
+            animator = null;
+        }
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+        if (centerX == 0) {//只会运行一次
+            centerX = getWidth() / 2f;
+            centerY = getHeight() / 2f;
+            marginHorizontal = getWidth() / 6f;
+            marginVertical = marginHorizontal / 2f;
+            lineAreaWidth = (getWidth() - marginHorizontal * 2) / LINE_NUM;
+            lineWidth = lineAreaWidth / 3f;
+            maxLineHeight = getHeight() - marginVertical * 2;
+            paintBorder.setStrokeWidth(lineWidth);
+        }
+        if (list == null || list.size() == 0) {//只会运行一次
+            list = new ArrayList<>();
+            lastAngle = 180 * 2 / 5f;
+            for (int i = 0; i < LINE_NUM; i++) {
+                //根据前一条线的angle随机增加或减少一个单位(36°)的角度,
+                //目的是为了保证相邻的两条线有差别且差别不大,这样整体看起来更加连贯
+                angle = random.nextInt(2) == 0 ? lastAngle - 180 / 5f : lastAngle + 180 / 5f;
+                list.add(new LineBean(i, angle));
+                lastAngle = angle;
+            }
+        }
+        canvas.drawRoundRect(lineWidth / 2f,
+                lineWidth / 2f,
+                getWidth() - lineWidth / 2f,
+                getHeight() - lineWidth / 2f,
+                getHeight() / 2f,
+                getHeight() / 2f,
+                paintBg);
+        canvas.drawRoundRect(lineWidth / 2f,
+                lineWidth / 2f,
+                getWidth() - lineWidth / 2f,
+                getHeight() - lineWidth / 2f,
+                getHeight() / 2f,
+                getHeight() / 2f,
+                paintBorder);
+        for (int i = 0; i < list.size(); i++) {
+            //线的长度用初始长度+正弦值的绝对值来控制,绝对值正弦波正好可以满足慢慢变大再慢慢变小的动画效果。
+            lineHeight = maxLineHeight / 10f + (int) (Math.abs(Math.sin(Math.toRadians(list.get(i).getAngle() + animValue))) * maxLineHeight);
+            canvas.drawRoundRect(marginHorizontal + i * lineAreaWidth + lineAreaWidth / 2f - lineWidth / 2f,
+                    centerY - lineHeight / 2f,
+                    marginHorizontal + i * lineAreaWidth + lineAreaWidth / 2f + lineWidth / 2f,
+                    centerY + lineHeight / 2f,
+                    lineWidth / 2f,
+                    lineWidth / 2f,
+                    paintLine);
+        }
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        stopAnimation();
+        videoView.pause();
+    }
+
+    static class LineBean {
+        int position;
+        double angle;
+
+        public LineBean(int position, double angle) {
+            this.position = position;
+            this.angle = angle;
+        }
+
+        public int getPosition() {
+            return position;
+        }
+
+        public void setPosition(int position) {
+            this.position = position;
+        }
+
+        public double getAngle() {
+            return angle;
+        }
+
+        public void setAngle(double angle) {
+            this.angle = angle;
+        }
+    }
+}

+ 58 - 0
app/src/main/java/com/sjkj/appthreefloor_tsgz/utils/KeybordS.java

@@ -0,0 +1,58 @@
+package com.sjkj.appthreefloor_tsgz.utils;
+
+import android.app.Activity;
+import android.content.Context;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+
+public class KeybordS {
+
+    /**
+     * 打开软键盘
+     *
+     * @param mEditText
+     * @param mContext
+     */
+    public static void openKeybord(EditText mEditText, Context mContext) {
+        InputMethodManager imm = (InputMethodManager) mContext
+                .getSystemService(Context.INPUT_METHOD_SERVICE);
+        assert imm != null;
+        imm.showSoftInput(mEditText, InputMethodManager.RESULT_SHOWN);
+        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,
+                InputMethodManager.HIDE_IMPLICIT_ONLY);
+    }
+
+    /**
+     * 关闭软键盘
+     */
+    public static void closeKeybord(EditText mEditText, Context mContext) {
+        InputMethodManager imm = (InputMethodManager) mContext
+                .getSystemService(Context.INPUT_METHOD_SERVICE);
+        assert imm != null;
+        imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
+    }
+
+    /**
+     * 判断当前软键盘是否打开
+     *
+     * @param activity
+     * @return
+     */
+    public static boolean isSoftInputShow(Activity activity) {
+
+        // 虚拟键盘隐藏 判断view是否为空
+        View view = activity.getWindow().peekDecorView();
+        if (view != null) {
+            // 隐藏虚拟键盘
+            InputMethodManager inputmanger = (InputMethodManager) activity
+                    .getSystemService(Activity.INPUT_METHOD_SERVICE);
+//       inputmanger.hideSoftInputFromWindow(view.getWindowToken(),0);
+
+            assert inputmanger != null;
+            return inputmanger.isActive() && activity.getWindow().getCurrentFocus() != null;
+        }
+        return false;
+    }
+
+}

+ 250 - 0
app/src/main/java/com/sjkj/appthreefloor_tsgz/utils/RSA.java

@@ -0,0 +1,250 @@
+package com.sjkj.appthreefloor_tsgz.utils;
+
+
+import android.util.Base64;
+
+import java.security.KeyFactory;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.SecureRandom;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+
+public class RSA {
+    private static final String ALGORITHM = "RSA";
+    public static String encrypt2(String data, String publicKeyString) throws Exception {
+        byte[] dataBytes = data.getBytes("GB2312");  // 使用 GB2312 编码
+        //byte[] dataBytes = data.getBytes("UTF-8"); // 使用 UTF-8 编码
+
+        // 将Base64编码的公钥字符串转换为 PublicKey 对象
+        byte[] publicKeyBytes = Base64.decode(publicKeyString, Base64.DEFAULT);
+        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+        PublicKey publicKey = keyFactory.generatePublic(keySpec);
+
+        // 使用公钥初始化 Cipher 对象
+        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+
+        // 执行加密操作
+        byte[] encryptedBytes = cipher.doFinal(dataBytes);
+        // 将加密结果进行Base64编码并返回
+        return Base64.encodeToString(encryptedBytes, Base64.DEFAULT);
+    }
+
+    /**
+     * 公钥加密
+     *
+     * @param src
+     *            明文
+     * @param key
+     *            密钥
+     * @return
+     */
+    public static String RSAPublicEncrypt(String src, String key) {
+        try {
+            PublicKey pubkey = getPublicKeyFromX509(ALGORITHM, key);
+            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+            cipher.init(Cipher.ENCRYPT_MODE, pubkey);
+            byte bytes[] = src.getBytes("UTF-8");
+            byte[] encrypted = blockCipher(cipher, bytes, Cipher.ENCRYPT_MODE);
+            return bytes2Hex(encrypted);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    /**
+     * 私钥解密
+     *
+     * @param src
+     *            密文
+     * @param key
+     *            密钥
+     * @return
+     */
+    public static String RSAPrivateDncrypt(String src, String key) {
+        try {
+            PrivateKey prikey = getEncodedKeySpecPKCS8(ALGORITHM, key);
+            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+            cipher.init(Cipher.DECRYPT_MODE, prikey);
+            byte bytes[] = toByte(src);
+            byte[] decrypted = blockCipher(cipher, bytes, Cipher.DECRYPT_MODE);
+            return new String(decrypted, "UTF-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 私钥加密
+     *
+     * @param src
+     *            明文
+     * @param key
+     *            密钥
+     * @return
+     */
+    public static String RSAPrivateEncrypt(String src, String key) {
+        try {
+            PrivateKey prikey = getEncodedKeySpecPKCS8(ALGORITHM, key);
+            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+            cipher.init(Cipher.ENCRYPT_MODE, prikey);
+            byte bytes[] = src.getBytes("UTF-8");
+            byte[] encrypted = blockCipher(cipher, bytes, Cipher.ENCRYPT_MODE);
+            return bytes2Hex(encrypted);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    /**
+     * 公钥解密
+     *
+     * @param src
+     *            密文
+     * @param key
+     *            密钥
+     * @return
+     */
+    public static String RSAPublicDncrypt(String src, String key) {
+        try {
+            PublicKey pubkey = getPublicKeyFromX509(ALGORITHM, key);
+            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+            cipher.init(Cipher.DECRYPT_MODE, pubkey);
+            byte bytes[] = toByte(src);
+            byte[] decrypted = blockCipher(cipher, bytes, Cipher.DECRYPT_MODE);
+            return new String(decrypted, "UTF-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 得到公钥
+     */
+    private static PublicKey getPublicKeyFromX509(String algorithm,
+                                                  String bysKey) throws NoSuchAlgorithmException, Exception {
+        byte[] decodedKey = toByte(bysKey);
+        X509EncodedKeySpec x509 = new X509EncodedKeySpec(decodedKey);
+        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
+        return keyFactory.generatePublic(x509);
+    }
+
+    /**
+     * 得到私钥
+     */
+    private static PrivateKey getEncodedKeySpecPKCS8(String algorithm,
+                                                     String bysKey) throws NoSuchAlgorithmException, Exception {
+        byte[] decodedKey = toByte(bysKey);
+        PKCS8EncodedKeySpec PKCS8 = new PKCS8EncodedKeySpec(decodedKey);
+        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
+        return keyFactory.generatePrivate(PKCS8);
+    }
+
+    private static byte[] blockCipher(Cipher cipher, byte[] bytes, int mode)
+            throws IllegalBlockSizeException, BadPaddingException {
+        byte[] scrambled = new byte[0];
+        byte[] toReturn = new byte[0];
+        // 如果我们使用长100字节块加密。解密需要128长度
+        int length = (mode == Cipher.ENCRYPT_MODE) ? 100 : 128;
+        byte[] buffer = null;
+        if (bytes.length <= length) {
+            return cipher.doFinal(bytes);
+        } else {
+            buffer = new byte[length];
+        }
+        for (int i = 0; i < bytes.length; i++) {
+            if ((i > 0) && (i % length == 0)) {
+                scrambled = cipher.doFinal(buffer);
+                toReturn = append(toReturn, scrambled);
+                int newlength = length;
+                if (i + length > bytes.length) {
+                    newlength = bytes.length - i;
+                }
+                buffer = new byte[newlength];
+            }
+            buffer[i % length] = bytes[i];
+        }
+        scrambled = cipher.doFinal(buffer);
+        toReturn = append(toReturn, scrambled);
+        return toReturn;
+    }
+
+    private static byte[] append(byte[] prefix, byte[] suffix) {
+        byte[] toReturn = new byte[prefix.length + suffix.length];
+        for (int i = 0; i < prefix.length; i++) {
+            toReturn[i] = prefix[i];
+        }
+        for (int i = 0; i < suffix.length; i++) {
+            toReturn[i + prefix.length] = suffix[i];
+        }
+        return toReturn;
+    }
+
+    /**
+     * 随机生成密钥对
+     */
+    public static Map<String, String> genKeyPair() {
+        KeyPairGenerator keyPairGen = null;
+        try {
+            keyPairGen = KeyPairGenerator.getInstance("RSA");
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        // 第一个参数为秘钥长度,当需要2048加密只需修改秘钥长度即可
+        keyPairGen.initialize(1024, new SecureRandom());
+        KeyPair keyPair = keyPairGen.generateKeyPair();
+        Map<String, String> key = new HashMap<String, String>();
+        key.put("PrivateKey", bytes2Hex((keyPair.getPrivate().getEncoded())));
+        key.put("PublicKey", bytes2Hex(keyPair.getPublic().getEncoded()));
+        return key;
+    }
+
+    /**
+     * Byte[]转16进制
+     *
+     * @param bts
+     * @return
+     */
+    private static String bytes2Hex(byte[] bts) {
+        String des = "";
+        String tmp = null;
+        for (int i = 0; i < bts.length; i++) {
+            tmp = (Integer.toHexString(bts[i] & 0xFF));
+            if (tmp.length() == 1) {
+                des += "0";
+            }
+            des += tmp;
+        }
+        return des;
+    }
+
+    /**
+     * 将16进制转换为byte数组
+     *
+     * @param hexString
+     *            16进制字符串
+     * @return byte数组
+     */
+
+    public static byte[] toByte(String hexString) {
+        int len = hexString.length() / 2;
+        byte[] result = new byte[len];
+        for (int i = 0; i < len; i++)
+            result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2),
+                    16).byteValue();
+        return result;
+    }
+}

+ 0 - 191
app/src/main/java/com/sjkj/appthreefloor_tsgz/utils/StatusBarUtil.java

@@ -1,191 +0,0 @@
-package com.sjkj.appthreefloor_tsgz.utils;
-
-
-import android.annotation.TargetApi;
-import android.app.Activity;
-import android.graphics.Color;
-import android.os.Build;
-import android.view.View;
-import android.view.Window;
-import android.view.WindowManager;
-import com.readystatesoftware.systembartint.SystemBarTintManager;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-
-/**
- * 状态栏工具类
- */
-public class StatusBarUtil {
-    /**
-     * 修改状态栏为全透明
-     *
-     * @param activity
-     */
-    @TargetApi(19)
-    public static void transparencyBar(Activity activity) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            Window window = activity.getWindow();
-            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
-            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
-                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
-            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
-            window.setStatusBarColor(Color.TRANSPARENT);
-
-        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-            Window window = activity.getWindow();
-            window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
-                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
-        }
-    }
-
-    /**
-     * 修改状态栏颜色,支持4.4以上版本
-     *
-     * @param activity
-     * @param colorId
-     */
-    public static void setStatusBarColor(Activity activity, int colorId) {
-
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            Window window = activity.getWindow();
-            window.setStatusBarColor(activity.getResources().getColor(colorId));
-        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-            //使用SystemBarTint库使4.4版本状态栏变色,需要先将状态栏设置为透明
-            transparencyBar(activity);
-            SystemBarTintManager tintManager = new SystemBarTintManager(activity);
-            tintManager.setStatusBarTintEnabled(true);
-            tintManager.setStatusBarTintResource(colorId);
-        }
-    }
-
-    /**
-     * 状态栏亮色模式,设置状态栏黑色文字、图标,
-     * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android
-     *
-     * @param activity
-     * @return 1:MIUUI 2:Flyme 3:android6.0
-     */
-    public static int StatusBarLightMode(Activity activity) {
-        int result = 0;
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-            if (MIUISetStatusBarLightMode(activity, true)) {
-                result = 1;
-            } else if (FlymeSetStatusBarLightMode(activity.getWindow(), true)) {
-                result = 2;
-            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-                activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
-                result = 3;
-            }
-        }
-        return result;
-    }
-
-    /**
-     * 已知系统类型时,设置状态栏黑色文字、图标。
-     * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android
-     *
-     * @param activity
-     * @param type     1:MIUUI 2:Flyme 3:android6.0
-     */
-    public static void StatusBarLightMode(Activity activity, int type) {
-        if (type == 1) {
-            MIUISetStatusBarLightMode(activity, true);
-        } else if (type == 2) {
-            FlymeSetStatusBarLightMode(activity.getWindow(), true);
-        } else if (type == 3) {
-            activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
-        }
-
-    }
-
-    /**
-     * 状态栏暗色模式,清除MIUI、flyme或6.0以上版本状态栏黑色文字、图标
-     */
-    public static void StatusBarDarkMode(Activity activity, int type) {
-        if (type == 1) {
-            MIUISetStatusBarLightMode(activity, false);
-        } else if (type == 2) {
-            FlymeSetStatusBarLightMode(activity.getWindow(), false);
-        } else if (type == 3) {
-            activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
-        }
-
-    }
-
-
-    /**
-     * 设置状态栏图标为深色和魅族特定的文字风格
-     * 可以用来判断是否为Flyme用户
-     *
-     * @param window 需要设置的窗口
-     * @param dark   是否把状态栏文字及图标颜色设置为深色
-     * @return boolean 成功执行返回true
-     */
-    public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) {
-        boolean result = false;
-        if (window != null) {
-            try {
-                WindowManager.LayoutParams lp = window.getAttributes();
-                Field darkFlag = WindowManager.LayoutParams.class
-                        .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
-                Field meizuFlags = WindowManager.LayoutParams.class
-                        .getDeclaredField("meizuFlags");
-                darkFlag.setAccessible(true);
-                meizuFlags.setAccessible(true);
-                int bit = darkFlag.getInt(null);
-                int value = meizuFlags.getInt(lp);
-                if (dark) {
-                    value |= bit;
-                } else {
-                    value &= ~bit;
-                }
-                meizuFlags.setInt(lp, value);
-                window.setAttributes(lp);
-                result = true;
-            } catch (Exception e) {
-
-            }
-        }
-        return result;
-    }
-
-    /**
-     * 需要MIUIV6以上
-     *
-     * @param activity
-     * @param dark     是否把状态栏文字及图标颜色设置为深色
-     * @return boolean 成功执行返回true
-     */
-    public static boolean MIUISetStatusBarLightMode(Activity activity, boolean dark) {
-        boolean result = false;
-        Window window = activity.getWindow();
-        if (window != null) {
-            Class clazz = window.getClass();
-            try {
-                int darkModeFlag = 0;
-                Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
-                Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
-                darkModeFlag = field.getInt(layoutParams);
-                Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
-                if (dark) {
-                    extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体
-                } else {
-                    extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体
-                }
-                result = true;
-
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-                    //开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错,所以两个方式都要加上
-                    if (dark) {
-                        activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
-                    } else {
-                        activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
-                    }
-                }
-            } catch (Exception e) {
-            }
-        }
-        return result;
-    }
-}

+ 0 - 5
app/src/main/res/anim/actionsheet_dialog_in.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<translate xmlns:android="http://schemas.android.com/apk/res/android"
-    android:duration="200"
-    android:fromYDelta="100%"
-    android:toYDelta="0" />

+ 0 - 5
app/src/main/res/anim/actionsheet_dialog_out.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<translate xmlns:android="http://schemas.android.com/apk/res/android"
-    android:duration="200"
-    android:fromYDelta="0"
-    android:toYDelta="100%" />

+ 0 - 7
app/src/main/res/anim/activity_out.xml

@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <alpha
-        android:duration="150"
-        android:fromAlpha="1.0"
-        android:toAlpha="1.0"/>
-</set>

+ 0 - 11
app/src/main/res/anim/progress.xml

@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <rotate
-        android:duration="1000"
-        android:fromDegrees="0"
-        android:pivotX="50%"
-        android:pivotY="50%"
-        android:repeatCount="infinite"
-        android:interpolator="@android:anim/linear_interpolator"
-        android:toDegrees="360" />
-</set>

+ 0 - 11
app/src/main/res/anim/push_bottom_in.xml

@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!-- 上下滑入式 -->
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <translate
-        android:duration="200"
-        android:fromYDelta="100%p"
-        android:toYDelta="0" />
-    <alpha
-        android:duration="200"
-        android:fromAlpha="0.0"
-        android:toAlpha="1.0" />
-</set>

+ 0 - 11
app/src/main/res/anim/push_bottom_out.xml

@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!-- 上下滑入式 -->
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <translate
-        android:duration="200"
-        android:fromYDelta="0"
-        android:toYDelta="50%p" />
-    <alpha
-        android:duration="200"
-        android:fromAlpha="1.0"
-        android:toAlpha="0.0" />
-</set>

二进制
app/src/main/res/drawable-hdpi/ic_launcher_logo_siping_tsgz_small.png


+ 0 - 170
app/src/main/res/drawable-v24/ic_launcher_background.xml

@@ -1,170 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="108dp"
-    android:height="108dp"
-    android:viewportWidth="108"
-    android:viewportHeight="108">
-    <path
-        android:fillColor="#3DDC84"
-        android:pathData="M0,0h108v108h-108z" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M9,0L9,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,0L19,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M29,0L29,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M39,0L39,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M49,0L49,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M59,0L59,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M69,0L69,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M79,0L79,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M89,0L89,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M99,0L99,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,9L108,9"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,19L108,19"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,29L108,29"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,39L108,39"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,49L108,49"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,59L108,59"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,69L108,69"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,79L108,79"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,89L108,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,99L108,99"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,29L89,29"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,39L89,39"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,49L89,49"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,59L89,59"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,69L89,69"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,79L89,79"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M29,19L29,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M39,19L39,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M49,19L49,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M59,19L59,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M69,19L69,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M79,19L79,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-</vector>

文件差异内容过多而无法显示
+ 0 - 30
app/src/main/res/drawable-v24/ic_launcher_foreground.xml


二进制
app/src/main/res/drawable-xhdpi/default_image.png


二进制
app/src/main/res/drawable-xhdpi/ic_launcher_logo_siping_tsgz_small.png


二进制
base-lib/src/main/res/mipmap-xxhdpi/play_online_ani_ptz_right_h.png


二进制
app/src/main/res/drawable-xxhdpi/blue_round.9.png


二进制
app/src/main/res/drawable-xxhdpi/cancel.png


二进制
base-lib/src/main/res/mipmap-xxhdpi/play_online_ani_ptz_left_h.png


二进制
app/src/main/res/drawable-xxhdpi/dialog_loading_bg.9.png


二进制
app/src/main/res/drawable-xxhdpi/ic_san.png


二进制
app/src/main/res/drawable-xxhdpi/icon_add.png


二进制
app/src/main/res/drawable-xxhdpi/icon_banner.png


二进制
app/src/main/res/drawable-xxhdpi/icon_choose.png


二进制
app/src/main/res/drawable-xxhdpi/icon_daily.png


二进制
app/src/main/res/drawable-xxhdpi/icon_dx.png


二进制
app/src/main/res/drawable-xxhdpi/keyboard.png


二进制
app/src/main/res/drawable-xxhdpi/recorder.png


二进制
app/src/main/res/drawable-xxhdpi/v1.png


二进制
app/src/main/res/drawable-xxhdpi/v2.png


二进制
app/src/main/res/drawable-xxhdpi/v3.png


二进制
app/src/main/res/drawable-xxhdpi/v4.png


二进制
app/src/main/res/drawable-xxhdpi/v5.png


二进制
app/src/main/res/drawable-xxhdpi/v6.png


二进制
app/src/main/res/drawable-xxhdpi/v7.png


二进制
app/src/main/res/drawable-xxhdpi/v_anim1.png


二进制
app/src/main/res/drawable-xxhdpi/v_anim2.png


二进制
app/src/main/res/drawable-xxhdpi/v_anim3.png


二进制
app/src/main/res/drawable-xxhdpi/voice.png


二进制
app/src/main/res/drawable-xxhdpi/voice_to_short.png


+ 0 - 10
app/src/main/res/drawable/bar_text_select.xml

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <item android:color="#0F5FEE" android:state_focused="true" />
-    <item android:color="#0F5FEE" android:state_pressed="true" />
-    <item android:color="#0F5FEE" android:state_selected="true" />
-    <item android:color="#0F5FEE" android:state_checked="true" />
-    <item android:color="#334960" />
-
-</selector>

+ 0 - 14
app/src/main/res/drawable/bg_event.xml

@@ -1,14 +0,0 @@
-<!-- res/drawable/shape_with_border.xml -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle">
-    <corners android:radius="10dp"/>
-    <solid android:color="#FFFFFF" /> <!-- 背景色 -->
-    <stroke
-        android:width="1dp"
-        android:color="#FFFFFF" /> <!-- 内边框 -->
-    <padding
-        android:left="4dp"
-        android:top="4dp"
-        android:right="4dp"
-        android:bottom="4dp"/> <!-- 用于模拟外阴影 -->
-</shape>

+ 0 - 7
app/src/main/res/drawable/bg_event_completed_select.xml

@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle">
-    <corners android:radius="5dp"/>
-    <solid android:color="#04BF60"/>
-    <stroke android:color="#04BF60" android:width="1dp"/>
-</shape>

+ 0 - 6
app/src/main/res/drawable/bg_tsgz_blue.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle">
-    <corners android:radius="10dp"/>
-    <solid android:color="#3870c8"/>
-</shape>

+ 0 - 11
app/src/main/res/drawable/bg_yuan_shape.xml

@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="oval"
-    android:useLevel="false">
-
-    <solid android:color="@color/main_blue_color" />
-    <stroke
-        android:width="1dp"
-        android:color="@color/main_blue_color" />
-
-</shape>

+ 11 - 0
app/src/main/res/drawable/btn_recorder_normal.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle"
+    >
+    <solid android:color="#ffffff" />
+    <stroke
+        android:color="#9b9b9b"
+        android:width="1px" />
+    <!--<corners android:radius="5dp" />-->
+
+</shape>

+ 10 - 0
app/src/main/res/drawable/btn_recording.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle"
+    >
+    <solid android:color="#eeeeee" />
+    <stroke
+        android:color="#9b9b9b"
+        android:width="1px" />
+    <corners android:radius="5dp" />
+</shape>

+ 0 - 5
app/src/main/res/drawable/gp_indicator_drawable.xml

@@ -1,5 +0,0 @@
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="oval">
-    <solid
-        android:color="@color/gp_indicator_color"/>
-</shape>

+ 0 - 9
app/src/main/res/drawable/ic_back.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="26dp"
-    android:height="26dp"
-    android:viewportWidth="1024"
-    android:viewportHeight="1024">
-  <path
-      android:pathData="M608,736c-6.4,0 -19.2,0 -25.6,-6.4l-192,-192C384,524.8 384,499.2 390.4,486.4l192,-192c12.8,-12.8 32,-12.8 44.8,0s12.8,32 0,44.8L460.8,512l166.4,166.4c12.8,12.8 12.8,32 0,44.8C627.2,736 614.4,736 608,736z"
-      android:fillColor="#ffffff"/>
-</vector>

+ 0 - 5
app/src/main/res/drawable/ic_baseline_event_note_24.xml

@@ -1,5 +0,0 @@
-<vector android:height="24dp" android:tint="#6D88E9"
-    android:viewportHeight="24" android:viewportWidth="24"
-    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
-    <path android:fillColor="@android:color/white" android:pathData="M17,10L7,10v2h10v-2zM19,3h-1L18,1h-2v2L8,3L8,1L6,1v2L5,3c-1.11,0 -1.99,0.9 -1.99,2L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,19L5,19L5,8h14v11zM14,14L7,14v2h7v-2z"/>
-</vector>

+ 0 - 9
app/src/main/res/drawable/ic_home.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="64dp"
-    android:height="64dp"
-    android:viewportWidth="1024"
-    android:viewportHeight="1024">
-  <path
-      android:pathData="M419.2,905.6v-278.4h185.6v278.4h230.4V534.4h140.8L512,118.4l-464,416h137.6v371.2h233.6z"
-      android:fillColor="#508cef"/>
-</vector>

+ 0 - 12
app/src/main/res/drawable/ic_me.xml

@@ -1,12 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="64dp"
-    android:height="64dp"
-    android:viewportWidth="1024"
-    android:viewportHeight="1024">
-  <path
-      android:pathData="M722.08,514.36c-14.28,-5.84 -29.03,-10.97 -44.05,-15.58C637.06,544.28 577.9,573.1 512,573.1c-66.22,0 -125.63,-29.09 -166.61,-74.97 -16.08,4.87 -31.87,10.3 -47.08,16.61 -76.06,31.51 -123.54,108.13 -120.34,190.4l3.73,96.03c1.15,29.67 25.54,53.12 55.22,53.12h547c31.53,0 57.43,-24.92 58.64,-56.44l3.51,-91.71c3.16,-83.06 -46.66,-160.13 -123.99,-191.78z"
-      android:fillColor="#508cef"/>
-  <path
-      android:pathData="M512,169.72c-99.1,0 -179.72,80.63 -179.72,179.73S412.9,529.17 512,529.17s179.73,-80.62 179.73,-179.72S611.1,169.72 512,169.72z"
-      android:fillColor="#508cef"/>
-</vector>

文件差异内容过多而无法显示
+ 0 - 9
app/src/main/res/drawable/ic_periphery.xml


文件差异内容过多而无法显示
+ 0 - 9
app/src/main/res/drawable/ic_tsgz.xml


+ 8 - 0
app/src/main/res/drawable/play_anim.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:drawable="@drawable/v_anim1" android:duration="300" />
+    <item android:drawable="@drawable/v_anim2" android:duration="300" />
+    <item android:drawable="@drawable/v_anim3" android:duration="300" />
+
+</animation-list>

+ 0 - 9
app/src/main/res/drawable/rounded_corners.xml

@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <solid android:color="#FFFFFF"/> <!-- 背景颜色 -->
-    <corners
-        android:topLeftRadius="20dp"
-        android:topRightRadius="20dp"
-        android:bottomLeftRadius="0dp"
-        android:bottomRightRadius="0dp"/>
-</shape>

+ 0 - 9
app/src/main/res/drawable/rounded_leftbootom_rightbootom.xml

@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <solid android:color="@color/white"/> <!-- 背景颜色 -->
-    <corners
-        android:topLeftRadius="20dp"
-        android:topRightRadius="20dp"
-        android:bottomLeftRadius="20dp"
-        android:bottomRightRadius="20dp"/>
-</shape>

+ 0 - 6
app/src/main/res/drawable/selector_event.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:drawable="@drawable/icon_enent_select" android:state_checked="true" />
-    <item android:drawable="@drawable/icon_enent_select" android:state_pressed="true" />
-    <item android:drawable="@drawable/icon_event" />
-</selector>

+ 0 - 6
app/src/main/res/drawable/selector_home.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:drawable="@drawable/icon_home_select" android:state_checked="true" />
-    <item android:drawable="@drawable/icon_home_select" android:state_pressed="true" />
-    <item android:drawable="@drawable/icon_home" />
-</selector>

+ 0 - 6
app/src/main/res/drawable/selector_me.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:drawable="@drawable/icon_me_select" android:state_checked="true" />
-    <item android:drawable="@drawable/icon_me_select" android:state_pressed="true" />
-    <item android:drawable="@drawable/icon_me" />
-</selector>

+ 0 - 7
app/src/main/res/drawable/shape_background_white_change.xml

@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <solid android:color="@color/color_white" />
-    <corners
-        android:bottomLeftRadius="50dp"
-        android:topLeftRadius="50dp" />
-</shape>

+ 0 - 10
app/src/main/res/drawable/shape_login_btn_solid_black.xml

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle">
-    <solid android:color="@color/main_blue_color" />
-    <corners
-        android:bottomLeftRadius="30dp"
-        android:bottomRightRadius="30dp"
-        android:topLeftRadius="30dp"
-        android:topRightRadius="30dp" />
-</shape>

+ 1 - 1
app/src/main/res/layout/activity_camera_list.xml

@@ -5,7 +5,7 @@
 
         <variable
             name="viewModel"
-            type="com.sjkj.base_lib.camera.dh.vm.CameraViewModel" />
+            type="com.sjkj.appthreefloor_tsgz.activity.viewModel.CameraViewModel" />
     </data>
 
     <LinearLayout

+ 0 - 33
app/src/main/res/layout/activity_exo.xml

@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <data>
-
-        <variable
-            name="viewModel"
-            type="com.sjkj.appthreefloor_tsgz.activity.viewModel.PlayViewModel" />
-    </data>
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="vertical">
-
-        <com.sjkj.appthreefloor_tsgz.utils.MyVideoView
-            android:id="@+id/player_view"
-            android:layout_width="match_parent"
-            android:layout_height="500dp" />
-
-        <Button
-            android:id="@+id/btn_cut"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="one" />
-
-        <Button
-            android:id="@+id/btn_cut2"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="two" />
-    </LinearLayout>
-</layout>

+ 37 - 0
app/src/main/res/layout/dialog_recorder.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="@drawable/dialog_loading_bg"
+    android:gravity="center"
+    android:orientation="vertical"
+    android:padding="20dp">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:id="@+id/id_recorder_dialog_icon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/recorder"
+            android:visibility="visible" />
+
+        <ImageView
+            android:id="@+id/id_recorder_dialog_voice"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/v1"
+            android:visibility="visible" />
+    </LinearLayout>
+
+    <TextView
+        android:id="@+id/id_recorder_dialog_label"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="5dp"
+        android:text="手指上划,取消发送"
+        android:textColor="#FFFFFF" />
+</LinearLayout>

+ 0 - 0
app/src/main/res/layout/fragment_event_message.xml


部分文件因为文件数量过多而无法显示