diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index b1adeb9..75ac52e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -1,14 +1,15 @@ package com.casic.dcms.ui; import android.annotation.SuppressLint; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; +import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -18,7 +19,6 @@ import android.widget.PopupWindow; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -47,12 +47,13 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.TimeOrDateUtil; import com.casic.dcms.utils.ToastHelper; import com.casic.dcms.widgets.VoicePlayView; -import com.iceteck.silicompressorr.SiliCompressor; +import com.google.gson.Gson; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; @@ -65,10 +66,10 @@ import com.qmuiteam.qmui.widget.popup.QMUIPopup; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import com.zolad.videoslimmer.VideoSlimmer; import java.io.File; import java.io.IOException; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ public class CaseUploadActivity extends BaseCaseActivity implements View.OnClickListener, View.OnTouchListener, ICaseLargeClassView, ICaseSmallClassView, ICaseSubmitCaseView, IUploadFileView { - private Context context = this; @BindView(R.id.caseLayout) LinearLayout caseLayout; @BindView(R.id.caseClassView) @@ -116,12 +116,15 @@ @BindView(R.id.submitButton) QMUIRoundButton submitButton; + private static final String TAG = "CaseUploadActivity"; + private Context context = this; private CaseLargeClassPresenterImpl caseLargeClassPresenter; private CaseSmallClassPresenterImpl caseSmallClassPresenter; private CaseSubmitPresenterImpl caseSubmitPresenter; private List largeClassBeans; private List smallClassBeans; - private QMUITipDialog submitDialog, qmuiTipDialog; + private QMUITipDialog submitDialog; + private ProgressDialog progressDialog; private UploadImagePresenterImpl uploadImagePresenter; private List imageList = new ArrayList<>();//服务器返回的拍照数据集 private ArrayList realPaths = new ArrayList<>();//真是图片路径 @@ -136,7 +139,6 @@ private String audioUrl, videoUrl; private AudioRecodeHelper audioRecodeHelper; private PopupWindow popWindow; - private static WeakReferenceHandler weakReferenceHandler; private boolean isFirstEnter = true; @Override @@ -156,15 +158,18 @@ caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord("提交中,请稍后") .create(); - qmuiTipDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("视频压缩中,请稍后") - .create(); - weakReferenceHandler = new WeakReferenceHandler(this); + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("视频压缩中..."); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCancelable(false); + progressDialog.setCanceledOnTouchOutside(false); + uploadImagePresenter = new UploadImagePresenterImpl(this); uploadAudioPresenter = new UploadAudioPresenterImpl(this); uploadVideoPresenter = new UploadVideoPresenterImpl(this); @@ -179,7 +184,6 @@ public void initEvent() { voiceView.setOnTouchListener(this); submitButton.setChangeAlphaWhenPress(true); - //录音相关 View view = View.inflate(this, R.layout.popu_microphone, null); int popWidth = (int) (QMUIDisplayHelper.getScreenWidth(this) * 0.35); @@ -340,6 +344,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -378,29 +383,25 @@ case PictureConfig.PREVIEW_VIDEO_CODE: LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0); //"realPath":"/storage/emulated/0/Movies/VID_20210426_17552226.mp4" + Log.d(TAG, "onActivityResult: " + new Gson().toJson(media)); //需要手动压缩视频 String mediaRealPath = media.getRealPath(); + if (TextUtils.isEmpty(mediaRealPath)) { + //部分手机getRealPath可能为空,需要备用路径 + mediaRealPath = media.getPath(); + } + if (TextUtils.isEmpty(mediaRealPath) || mediaRealPath.equals("")) { + //如果默认和备用路径还是为空,则不压缩上传 + ToastHelper.showToast("操作失败,无法获取有效的视频文件", ToastHelper.ERROR); + return; + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(mediaRealPath); + String defaultRotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + String defaultBitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - qmuiTipDialog.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - /** - * 视频压缩 - * 第一个参数:视频源文件路径 - * 第二个参数:压缩后视频保存的路径 - */ - String comPressPath = SiliCompressor.with(context).compressVideo(mediaRealPath, FileUtils.getVideoCompressPath()); - Message message = weakReferenceHandler.obtainMessage(); - message.what = 20210427; - message.obj = comPressPath; - weakReferenceHandler.sendMessage(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); + assert defaultRotation != null; + compressVideo(mediaRealPath, defaultRotation, defaultBitrate); break; case Constant.REQUEST_MAP_CODE: if (data == null) { @@ -421,27 +422,46 @@ } } - private static class WeakReferenceHandler extends Handler { - private WeakReference reference; - - private WeakReferenceHandler(CaseUploadActivity activity) { - reference = new WeakReference<>(activity); + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = Constant.DEFAULT_WIDTH / 2; + height = Constant.DEFAULT_HEIGHT / 2; + } else { + width = Constant.DEFAULT_HEIGHT / 2; + height = Constant.DEFAULT_WIDTH / 2; } - - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - CaseUploadActivity caseUploadActivity = reference.get(); - if (msg.what == 20210427) { - caseUploadActivity.qmuiTipDialog.dismiss(); - String comPressPath = (String) msg.obj; - if (!TextUtils.isEmpty(comPressPath)) { - caseUploadActivity.uploadVideoPresenter.onReadyRetrofitRequest(new File(comPressPath)); - } else { - ToastHelper.showToast("案卷视频上传失败", ToastHelper.ERROR); - } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = Constant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, Constant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); } - } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadVideoPresenter.onReadyRetrofitRequest(new File(outputVideoFile)); + } else { + ToastHelper.showToast("压缩失败", ToastHelper.ERROR); + } + progressDialog.dismiss(); + } + }); } /** @@ -614,7 +634,7 @@ videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); String completeURL = StringHelper.appendCompleteURL(videoUrl); - videoPlayerView.setUp(completeURL, ""); + videoPlayerView.setUp(completeURL, "", Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index b1adeb9..75ac52e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -1,14 +1,15 @@ package com.casic.dcms.ui; import android.annotation.SuppressLint; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; +import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -18,7 +19,6 @@ import android.widget.PopupWindow; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -47,12 +47,13 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.TimeOrDateUtil; import com.casic.dcms.utils.ToastHelper; import com.casic.dcms.widgets.VoicePlayView; -import com.iceteck.silicompressorr.SiliCompressor; +import com.google.gson.Gson; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; @@ -65,10 +66,10 @@ import com.qmuiteam.qmui.widget.popup.QMUIPopup; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import com.zolad.videoslimmer.VideoSlimmer; import java.io.File; import java.io.IOException; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ public class CaseUploadActivity extends BaseCaseActivity implements View.OnClickListener, View.OnTouchListener, ICaseLargeClassView, ICaseSmallClassView, ICaseSubmitCaseView, IUploadFileView { - private Context context = this; @BindView(R.id.caseLayout) LinearLayout caseLayout; @BindView(R.id.caseClassView) @@ -116,12 +116,15 @@ @BindView(R.id.submitButton) QMUIRoundButton submitButton; + private static final String TAG = "CaseUploadActivity"; + private Context context = this; private CaseLargeClassPresenterImpl caseLargeClassPresenter; private CaseSmallClassPresenterImpl caseSmallClassPresenter; private CaseSubmitPresenterImpl caseSubmitPresenter; private List largeClassBeans; private List smallClassBeans; - private QMUITipDialog submitDialog, qmuiTipDialog; + private QMUITipDialog submitDialog; + private ProgressDialog progressDialog; private UploadImagePresenterImpl uploadImagePresenter; private List imageList = new ArrayList<>();//服务器返回的拍照数据集 private ArrayList realPaths = new ArrayList<>();//真是图片路径 @@ -136,7 +139,6 @@ private String audioUrl, videoUrl; private AudioRecodeHelper audioRecodeHelper; private PopupWindow popWindow; - private static WeakReferenceHandler weakReferenceHandler; private boolean isFirstEnter = true; @Override @@ -156,15 +158,18 @@ caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord("提交中,请稍后") .create(); - qmuiTipDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("视频压缩中,请稍后") - .create(); - weakReferenceHandler = new WeakReferenceHandler(this); + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("视频压缩中..."); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCancelable(false); + progressDialog.setCanceledOnTouchOutside(false); + uploadImagePresenter = new UploadImagePresenterImpl(this); uploadAudioPresenter = new UploadAudioPresenterImpl(this); uploadVideoPresenter = new UploadVideoPresenterImpl(this); @@ -179,7 +184,6 @@ public void initEvent() { voiceView.setOnTouchListener(this); submitButton.setChangeAlphaWhenPress(true); - //录音相关 View view = View.inflate(this, R.layout.popu_microphone, null); int popWidth = (int) (QMUIDisplayHelper.getScreenWidth(this) * 0.35); @@ -340,6 +344,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -378,29 +383,25 @@ case PictureConfig.PREVIEW_VIDEO_CODE: LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0); //"realPath":"/storage/emulated/0/Movies/VID_20210426_17552226.mp4" + Log.d(TAG, "onActivityResult: " + new Gson().toJson(media)); //需要手动压缩视频 String mediaRealPath = media.getRealPath(); + if (TextUtils.isEmpty(mediaRealPath)) { + //部分手机getRealPath可能为空,需要备用路径 + mediaRealPath = media.getPath(); + } + if (TextUtils.isEmpty(mediaRealPath) || mediaRealPath.equals("")) { + //如果默认和备用路径还是为空,则不压缩上传 + ToastHelper.showToast("操作失败,无法获取有效的视频文件", ToastHelper.ERROR); + return; + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(mediaRealPath); + String defaultRotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + String defaultBitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - qmuiTipDialog.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - /** - * 视频压缩 - * 第一个参数:视频源文件路径 - * 第二个参数:压缩后视频保存的路径 - */ - String comPressPath = SiliCompressor.with(context).compressVideo(mediaRealPath, FileUtils.getVideoCompressPath()); - Message message = weakReferenceHandler.obtainMessage(); - message.what = 20210427; - message.obj = comPressPath; - weakReferenceHandler.sendMessage(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); + assert defaultRotation != null; + compressVideo(mediaRealPath, defaultRotation, defaultBitrate); break; case Constant.REQUEST_MAP_CODE: if (data == null) { @@ -421,27 +422,46 @@ } } - private static class WeakReferenceHandler extends Handler { - private WeakReference reference; - - private WeakReferenceHandler(CaseUploadActivity activity) { - reference = new WeakReference<>(activity); + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = Constant.DEFAULT_WIDTH / 2; + height = Constant.DEFAULT_HEIGHT / 2; + } else { + width = Constant.DEFAULT_HEIGHT / 2; + height = Constant.DEFAULT_WIDTH / 2; } - - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - CaseUploadActivity caseUploadActivity = reference.get(); - if (msg.what == 20210427) { - caseUploadActivity.qmuiTipDialog.dismiss(); - String comPressPath = (String) msg.obj; - if (!TextUtils.isEmpty(comPressPath)) { - caseUploadActivity.uploadVideoPresenter.onReadyRetrofitRequest(new File(comPressPath)); - } else { - ToastHelper.showToast("案卷视频上传失败", ToastHelper.ERROR); - } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = Constant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, Constant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); } - } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadVideoPresenter.onReadyRetrofitRequest(new File(outputVideoFile)); + } else { + ToastHelper.showToast("压缩失败", ToastHelper.ERROR); + } + progressDialog.dismiss(); + } + }); } /** @@ -614,7 +634,7 @@ videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); String completeURL = StringHelper.appendCompleteURL(videoUrl); - videoPlayerView.setUp(completeURL, ""); + videoPlayerView.setUp(completeURL, "", Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java new file mode 100644 index 0000000..10bfc1b --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java @@ -0,0 +1,332 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseCaseActivity; +import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.OtherUtils; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CaseUploadPackageActivity extends BaseCaseActivity implements View.OnClickListener, + IUploadFileView, ICaseSubmitCaseView { + + private Context context = CaseUploadPackageActivity.this; + @BindView(R.id.shopView) + TextView shopView; + @BindView(R.id.communityView) + EditText communityView; + @BindView(R.id.longitudeView) + TextView longitudeView; + @BindView(R.id.latitudeView) + TextView latitudeView; + @BindView(R.id.shopKeeperView) + EditText shopKeeperView; + @BindView(R.id.phoneNumberView) + EditText phoneNumberView; + @BindView(R.id.caseLocationView) + EditText caseLocationView; + @BindView(R.id.caseDetailEditView) + EditText caseDetailEditView; + @BindView(R.id.selectedResultView) + RecyclerView selectedResultView; + @BindView(R.id.addImageView) + ImageView addImageView; + @BindView(R.id.submitButton) + QMUIRoundButton submitButton; + + private UploadImagePresenterImpl uploadImagePresenter; + private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; + private ImageRecycleViewAdapter imageAdapter; + private QMUITipDialog submitDialog; + private ArrayList realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private String gridId, shopID; + + @Override + public int initLayoutView() { + return R.layout.activity_package; + } + + @Override + protected String setTitleName() { + return "三包上报"; + } + + @Override + public void initData() { + uploadImagePresenter = new UploadImagePresenterImpl(this); + shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + imageAdapter = new ImageRecycleViewAdapter(this); + selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); + selectedResultView.addItemDecoration(new ItemDecorationSpace()); + selectedResultView.setAdapter(imageAdapter); + } + + @Override + public void initEvent() { + submitButton.setChangeAlphaWhenPress(true); + } + + @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.shopLayout: + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", "三包上报"); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .setCanceledOnTouchOutside(false) + .create().show(); + break; + case R.id.submitButton: + submitCase(); + break; + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } + double longitude = data.getDoubleExtra("longitude", 0); + double latitude = data.getDoubleExtra("latitude", 0); + gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String shopName = data.getStringExtra("shopName"); + shopID = data.getStringExtra("shopID"); + + longitudeView.setText(String.valueOf(longitude)); + latitudeView.setText(String.valueOf(latitude)); + communityView.setText(community); + shopView.setText(shopName); + break; + default: + break; + } + } + } + + /** + * 案卷提交 + */ + private void submitCase() { + String longitude = longitudeView.getText().toString(); + String latitude = latitudeView.getText().toString(); + if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { + ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); + return; + } + String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(shopKeeper)) { + ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); + return; + } + String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(phoneNumber)) { + ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); + return; + } + if (StringHelper.isPhoneNumber(phoneNumber)) { + String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(fieldIntro)) { + ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); + return; + } + String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(description)) { + ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); + return; + } + if (imageAdapter.getItemCount() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } + shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, + "2", "1", + gridId.substring(0, 6), + gridId.substring(0, 9), + gridId.substring(0, 12), + gridId, description, fieldIntro, + StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); + } else { + ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.dismiss(); + } + + @Override + public void obtainSubmitResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); + finish(); + } else { + ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); + } + } + + @Override + public void obtainDataFail() { + ToastHelper.showToast("操作失败", ToastHelper.ERROR); + } + + @Override + public void obtainUploadAudioResult(ActionResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 2) { + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + imageAdapter.setMediaList(realPaths); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + OtherUtils.showBigImage(context, position, realPaths); + } + }); + //删除按钮点击事件 + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + mediaList.remove(position); + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } else { + ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); + } + } + } + + @Override + public void obtainUploadVideoResult(ActionResultBean resultBean) { + + } +} diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index b1adeb9..75ac52e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -1,14 +1,15 @@ package com.casic.dcms.ui; import android.annotation.SuppressLint; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; +import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -18,7 +19,6 @@ import android.widget.PopupWindow; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -47,12 +47,13 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.TimeOrDateUtil; import com.casic.dcms.utils.ToastHelper; import com.casic.dcms.widgets.VoicePlayView; -import com.iceteck.silicompressorr.SiliCompressor; +import com.google.gson.Gson; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; @@ -65,10 +66,10 @@ import com.qmuiteam.qmui.widget.popup.QMUIPopup; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import com.zolad.videoslimmer.VideoSlimmer; import java.io.File; import java.io.IOException; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ public class CaseUploadActivity extends BaseCaseActivity implements View.OnClickListener, View.OnTouchListener, ICaseLargeClassView, ICaseSmallClassView, ICaseSubmitCaseView, IUploadFileView { - private Context context = this; @BindView(R.id.caseLayout) LinearLayout caseLayout; @BindView(R.id.caseClassView) @@ -116,12 +116,15 @@ @BindView(R.id.submitButton) QMUIRoundButton submitButton; + private static final String TAG = "CaseUploadActivity"; + private Context context = this; private CaseLargeClassPresenterImpl caseLargeClassPresenter; private CaseSmallClassPresenterImpl caseSmallClassPresenter; private CaseSubmitPresenterImpl caseSubmitPresenter; private List largeClassBeans; private List smallClassBeans; - private QMUITipDialog submitDialog, qmuiTipDialog; + private QMUITipDialog submitDialog; + private ProgressDialog progressDialog; private UploadImagePresenterImpl uploadImagePresenter; private List imageList = new ArrayList<>();//服务器返回的拍照数据集 private ArrayList realPaths = new ArrayList<>();//真是图片路径 @@ -136,7 +139,6 @@ private String audioUrl, videoUrl; private AudioRecodeHelper audioRecodeHelper; private PopupWindow popWindow; - private static WeakReferenceHandler weakReferenceHandler; private boolean isFirstEnter = true; @Override @@ -156,15 +158,18 @@ caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord("提交中,请稍后") .create(); - qmuiTipDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("视频压缩中,请稍后") - .create(); - weakReferenceHandler = new WeakReferenceHandler(this); + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("视频压缩中..."); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCancelable(false); + progressDialog.setCanceledOnTouchOutside(false); + uploadImagePresenter = new UploadImagePresenterImpl(this); uploadAudioPresenter = new UploadAudioPresenterImpl(this); uploadVideoPresenter = new UploadVideoPresenterImpl(this); @@ -179,7 +184,6 @@ public void initEvent() { voiceView.setOnTouchListener(this); submitButton.setChangeAlphaWhenPress(true); - //录音相关 View view = View.inflate(this, R.layout.popu_microphone, null); int popWidth = (int) (QMUIDisplayHelper.getScreenWidth(this) * 0.35); @@ -340,6 +344,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -378,29 +383,25 @@ case PictureConfig.PREVIEW_VIDEO_CODE: LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0); //"realPath":"/storage/emulated/0/Movies/VID_20210426_17552226.mp4" + Log.d(TAG, "onActivityResult: " + new Gson().toJson(media)); //需要手动压缩视频 String mediaRealPath = media.getRealPath(); + if (TextUtils.isEmpty(mediaRealPath)) { + //部分手机getRealPath可能为空,需要备用路径 + mediaRealPath = media.getPath(); + } + if (TextUtils.isEmpty(mediaRealPath) || mediaRealPath.equals("")) { + //如果默认和备用路径还是为空,则不压缩上传 + ToastHelper.showToast("操作失败,无法获取有效的视频文件", ToastHelper.ERROR); + return; + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(mediaRealPath); + String defaultRotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + String defaultBitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - qmuiTipDialog.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - /** - * 视频压缩 - * 第一个参数:视频源文件路径 - * 第二个参数:压缩后视频保存的路径 - */ - String comPressPath = SiliCompressor.with(context).compressVideo(mediaRealPath, FileUtils.getVideoCompressPath()); - Message message = weakReferenceHandler.obtainMessage(); - message.what = 20210427; - message.obj = comPressPath; - weakReferenceHandler.sendMessage(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); + assert defaultRotation != null; + compressVideo(mediaRealPath, defaultRotation, defaultBitrate); break; case Constant.REQUEST_MAP_CODE: if (data == null) { @@ -421,27 +422,46 @@ } } - private static class WeakReferenceHandler extends Handler { - private WeakReference reference; - - private WeakReferenceHandler(CaseUploadActivity activity) { - reference = new WeakReference<>(activity); + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = Constant.DEFAULT_WIDTH / 2; + height = Constant.DEFAULT_HEIGHT / 2; + } else { + width = Constant.DEFAULT_HEIGHT / 2; + height = Constant.DEFAULT_WIDTH / 2; } - - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - CaseUploadActivity caseUploadActivity = reference.get(); - if (msg.what == 20210427) { - caseUploadActivity.qmuiTipDialog.dismiss(); - String comPressPath = (String) msg.obj; - if (!TextUtils.isEmpty(comPressPath)) { - caseUploadActivity.uploadVideoPresenter.onReadyRetrofitRequest(new File(comPressPath)); - } else { - ToastHelper.showToast("案卷视频上传失败", ToastHelper.ERROR); - } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = Constant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, Constant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); } - } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadVideoPresenter.onReadyRetrofitRequest(new File(outputVideoFile)); + } else { + ToastHelper.showToast("压缩失败", ToastHelper.ERROR); + } + progressDialog.dismiss(); + } + }); } /** @@ -614,7 +634,7 @@ videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); String completeURL = StringHelper.appendCompleteURL(videoUrl); - videoPlayerView.setUp(completeURL, ""); + videoPlayerView.setUp(completeURL, "", Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java new file mode 100644 index 0000000..10bfc1b --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java @@ -0,0 +1,332 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseCaseActivity; +import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.OtherUtils; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CaseUploadPackageActivity extends BaseCaseActivity implements View.OnClickListener, + IUploadFileView, ICaseSubmitCaseView { + + private Context context = CaseUploadPackageActivity.this; + @BindView(R.id.shopView) + TextView shopView; + @BindView(R.id.communityView) + EditText communityView; + @BindView(R.id.longitudeView) + TextView longitudeView; + @BindView(R.id.latitudeView) + TextView latitudeView; + @BindView(R.id.shopKeeperView) + EditText shopKeeperView; + @BindView(R.id.phoneNumberView) + EditText phoneNumberView; + @BindView(R.id.caseLocationView) + EditText caseLocationView; + @BindView(R.id.caseDetailEditView) + EditText caseDetailEditView; + @BindView(R.id.selectedResultView) + RecyclerView selectedResultView; + @BindView(R.id.addImageView) + ImageView addImageView; + @BindView(R.id.submitButton) + QMUIRoundButton submitButton; + + private UploadImagePresenterImpl uploadImagePresenter; + private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; + private ImageRecycleViewAdapter imageAdapter; + private QMUITipDialog submitDialog; + private ArrayList realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private String gridId, shopID; + + @Override + public int initLayoutView() { + return R.layout.activity_package; + } + + @Override + protected String setTitleName() { + return "三包上报"; + } + + @Override + public void initData() { + uploadImagePresenter = new UploadImagePresenterImpl(this); + shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + imageAdapter = new ImageRecycleViewAdapter(this); + selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); + selectedResultView.addItemDecoration(new ItemDecorationSpace()); + selectedResultView.setAdapter(imageAdapter); + } + + @Override + public void initEvent() { + submitButton.setChangeAlphaWhenPress(true); + } + + @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.shopLayout: + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", "三包上报"); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .setCanceledOnTouchOutside(false) + .create().show(); + break; + case R.id.submitButton: + submitCase(); + break; + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } + double longitude = data.getDoubleExtra("longitude", 0); + double latitude = data.getDoubleExtra("latitude", 0); + gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String shopName = data.getStringExtra("shopName"); + shopID = data.getStringExtra("shopID"); + + longitudeView.setText(String.valueOf(longitude)); + latitudeView.setText(String.valueOf(latitude)); + communityView.setText(community); + shopView.setText(shopName); + break; + default: + break; + } + } + } + + /** + * 案卷提交 + */ + private void submitCase() { + String longitude = longitudeView.getText().toString(); + String latitude = latitudeView.getText().toString(); + if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { + ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); + return; + } + String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(shopKeeper)) { + ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); + return; + } + String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(phoneNumber)) { + ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); + return; + } + if (StringHelper.isPhoneNumber(phoneNumber)) { + String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(fieldIntro)) { + ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); + return; + } + String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(description)) { + ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); + return; + } + if (imageAdapter.getItemCount() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } + shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, + "2", "1", + gridId.substring(0, 6), + gridId.substring(0, 9), + gridId.substring(0, 12), + gridId, description, fieldIntro, + StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); + } else { + ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.dismiss(); + } + + @Override + public void obtainSubmitResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); + finish(); + } else { + ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); + } + } + + @Override + public void obtainDataFail() { + ToastHelper.showToast("操作失败", ToastHelper.ERROR); + } + + @Override + public void obtainUploadAudioResult(ActionResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 2) { + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + imageAdapter.setMediaList(realPaths); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + OtherUtils.showBigImage(context, position, realPaths); + } + }); + //删除按钮点击事件 + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + mediaList.remove(position); + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } else { + ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); + } + } + } + + @Override + public void obtainUploadVideoResult(ActionResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java index 67a0340..7750f8a 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java @@ -242,6 +242,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index b1adeb9..75ac52e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -1,14 +1,15 @@ package com.casic.dcms.ui; import android.annotation.SuppressLint; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; +import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -18,7 +19,6 @@ import android.widget.PopupWindow; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -47,12 +47,13 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.TimeOrDateUtil; import com.casic.dcms.utils.ToastHelper; import com.casic.dcms.widgets.VoicePlayView; -import com.iceteck.silicompressorr.SiliCompressor; +import com.google.gson.Gson; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; @@ -65,10 +66,10 @@ import com.qmuiteam.qmui.widget.popup.QMUIPopup; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import com.zolad.videoslimmer.VideoSlimmer; import java.io.File; import java.io.IOException; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ public class CaseUploadActivity extends BaseCaseActivity implements View.OnClickListener, View.OnTouchListener, ICaseLargeClassView, ICaseSmallClassView, ICaseSubmitCaseView, IUploadFileView { - private Context context = this; @BindView(R.id.caseLayout) LinearLayout caseLayout; @BindView(R.id.caseClassView) @@ -116,12 +116,15 @@ @BindView(R.id.submitButton) QMUIRoundButton submitButton; + private static final String TAG = "CaseUploadActivity"; + private Context context = this; private CaseLargeClassPresenterImpl caseLargeClassPresenter; private CaseSmallClassPresenterImpl caseSmallClassPresenter; private CaseSubmitPresenterImpl caseSubmitPresenter; private List largeClassBeans; private List smallClassBeans; - private QMUITipDialog submitDialog, qmuiTipDialog; + private QMUITipDialog submitDialog; + private ProgressDialog progressDialog; private UploadImagePresenterImpl uploadImagePresenter; private List imageList = new ArrayList<>();//服务器返回的拍照数据集 private ArrayList realPaths = new ArrayList<>();//真是图片路径 @@ -136,7 +139,6 @@ private String audioUrl, videoUrl; private AudioRecodeHelper audioRecodeHelper; private PopupWindow popWindow; - private static WeakReferenceHandler weakReferenceHandler; private boolean isFirstEnter = true; @Override @@ -156,15 +158,18 @@ caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord("提交中,请稍后") .create(); - qmuiTipDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("视频压缩中,请稍后") - .create(); - weakReferenceHandler = new WeakReferenceHandler(this); + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("视频压缩中..."); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCancelable(false); + progressDialog.setCanceledOnTouchOutside(false); + uploadImagePresenter = new UploadImagePresenterImpl(this); uploadAudioPresenter = new UploadAudioPresenterImpl(this); uploadVideoPresenter = new UploadVideoPresenterImpl(this); @@ -179,7 +184,6 @@ public void initEvent() { voiceView.setOnTouchListener(this); submitButton.setChangeAlphaWhenPress(true); - //录音相关 View view = View.inflate(this, R.layout.popu_microphone, null); int popWidth = (int) (QMUIDisplayHelper.getScreenWidth(this) * 0.35); @@ -340,6 +344,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -378,29 +383,25 @@ case PictureConfig.PREVIEW_VIDEO_CODE: LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0); //"realPath":"/storage/emulated/0/Movies/VID_20210426_17552226.mp4" + Log.d(TAG, "onActivityResult: " + new Gson().toJson(media)); //需要手动压缩视频 String mediaRealPath = media.getRealPath(); + if (TextUtils.isEmpty(mediaRealPath)) { + //部分手机getRealPath可能为空,需要备用路径 + mediaRealPath = media.getPath(); + } + if (TextUtils.isEmpty(mediaRealPath) || mediaRealPath.equals("")) { + //如果默认和备用路径还是为空,则不压缩上传 + ToastHelper.showToast("操作失败,无法获取有效的视频文件", ToastHelper.ERROR); + return; + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(mediaRealPath); + String defaultRotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + String defaultBitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - qmuiTipDialog.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - /** - * 视频压缩 - * 第一个参数:视频源文件路径 - * 第二个参数:压缩后视频保存的路径 - */ - String comPressPath = SiliCompressor.with(context).compressVideo(mediaRealPath, FileUtils.getVideoCompressPath()); - Message message = weakReferenceHandler.obtainMessage(); - message.what = 20210427; - message.obj = comPressPath; - weakReferenceHandler.sendMessage(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); + assert defaultRotation != null; + compressVideo(mediaRealPath, defaultRotation, defaultBitrate); break; case Constant.REQUEST_MAP_CODE: if (data == null) { @@ -421,27 +422,46 @@ } } - private static class WeakReferenceHandler extends Handler { - private WeakReference reference; - - private WeakReferenceHandler(CaseUploadActivity activity) { - reference = new WeakReference<>(activity); + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = Constant.DEFAULT_WIDTH / 2; + height = Constant.DEFAULT_HEIGHT / 2; + } else { + width = Constant.DEFAULT_HEIGHT / 2; + height = Constant.DEFAULT_WIDTH / 2; } - - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - CaseUploadActivity caseUploadActivity = reference.get(); - if (msg.what == 20210427) { - caseUploadActivity.qmuiTipDialog.dismiss(); - String comPressPath = (String) msg.obj; - if (!TextUtils.isEmpty(comPressPath)) { - caseUploadActivity.uploadVideoPresenter.onReadyRetrofitRequest(new File(comPressPath)); - } else { - ToastHelper.showToast("案卷视频上传失败", ToastHelper.ERROR); - } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = Constant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, Constant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); } - } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadVideoPresenter.onReadyRetrofitRequest(new File(outputVideoFile)); + } else { + ToastHelper.showToast("压缩失败", ToastHelper.ERROR); + } + progressDialog.dismiss(); + } + }); } /** @@ -614,7 +634,7 @@ videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); String completeURL = StringHelper.appendCompleteURL(videoUrl); - videoPlayerView.setUp(completeURL, ""); + videoPlayerView.setUp(completeURL, "", Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java new file mode 100644 index 0000000..10bfc1b --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java @@ -0,0 +1,332 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseCaseActivity; +import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.OtherUtils; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CaseUploadPackageActivity extends BaseCaseActivity implements View.OnClickListener, + IUploadFileView, ICaseSubmitCaseView { + + private Context context = CaseUploadPackageActivity.this; + @BindView(R.id.shopView) + TextView shopView; + @BindView(R.id.communityView) + EditText communityView; + @BindView(R.id.longitudeView) + TextView longitudeView; + @BindView(R.id.latitudeView) + TextView latitudeView; + @BindView(R.id.shopKeeperView) + EditText shopKeeperView; + @BindView(R.id.phoneNumberView) + EditText phoneNumberView; + @BindView(R.id.caseLocationView) + EditText caseLocationView; + @BindView(R.id.caseDetailEditView) + EditText caseDetailEditView; + @BindView(R.id.selectedResultView) + RecyclerView selectedResultView; + @BindView(R.id.addImageView) + ImageView addImageView; + @BindView(R.id.submitButton) + QMUIRoundButton submitButton; + + private UploadImagePresenterImpl uploadImagePresenter; + private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; + private ImageRecycleViewAdapter imageAdapter; + private QMUITipDialog submitDialog; + private ArrayList realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private String gridId, shopID; + + @Override + public int initLayoutView() { + return R.layout.activity_package; + } + + @Override + protected String setTitleName() { + return "三包上报"; + } + + @Override + public void initData() { + uploadImagePresenter = new UploadImagePresenterImpl(this); + shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + imageAdapter = new ImageRecycleViewAdapter(this); + selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); + selectedResultView.addItemDecoration(new ItemDecorationSpace()); + selectedResultView.setAdapter(imageAdapter); + } + + @Override + public void initEvent() { + submitButton.setChangeAlphaWhenPress(true); + } + + @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.shopLayout: + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", "三包上报"); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .setCanceledOnTouchOutside(false) + .create().show(); + break; + case R.id.submitButton: + submitCase(); + break; + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } + double longitude = data.getDoubleExtra("longitude", 0); + double latitude = data.getDoubleExtra("latitude", 0); + gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String shopName = data.getStringExtra("shopName"); + shopID = data.getStringExtra("shopID"); + + longitudeView.setText(String.valueOf(longitude)); + latitudeView.setText(String.valueOf(latitude)); + communityView.setText(community); + shopView.setText(shopName); + break; + default: + break; + } + } + } + + /** + * 案卷提交 + */ + private void submitCase() { + String longitude = longitudeView.getText().toString(); + String latitude = latitudeView.getText().toString(); + if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { + ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); + return; + } + String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(shopKeeper)) { + ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); + return; + } + String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(phoneNumber)) { + ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); + return; + } + if (StringHelper.isPhoneNumber(phoneNumber)) { + String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(fieldIntro)) { + ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); + return; + } + String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(description)) { + ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); + return; + } + if (imageAdapter.getItemCount() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } + shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, + "2", "1", + gridId.substring(0, 6), + gridId.substring(0, 9), + gridId.substring(0, 12), + gridId, description, fieldIntro, + StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); + } else { + ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.dismiss(); + } + + @Override + public void obtainSubmitResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); + finish(); + } else { + ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); + } + } + + @Override + public void obtainDataFail() { + ToastHelper.showToast("操作失败", ToastHelper.ERROR); + } + + @Override + public void obtainUploadAudioResult(ActionResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 2) { + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + imageAdapter.setMediaList(realPaths); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + OtherUtils.showBigImage(context, position, realPaths); + } + }); + //删除按钮点击事件 + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + mediaList.remove(position); + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } else { + ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); + } + } + } + + @Override + public void obtainUploadVideoResult(ActionResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java index 67a0340..7750f8a 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java @@ -242,6 +242,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java index e27a310..d364d7c 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -179,7 +180,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index b1adeb9..75ac52e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -1,14 +1,15 @@ package com.casic.dcms.ui; import android.annotation.SuppressLint; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; +import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -18,7 +19,6 @@ import android.widget.PopupWindow; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -47,12 +47,13 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.TimeOrDateUtil; import com.casic.dcms.utils.ToastHelper; import com.casic.dcms.widgets.VoicePlayView; -import com.iceteck.silicompressorr.SiliCompressor; +import com.google.gson.Gson; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; @@ -65,10 +66,10 @@ import com.qmuiteam.qmui.widget.popup.QMUIPopup; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import com.zolad.videoslimmer.VideoSlimmer; import java.io.File; import java.io.IOException; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ public class CaseUploadActivity extends BaseCaseActivity implements View.OnClickListener, View.OnTouchListener, ICaseLargeClassView, ICaseSmallClassView, ICaseSubmitCaseView, IUploadFileView { - private Context context = this; @BindView(R.id.caseLayout) LinearLayout caseLayout; @BindView(R.id.caseClassView) @@ -116,12 +116,15 @@ @BindView(R.id.submitButton) QMUIRoundButton submitButton; + private static final String TAG = "CaseUploadActivity"; + private Context context = this; private CaseLargeClassPresenterImpl caseLargeClassPresenter; private CaseSmallClassPresenterImpl caseSmallClassPresenter; private CaseSubmitPresenterImpl caseSubmitPresenter; private List largeClassBeans; private List smallClassBeans; - private QMUITipDialog submitDialog, qmuiTipDialog; + private QMUITipDialog submitDialog; + private ProgressDialog progressDialog; private UploadImagePresenterImpl uploadImagePresenter; private List imageList = new ArrayList<>();//服务器返回的拍照数据集 private ArrayList realPaths = new ArrayList<>();//真是图片路径 @@ -136,7 +139,6 @@ private String audioUrl, videoUrl; private AudioRecodeHelper audioRecodeHelper; private PopupWindow popWindow; - private static WeakReferenceHandler weakReferenceHandler; private boolean isFirstEnter = true; @Override @@ -156,15 +158,18 @@ caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord("提交中,请稍后") .create(); - qmuiTipDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("视频压缩中,请稍后") - .create(); - weakReferenceHandler = new WeakReferenceHandler(this); + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("视频压缩中..."); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCancelable(false); + progressDialog.setCanceledOnTouchOutside(false); + uploadImagePresenter = new UploadImagePresenterImpl(this); uploadAudioPresenter = new UploadAudioPresenterImpl(this); uploadVideoPresenter = new UploadVideoPresenterImpl(this); @@ -179,7 +184,6 @@ public void initEvent() { voiceView.setOnTouchListener(this); submitButton.setChangeAlphaWhenPress(true); - //录音相关 View view = View.inflate(this, R.layout.popu_microphone, null); int popWidth = (int) (QMUIDisplayHelper.getScreenWidth(this) * 0.35); @@ -340,6 +344,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -378,29 +383,25 @@ case PictureConfig.PREVIEW_VIDEO_CODE: LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0); //"realPath":"/storage/emulated/0/Movies/VID_20210426_17552226.mp4" + Log.d(TAG, "onActivityResult: " + new Gson().toJson(media)); //需要手动压缩视频 String mediaRealPath = media.getRealPath(); + if (TextUtils.isEmpty(mediaRealPath)) { + //部分手机getRealPath可能为空,需要备用路径 + mediaRealPath = media.getPath(); + } + if (TextUtils.isEmpty(mediaRealPath) || mediaRealPath.equals("")) { + //如果默认和备用路径还是为空,则不压缩上传 + ToastHelper.showToast("操作失败,无法获取有效的视频文件", ToastHelper.ERROR); + return; + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(mediaRealPath); + String defaultRotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + String defaultBitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - qmuiTipDialog.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - /** - * 视频压缩 - * 第一个参数:视频源文件路径 - * 第二个参数:压缩后视频保存的路径 - */ - String comPressPath = SiliCompressor.with(context).compressVideo(mediaRealPath, FileUtils.getVideoCompressPath()); - Message message = weakReferenceHandler.obtainMessage(); - message.what = 20210427; - message.obj = comPressPath; - weakReferenceHandler.sendMessage(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); + assert defaultRotation != null; + compressVideo(mediaRealPath, defaultRotation, defaultBitrate); break; case Constant.REQUEST_MAP_CODE: if (data == null) { @@ -421,27 +422,46 @@ } } - private static class WeakReferenceHandler extends Handler { - private WeakReference reference; - - private WeakReferenceHandler(CaseUploadActivity activity) { - reference = new WeakReference<>(activity); + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = Constant.DEFAULT_WIDTH / 2; + height = Constant.DEFAULT_HEIGHT / 2; + } else { + width = Constant.DEFAULT_HEIGHT / 2; + height = Constant.DEFAULT_WIDTH / 2; } - - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - CaseUploadActivity caseUploadActivity = reference.get(); - if (msg.what == 20210427) { - caseUploadActivity.qmuiTipDialog.dismiss(); - String comPressPath = (String) msg.obj; - if (!TextUtils.isEmpty(comPressPath)) { - caseUploadActivity.uploadVideoPresenter.onReadyRetrofitRequest(new File(comPressPath)); - } else { - ToastHelper.showToast("案卷视频上传失败", ToastHelper.ERROR); - } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = Constant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, Constant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); } - } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadVideoPresenter.onReadyRetrofitRequest(new File(outputVideoFile)); + } else { + ToastHelper.showToast("压缩失败", ToastHelper.ERROR); + } + progressDialog.dismiss(); + } + }); } /** @@ -614,7 +634,7 @@ videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); String completeURL = StringHelper.appendCompleteURL(videoUrl); - videoPlayerView.setUp(completeURL, ""); + videoPlayerView.setUp(completeURL, "", Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java new file mode 100644 index 0000000..10bfc1b --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java @@ -0,0 +1,332 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseCaseActivity; +import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.OtherUtils; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CaseUploadPackageActivity extends BaseCaseActivity implements View.OnClickListener, + IUploadFileView, ICaseSubmitCaseView { + + private Context context = CaseUploadPackageActivity.this; + @BindView(R.id.shopView) + TextView shopView; + @BindView(R.id.communityView) + EditText communityView; + @BindView(R.id.longitudeView) + TextView longitudeView; + @BindView(R.id.latitudeView) + TextView latitudeView; + @BindView(R.id.shopKeeperView) + EditText shopKeeperView; + @BindView(R.id.phoneNumberView) + EditText phoneNumberView; + @BindView(R.id.caseLocationView) + EditText caseLocationView; + @BindView(R.id.caseDetailEditView) + EditText caseDetailEditView; + @BindView(R.id.selectedResultView) + RecyclerView selectedResultView; + @BindView(R.id.addImageView) + ImageView addImageView; + @BindView(R.id.submitButton) + QMUIRoundButton submitButton; + + private UploadImagePresenterImpl uploadImagePresenter; + private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; + private ImageRecycleViewAdapter imageAdapter; + private QMUITipDialog submitDialog; + private ArrayList realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private String gridId, shopID; + + @Override + public int initLayoutView() { + return R.layout.activity_package; + } + + @Override + protected String setTitleName() { + return "三包上报"; + } + + @Override + public void initData() { + uploadImagePresenter = new UploadImagePresenterImpl(this); + shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + imageAdapter = new ImageRecycleViewAdapter(this); + selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); + selectedResultView.addItemDecoration(new ItemDecorationSpace()); + selectedResultView.setAdapter(imageAdapter); + } + + @Override + public void initEvent() { + submitButton.setChangeAlphaWhenPress(true); + } + + @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.shopLayout: + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", "三包上报"); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .setCanceledOnTouchOutside(false) + .create().show(); + break; + case R.id.submitButton: + submitCase(); + break; + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } + double longitude = data.getDoubleExtra("longitude", 0); + double latitude = data.getDoubleExtra("latitude", 0); + gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String shopName = data.getStringExtra("shopName"); + shopID = data.getStringExtra("shopID"); + + longitudeView.setText(String.valueOf(longitude)); + latitudeView.setText(String.valueOf(latitude)); + communityView.setText(community); + shopView.setText(shopName); + break; + default: + break; + } + } + } + + /** + * 案卷提交 + */ + private void submitCase() { + String longitude = longitudeView.getText().toString(); + String latitude = latitudeView.getText().toString(); + if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { + ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); + return; + } + String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(shopKeeper)) { + ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); + return; + } + String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(phoneNumber)) { + ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); + return; + } + if (StringHelper.isPhoneNumber(phoneNumber)) { + String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(fieldIntro)) { + ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); + return; + } + String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(description)) { + ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); + return; + } + if (imageAdapter.getItemCount() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } + shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, + "2", "1", + gridId.substring(0, 6), + gridId.substring(0, 9), + gridId.substring(0, 12), + gridId, description, fieldIntro, + StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); + } else { + ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.dismiss(); + } + + @Override + public void obtainSubmitResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); + finish(); + } else { + ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); + } + } + + @Override + public void obtainDataFail() { + ToastHelper.showToast("操作失败", ToastHelper.ERROR); + } + + @Override + public void obtainUploadAudioResult(ActionResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 2) { + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + imageAdapter.setMediaList(realPaths); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + OtherUtils.showBigImage(context, position, realPaths); + } + }); + //删除按钮点击事件 + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + mediaList.remove(position); + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } else { + ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); + } + } + } + + @Override + public void obtainUploadVideoResult(ActionResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java index 67a0340..7750f8a 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java @@ -242,6 +242,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java index e27a310..d364d7c 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -179,7 +180,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java index f0e437a..d28d4b2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -44,6 +44,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -285,7 +286,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -518,6 +519,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index b1adeb9..75ac52e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -1,14 +1,15 @@ package com.casic.dcms.ui; import android.annotation.SuppressLint; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; +import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -18,7 +19,6 @@ import android.widget.PopupWindow; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -47,12 +47,13 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.TimeOrDateUtil; import com.casic.dcms.utils.ToastHelper; import com.casic.dcms.widgets.VoicePlayView; -import com.iceteck.silicompressorr.SiliCompressor; +import com.google.gson.Gson; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; @@ -65,10 +66,10 @@ import com.qmuiteam.qmui.widget.popup.QMUIPopup; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import com.zolad.videoslimmer.VideoSlimmer; import java.io.File; import java.io.IOException; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ public class CaseUploadActivity extends BaseCaseActivity implements View.OnClickListener, View.OnTouchListener, ICaseLargeClassView, ICaseSmallClassView, ICaseSubmitCaseView, IUploadFileView { - private Context context = this; @BindView(R.id.caseLayout) LinearLayout caseLayout; @BindView(R.id.caseClassView) @@ -116,12 +116,15 @@ @BindView(R.id.submitButton) QMUIRoundButton submitButton; + private static final String TAG = "CaseUploadActivity"; + private Context context = this; private CaseLargeClassPresenterImpl caseLargeClassPresenter; private CaseSmallClassPresenterImpl caseSmallClassPresenter; private CaseSubmitPresenterImpl caseSubmitPresenter; private List largeClassBeans; private List smallClassBeans; - private QMUITipDialog submitDialog, qmuiTipDialog; + private QMUITipDialog submitDialog; + private ProgressDialog progressDialog; private UploadImagePresenterImpl uploadImagePresenter; private List imageList = new ArrayList<>();//服务器返回的拍照数据集 private ArrayList realPaths = new ArrayList<>();//真是图片路径 @@ -136,7 +139,6 @@ private String audioUrl, videoUrl; private AudioRecodeHelper audioRecodeHelper; private PopupWindow popWindow; - private static WeakReferenceHandler weakReferenceHandler; private boolean isFirstEnter = true; @Override @@ -156,15 +158,18 @@ caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord("提交中,请稍后") .create(); - qmuiTipDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("视频压缩中,请稍后") - .create(); - weakReferenceHandler = new WeakReferenceHandler(this); + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("视频压缩中..."); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCancelable(false); + progressDialog.setCanceledOnTouchOutside(false); + uploadImagePresenter = new UploadImagePresenterImpl(this); uploadAudioPresenter = new UploadAudioPresenterImpl(this); uploadVideoPresenter = new UploadVideoPresenterImpl(this); @@ -179,7 +184,6 @@ public void initEvent() { voiceView.setOnTouchListener(this); submitButton.setChangeAlphaWhenPress(true); - //录音相关 View view = View.inflate(this, R.layout.popu_microphone, null); int popWidth = (int) (QMUIDisplayHelper.getScreenWidth(this) * 0.35); @@ -340,6 +344,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -378,29 +383,25 @@ case PictureConfig.PREVIEW_VIDEO_CODE: LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0); //"realPath":"/storage/emulated/0/Movies/VID_20210426_17552226.mp4" + Log.d(TAG, "onActivityResult: " + new Gson().toJson(media)); //需要手动压缩视频 String mediaRealPath = media.getRealPath(); + if (TextUtils.isEmpty(mediaRealPath)) { + //部分手机getRealPath可能为空,需要备用路径 + mediaRealPath = media.getPath(); + } + if (TextUtils.isEmpty(mediaRealPath) || mediaRealPath.equals("")) { + //如果默认和备用路径还是为空,则不压缩上传 + ToastHelper.showToast("操作失败,无法获取有效的视频文件", ToastHelper.ERROR); + return; + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(mediaRealPath); + String defaultRotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + String defaultBitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - qmuiTipDialog.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - /** - * 视频压缩 - * 第一个参数:视频源文件路径 - * 第二个参数:压缩后视频保存的路径 - */ - String comPressPath = SiliCompressor.with(context).compressVideo(mediaRealPath, FileUtils.getVideoCompressPath()); - Message message = weakReferenceHandler.obtainMessage(); - message.what = 20210427; - message.obj = comPressPath; - weakReferenceHandler.sendMessage(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); + assert defaultRotation != null; + compressVideo(mediaRealPath, defaultRotation, defaultBitrate); break; case Constant.REQUEST_MAP_CODE: if (data == null) { @@ -421,27 +422,46 @@ } } - private static class WeakReferenceHandler extends Handler { - private WeakReference reference; - - private WeakReferenceHandler(CaseUploadActivity activity) { - reference = new WeakReference<>(activity); + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = Constant.DEFAULT_WIDTH / 2; + height = Constant.DEFAULT_HEIGHT / 2; + } else { + width = Constant.DEFAULT_HEIGHT / 2; + height = Constant.DEFAULT_WIDTH / 2; } - - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - CaseUploadActivity caseUploadActivity = reference.get(); - if (msg.what == 20210427) { - caseUploadActivity.qmuiTipDialog.dismiss(); - String comPressPath = (String) msg.obj; - if (!TextUtils.isEmpty(comPressPath)) { - caseUploadActivity.uploadVideoPresenter.onReadyRetrofitRequest(new File(comPressPath)); - } else { - ToastHelper.showToast("案卷视频上传失败", ToastHelper.ERROR); - } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = Constant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, Constant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); } - } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadVideoPresenter.onReadyRetrofitRequest(new File(outputVideoFile)); + } else { + ToastHelper.showToast("压缩失败", ToastHelper.ERROR); + } + progressDialog.dismiss(); + } + }); } /** @@ -614,7 +634,7 @@ videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); String completeURL = StringHelper.appendCompleteURL(videoUrl); - videoPlayerView.setUp(completeURL, ""); + videoPlayerView.setUp(completeURL, "", Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java new file mode 100644 index 0000000..10bfc1b --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java @@ -0,0 +1,332 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseCaseActivity; +import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.OtherUtils; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CaseUploadPackageActivity extends BaseCaseActivity implements View.OnClickListener, + IUploadFileView, ICaseSubmitCaseView { + + private Context context = CaseUploadPackageActivity.this; + @BindView(R.id.shopView) + TextView shopView; + @BindView(R.id.communityView) + EditText communityView; + @BindView(R.id.longitudeView) + TextView longitudeView; + @BindView(R.id.latitudeView) + TextView latitudeView; + @BindView(R.id.shopKeeperView) + EditText shopKeeperView; + @BindView(R.id.phoneNumberView) + EditText phoneNumberView; + @BindView(R.id.caseLocationView) + EditText caseLocationView; + @BindView(R.id.caseDetailEditView) + EditText caseDetailEditView; + @BindView(R.id.selectedResultView) + RecyclerView selectedResultView; + @BindView(R.id.addImageView) + ImageView addImageView; + @BindView(R.id.submitButton) + QMUIRoundButton submitButton; + + private UploadImagePresenterImpl uploadImagePresenter; + private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; + private ImageRecycleViewAdapter imageAdapter; + private QMUITipDialog submitDialog; + private ArrayList realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private String gridId, shopID; + + @Override + public int initLayoutView() { + return R.layout.activity_package; + } + + @Override + protected String setTitleName() { + return "三包上报"; + } + + @Override + public void initData() { + uploadImagePresenter = new UploadImagePresenterImpl(this); + shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + imageAdapter = new ImageRecycleViewAdapter(this); + selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); + selectedResultView.addItemDecoration(new ItemDecorationSpace()); + selectedResultView.setAdapter(imageAdapter); + } + + @Override + public void initEvent() { + submitButton.setChangeAlphaWhenPress(true); + } + + @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.shopLayout: + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", "三包上报"); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .setCanceledOnTouchOutside(false) + .create().show(); + break; + case R.id.submitButton: + submitCase(); + break; + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } + double longitude = data.getDoubleExtra("longitude", 0); + double latitude = data.getDoubleExtra("latitude", 0); + gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String shopName = data.getStringExtra("shopName"); + shopID = data.getStringExtra("shopID"); + + longitudeView.setText(String.valueOf(longitude)); + latitudeView.setText(String.valueOf(latitude)); + communityView.setText(community); + shopView.setText(shopName); + break; + default: + break; + } + } + } + + /** + * 案卷提交 + */ + private void submitCase() { + String longitude = longitudeView.getText().toString(); + String latitude = latitudeView.getText().toString(); + if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { + ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); + return; + } + String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(shopKeeper)) { + ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); + return; + } + String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(phoneNumber)) { + ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); + return; + } + if (StringHelper.isPhoneNumber(phoneNumber)) { + String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(fieldIntro)) { + ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); + return; + } + String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(description)) { + ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); + return; + } + if (imageAdapter.getItemCount() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } + shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, + "2", "1", + gridId.substring(0, 6), + gridId.substring(0, 9), + gridId.substring(0, 12), + gridId, description, fieldIntro, + StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); + } else { + ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.dismiss(); + } + + @Override + public void obtainSubmitResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); + finish(); + } else { + ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); + } + } + + @Override + public void obtainDataFail() { + ToastHelper.showToast("操作失败", ToastHelper.ERROR); + } + + @Override + public void obtainUploadAudioResult(ActionResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 2) { + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + imageAdapter.setMediaList(realPaths); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + OtherUtils.showBigImage(context, position, realPaths); + } + }); + //删除按钮点击事件 + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + mediaList.remove(position); + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } else { + ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); + } + } + } + + @Override + public void obtainUploadVideoResult(ActionResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java index 67a0340..7750f8a 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java @@ -242,6 +242,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java index e27a310..d364d7c 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -179,7 +180,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java index f0e437a..d28d4b2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -44,6 +44,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -285,7 +286,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -518,6 +519,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java deleted file mode 100644 index 1ba1d5b..0000000 --- a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java +++ /dev/null @@ -1,331 +0,0 @@ -package com.casic.dcms.ui; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.text.TextUtils; -import android.view.View; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.ImageRecycleViewAdapter; -import com.casic.dcms.base.BaseCaseActivity; -import com.casic.dcms.bean.ActionResultBean; -import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; -import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; -import com.casic.dcms.mvp.view.ICaseSubmitCaseView; -import com.casic.dcms.mvp.view.IUploadFileView; -import com.casic.dcms.utils.Constant; -import com.casic.dcms.utils.FileUtils; -import com.casic.dcms.utils.GlideLoadEngine; -import com.casic.dcms.utils.ItemDecorationSpace; -import com.casic.dcms.utils.OtherUtils; -import com.casic.dcms.utils.StringHelper; -import com.casic.dcms.utils.ToastHelper; -import com.luck.picture.lib.PictureSelector; -import com.luck.picture.lib.config.PictureConfig; -import com.luck.picture.lib.config.PictureMimeType; -import com.luck.picture.lib.entity.LocalMedia; -import com.luck.picture.lib.tools.PictureFileUtils; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; -import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.OnClick; - -public class ThreePackageUploadActivity extends BaseCaseActivity implements View.OnClickListener, - IUploadFileView, ICaseSubmitCaseView { - - private Context context = ThreePackageUploadActivity.this; - @BindView(R.id.shopView) - TextView shopView; - @BindView(R.id.communityView) - EditText communityView; - @BindView(R.id.longitudeView) - TextView longitudeView; - @BindView(R.id.latitudeView) - TextView latitudeView; - @BindView(R.id.shopKeeperView) - EditText shopKeeperView; - @BindView(R.id.phoneNumberView) - EditText phoneNumberView; - @BindView(R.id.caseLocationView) - EditText caseLocationView; - @BindView(R.id.caseDetailEditView) - EditText caseDetailEditView; - @BindView(R.id.selectedResultView) - RecyclerView selectedResultView; - @BindView(R.id.addImageView) - ImageView addImageView; - @BindView(R.id.submitButton) - QMUIRoundButton submitButton; - - private UploadImagePresenterImpl uploadImagePresenter; - private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; - private ImageRecycleViewAdapter imageAdapter; - private QMUITipDialog submitDialog; - private ArrayList realPaths = new ArrayList<>();//真是图片路径 - private List mediaList = new ArrayList<>();//上传到服务器的数据集 - private String gridId, shopID; - - @Override - public int initLayoutView() { - return R.layout.activity_package; - } - - @Override - protected String setTitleName() { - return "三包上报"; - } - - @Override - public void initData() { - uploadImagePresenter = new UploadImagePresenterImpl(this); - shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); - submitDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("提交中,请稍后") - .create(); - imageAdapter = new ImageRecycleViewAdapter(this); - selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); - selectedResultView.addItemDecoration(new ItemDecorationSpace()); - selectedResultView.setAdapter(imageAdapter); - } - - @Override - public void initEvent() { - submitButton.setChangeAlphaWhenPress(true); - } - - @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.shopLayout: - Intent intent = new Intent(this, ArcGISMapActivity.class); - intent.putExtra("type", "三包上报"); - startActivityForResult(intent, Constant.REQUEST_MAP_CODE); - break; - case R.id.addImageView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("相册中选取", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //选图 - selectPicture(); - } - }) - .addItem("相机拍照", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //拍照 - takePicture(); - } - }) - .setCanceledOnTouchOutside(false) - .create().show(); - break; - case R.id.submitButton: - submitCase(); - break; - } - } - - private void selectPicture() { - PictureSelector.create(this) - .openGallery(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(2) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.CHOOSE_REQUEST); - } - - private void takePicture() { - PictureSelector.create(this) - .openCamera(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(1) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.REQUEST_CAMERA); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK) { - switch (requestCode) { - case PictureConfig.CHOOSE_REQUEST: - List selectList = PictureSelector.obtainMultipleResult(data); - for (LocalMedia media : selectList) { - String mediaCompressPath = media.getCompressPath(); - uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); - } - break; - case PictureConfig.REQUEST_CAMERA: - LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); - uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); - break; - case Constant.REQUEST_MAP_CODE: - if (data == null) { - return; - } - double longitude = data.getDoubleExtra("longitude", 0); - double latitude = data.getDoubleExtra("latitude", 0); - gridId = data.getStringExtra("gridId"); - String community = data.getStringExtra("community"); - String shopName = data.getStringExtra("shopName"); - shopID = data.getStringExtra("shopID"); - - longitudeView.setText(String.valueOf(longitude)); - latitudeView.setText(String.valueOf(latitude)); - communityView.setText(community); - shopView.setText(shopName); - break; - default: - break; - } - } - } - - /** - * 案卷提交 - */ - private void submitCase() { - String longitude = longitudeView.getText().toString(); - String latitude = latitudeView.getText().toString(); - if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { - ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); - return; - } - String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(shopKeeper)) { - ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); - return; - } - String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(phoneNumber)) { - ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); - return; - } - if (StringHelper.isPhoneNumber(phoneNumber)) { - String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(fieldIntro)) { - ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); - return; - } - String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(description)) { - ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); - return; - } - if (imageAdapter.getItemCount() != 2) { - ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); - return; - } - shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, - "2", "1", - gridId.substring(0, 6), - gridId.substring(0, 9), - gridId.substring(0, 12), - gridId, description, fieldIntro, - StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); - } else { - ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); - } - } - - @Override - public void showProgress() { - submitDialog.show(); - } - - @Override - public void hideProgress() { - submitDialog.dismiss(); - } - - @Override - public void obtainSubmitResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); - finish(); - } else { - ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); - } - } - - @Override - public void obtainDataFail() { - ToastHelper.showToast("操作失败", ToastHelper.ERROR); - } - - @Override - public void obtainUploadAudioResult(ActionResultBean resultBean) { - - } - - @Override - public void obtainUploadImageResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - PictureFileUtils.deleteAllCacheDirFile(this); - /** - * 系统路径static拼接图片返回路径 - * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg - */ - //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg - int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 2) { - String url = resultBean.getData(); - mediaList.add(url); - realPaths.add(StringHelper.appendCompleteURL(url)); - if (realPaths.size() == 2) { - addImageView.setVisibility(View.GONE); - } - imageAdapter.setMediaList(realPaths); - //九宫格点击事件 - imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { - @Override - public void onClick(int position) { - OtherUtils.showBigImage(context, position, realPaths); - } - }); - //删除按钮点击事件 - imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { - @Override - public void onClick(int position) { - mediaList.remove(position); - realPaths.remove(position); - imageAdapter.setMediaList(realPaths); - if (realPaths.size() != 2) { - addImageView.setVisibility(View.VISIBLE); - } - } - }); - } else { - ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); - } - } - } - - @Override - public void obtainUploadVideoResult(ActionResultBean resultBean) { - - } -} diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index b1adeb9..75ac52e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -1,14 +1,15 @@ package com.casic.dcms.ui; import android.annotation.SuppressLint; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; +import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -18,7 +19,6 @@ import android.widget.PopupWindow; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -47,12 +47,13 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.TimeOrDateUtil; import com.casic.dcms.utils.ToastHelper; import com.casic.dcms.widgets.VoicePlayView; -import com.iceteck.silicompressorr.SiliCompressor; +import com.google.gson.Gson; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; @@ -65,10 +66,10 @@ import com.qmuiteam.qmui.widget.popup.QMUIPopup; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import com.zolad.videoslimmer.VideoSlimmer; import java.io.File; import java.io.IOException; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ public class CaseUploadActivity extends BaseCaseActivity implements View.OnClickListener, View.OnTouchListener, ICaseLargeClassView, ICaseSmallClassView, ICaseSubmitCaseView, IUploadFileView { - private Context context = this; @BindView(R.id.caseLayout) LinearLayout caseLayout; @BindView(R.id.caseClassView) @@ -116,12 +116,15 @@ @BindView(R.id.submitButton) QMUIRoundButton submitButton; + private static final String TAG = "CaseUploadActivity"; + private Context context = this; private CaseLargeClassPresenterImpl caseLargeClassPresenter; private CaseSmallClassPresenterImpl caseSmallClassPresenter; private CaseSubmitPresenterImpl caseSubmitPresenter; private List largeClassBeans; private List smallClassBeans; - private QMUITipDialog submitDialog, qmuiTipDialog; + private QMUITipDialog submitDialog; + private ProgressDialog progressDialog; private UploadImagePresenterImpl uploadImagePresenter; private List imageList = new ArrayList<>();//服务器返回的拍照数据集 private ArrayList realPaths = new ArrayList<>();//真是图片路径 @@ -136,7 +139,6 @@ private String audioUrl, videoUrl; private AudioRecodeHelper audioRecodeHelper; private PopupWindow popWindow; - private static WeakReferenceHandler weakReferenceHandler; private boolean isFirstEnter = true; @Override @@ -156,15 +158,18 @@ caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord("提交中,请稍后") .create(); - qmuiTipDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("视频压缩中,请稍后") - .create(); - weakReferenceHandler = new WeakReferenceHandler(this); + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("视频压缩中..."); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCancelable(false); + progressDialog.setCanceledOnTouchOutside(false); + uploadImagePresenter = new UploadImagePresenterImpl(this); uploadAudioPresenter = new UploadAudioPresenterImpl(this); uploadVideoPresenter = new UploadVideoPresenterImpl(this); @@ -179,7 +184,6 @@ public void initEvent() { voiceView.setOnTouchListener(this); submitButton.setChangeAlphaWhenPress(true); - //录音相关 View view = View.inflate(this, R.layout.popu_microphone, null); int popWidth = (int) (QMUIDisplayHelper.getScreenWidth(this) * 0.35); @@ -340,6 +344,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -378,29 +383,25 @@ case PictureConfig.PREVIEW_VIDEO_CODE: LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0); //"realPath":"/storage/emulated/0/Movies/VID_20210426_17552226.mp4" + Log.d(TAG, "onActivityResult: " + new Gson().toJson(media)); //需要手动压缩视频 String mediaRealPath = media.getRealPath(); + if (TextUtils.isEmpty(mediaRealPath)) { + //部分手机getRealPath可能为空,需要备用路径 + mediaRealPath = media.getPath(); + } + if (TextUtils.isEmpty(mediaRealPath) || mediaRealPath.equals("")) { + //如果默认和备用路径还是为空,则不压缩上传 + ToastHelper.showToast("操作失败,无法获取有效的视频文件", ToastHelper.ERROR); + return; + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(mediaRealPath); + String defaultRotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + String defaultBitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - qmuiTipDialog.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - /** - * 视频压缩 - * 第一个参数:视频源文件路径 - * 第二个参数:压缩后视频保存的路径 - */ - String comPressPath = SiliCompressor.with(context).compressVideo(mediaRealPath, FileUtils.getVideoCompressPath()); - Message message = weakReferenceHandler.obtainMessage(); - message.what = 20210427; - message.obj = comPressPath; - weakReferenceHandler.sendMessage(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); + assert defaultRotation != null; + compressVideo(mediaRealPath, defaultRotation, defaultBitrate); break; case Constant.REQUEST_MAP_CODE: if (data == null) { @@ -421,27 +422,46 @@ } } - private static class WeakReferenceHandler extends Handler { - private WeakReference reference; - - private WeakReferenceHandler(CaseUploadActivity activity) { - reference = new WeakReference<>(activity); + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = Constant.DEFAULT_WIDTH / 2; + height = Constant.DEFAULT_HEIGHT / 2; + } else { + width = Constant.DEFAULT_HEIGHT / 2; + height = Constant.DEFAULT_WIDTH / 2; } - - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - CaseUploadActivity caseUploadActivity = reference.get(); - if (msg.what == 20210427) { - caseUploadActivity.qmuiTipDialog.dismiss(); - String comPressPath = (String) msg.obj; - if (!TextUtils.isEmpty(comPressPath)) { - caseUploadActivity.uploadVideoPresenter.onReadyRetrofitRequest(new File(comPressPath)); - } else { - ToastHelper.showToast("案卷视频上传失败", ToastHelper.ERROR); - } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = Constant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, Constant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); } - } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadVideoPresenter.onReadyRetrofitRequest(new File(outputVideoFile)); + } else { + ToastHelper.showToast("压缩失败", ToastHelper.ERROR); + } + progressDialog.dismiss(); + } + }); } /** @@ -614,7 +634,7 @@ videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); String completeURL = StringHelper.appendCompleteURL(videoUrl); - videoPlayerView.setUp(completeURL, ""); + videoPlayerView.setUp(completeURL, "", Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java new file mode 100644 index 0000000..10bfc1b --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java @@ -0,0 +1,332 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseCaseActivity; +import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.OtherUtils; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CaseUploadPackageActivity extends BaseCaseActivity implements View.OnClickListener, + IUploadFileView, ICaseSubmitCaseView { + + private Context context = CaseUploadPackageActivity.this; + @BindView(R.id.shopView) + TextView shopView; + @BindView(R.id.communityView) + EditText communityView; + @BindView(R.id.longitudeView) + TextView longitudeView; + @BindView(R.id.latitudeView) + TextView latitudeView; + @BindView(R.id.shopKeeperView) + EditText shopKeeperView; + @BindView(R.id.phoneNumberView) + EditText phoneNumberView; + @BindView(R.id.caseLocationView) + EditText caseLocationView; + @BindView(R.id.caseDetailEditView) + EditText caseDetailEditView; + @BindView(R.id.selectedResultView) + RecyclerView selectedResultView; + @BindView(R.id.addImageView) + ImageView addImageView; + @BindView(R.id.submitButton) + QMUIRoundButton submitButton; + + private UploadImagePresenterImpl uploadImagePresenter; + private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; + private ImageRecycleViewAdapter imageAdapter; + private QMUITipDialog submitDialog; + private ArrayList realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private String gridId, shopID; + + @Override + public int initLayoutView() { + return R.layout.activity_package; + } + + @Override + protected String setTitleName() { + return "三包上报"; + } + + @Override + public void initData() { + uploadImagePresenter = new UploadImagePresenterImpl(this); + shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + imageAdapter = new ImageRecycleViewAdapter(this); + selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); + selectedResultView.addItemDecoration(new ItemDecorationSpace()); + selectedResultView.setAdapter(imageAdapter); + } + + @Override + public void initEvent() { + submitButton.setChangeAlphaWhenPress(true); + } + + @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.shopLayout: + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", "三包上报"); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .setCanceledOnTouchOutside(false) + .create().show(); + break; + case R.id.submitButton: + submitCase(); + break; + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } + double longitude = data.getDoubleExtra("longitude", 0); + double latitude = data.getDoubleExtra("latitude", 0); + gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String shopName = data.getStringExtra("shopName"); + shopID = data.getStringExtra("shopID"); + + longitudeView.setText(String.valueOf(longitude)); + latitudeView.setText(String.valueOf(latitude)); + communityView.setText(community); + shopView.setText(shopName); + break; + default: + break; + } + } + } + + /** + * 案卷提交 + */ + private void submitCase() { + String longitude = longitudeView.getText().toString(); + String latitude = latitudeView.getText().toString(); + if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { + ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); + return; + } + String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(shopKeeper)) { + ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); + return; + } + String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(phoneNumber)) { + ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); + return; + } + if (StringHelper.isPhoneNumber(phoneNumber)) { + String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(fieldIntro)) { + ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); + return; + } + String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(description)) { + ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); + return; + } + if (imageAdapter.getItemCount() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } + shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, + "2", "1", + gridId.substring(0, 6), + gridId.substring(0, 9), + gridId.substring(0, 12), + gridId, description, fieldIntro, + StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); + } else { + ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.dismiss(); + } + + @Override + public void obtainSubmitResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); + finish(); + } else { + ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); + } + } + + @Override + public void obtainDataFail() { + ToastHelper.showToast("操作失败", ToastHelper.ERROR); + } + + @Override + public void obtainUploadAudioResult(ActionResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 2) { + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + imageAdapter.setMediaList(realPaths); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + OtherUtils.showBigImage(context, position, realPaths); + } + }); + //删除按钮点击事件 + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + mediaList.remove(position); + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } else { + ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); + } + } + } + + @Override + public void obtainUploadVideoResult(ActionResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java index 67a0340..7750f8a 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java @@ -242,6 +242,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java index e27a310..d364d7c 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -179,7 +180,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java index f0e437a..d28d4b2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -44,6 +44,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -285,7 +286,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -518,6 +519,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java deleted file mode 100644 index 1ba1d5b..0000000 --- a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java +++ /dev/null @@ -1,331 +0,0 @@ -package com.casic.dcms.ui; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.text.TextUtils; -import android.view.View; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.ImageRecycleViewAdapter; -import com.casic.dcms.base.BaseCaseActivity; -import com.casic.dcms.bean.ActionResultBean; -import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; -import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; -import com.casic.dcms.mvp.view.ICaseSubmitCaseView; -import com.casic.dcms.mvp.view.IUploadFileView; -import com.casic.dcms.utils.Constant; -import com.casic.dcms.utils.FileUtils; -import com.casic.dcms.utils.GlideLoadEngine; -import com.casic.dcms.utils.ItemDecorationSpace; -import com.casic.dcms.utils.OtherUtils; -import com.casic.dcms.utils.StringHelper; -import com.casic.dcms.utils.ToastHelper; -import com.luck.picture.lib.PictureSelector; -import com.luck.picture.lib.config.PictureConfig; -import com.luck.picture.lib.config.PictureMimeType; -import com.luck.picture.lib.entity.LocalMedia; -import com.luck.picture.lib.tools.PictureFileUtils; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; -import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.OnClick; - -public class ThreePackageUploadActivity extends BaseCaseActivity implements View.OnClickListener, - IUploadFileView, ICaseSubmitCaseView { - - private Context context = ThreePackageUploadActivity.this; - @BindView(R.id.shopView) - TextView shopView; - @BindView(R.id.communityView) - EditText communityView; - @BindView(R.id.longitudeView) - TextView longitudeView; - @BindView(R.id.latitudeView) - TextView latitudeView; - @BindView(R.id.shopKeeperView) - EditText shopKeeperView; - @BindView(R.id.phoneNumberView) - EditText phoneNumberView; - @BindView(R.id.caseLocationView) - EditText caseLocationView; - @BindView(R.id.caseDetailEditView) - EditText caseDetailEditView; - @BindView(R.id.selectedResultView) - RecyclerView selectedResultView; - @BindView(R.id.addImageView) - ImageView addImageView; - @BindView(R.id.submitButton) - QMUIRoundButton submitButton; - - private UploadImagePresenterImpl uploadImagePresenter; - private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; - private ImageRecycleViewAdapter imageAdapter; - private QMUITipDialog submitDialog; - private ArrayList realPaths = new ArrayList<>();//真是图片路径 - private List mediaList = new ArrayList<>();//上传到服务器的数据集 - private String gridId, shopID; - - @Override - public int initLayoutView() { - return R.layout.activity_package; - } - - @Override - protected String setTitleName() { - return "三包上报"; - } - - @Override - public void initData() { - uploadImagePresenter = new UploadImagePresenterImpl(this); - shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); - submitDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("提交中,请稍后") - .create(); - imageAdapter = new ImageRecycleViewAdapter(this); - selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); - selectedResultView.addItemDecoration(new ItemDecorationSpace()); - selectedResultView.setAdapter(imageAdapter); - } - - @Override - public void initEvent() { - submitButton.setChangeAlphaWhenPress(true); - } - - @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.shopLayout: - Intent intent = new Intent(this, ArcGISMapActivity.class); - intent.putExtra("type", "三包上报"); - startActivityForResult(intent, Constant.REQUEST_MAP_CODE); - break; - case R.id.addImageView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("相册中选取", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //选图 - selectPicture(); - } - }) - .addItem("相机拍照", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //拍照 - takePicture(); - } - }) - .setCanceledOnTouchOutside(false) - .create().show(); - break; - case R.id.submitButton: - submitCase(); - break; - } - } - - private void selectPicture() { - PictureSelector.create(this) - .openGallery(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(2) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.CHOOSE_REQUEST); - } - - private void takePicture() { - PictureSelector.create(this) - .openCamera(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(1) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.REQUEST_CAMERA); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK) { - switch (requestCode) { - case PictureConfig.CHOOSE_REQUEST: - List selectList = PictureSelector.obtainMultipleResult(data); - for (LocalMedia media : selectList) { - String mediaCompressPath = media.getCompressPath(); - uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); - } - break; - case PictureConfig.REQUEST_CAMERA: - LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); - uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); - break; - case Constant.REQUEST_MAP_CODE: - if (data == null) { - return; - } - double longitude = data.getDoubleExtra("longitude", 0); - double latitude = data.getDoubleExtra("latitude", 0); - gridId = data.getStringExtra("gridId"); - String community = data.getStringExtra("community"); - String shopName = data.getStringExtra("shopName"); - shopID = data.getStringExtra("shopID"); - - longitudeView.setText(String.valueOf(longitude)); - latitudeView.setText(String.valueOf(latitude)); - communityView.setText(community); - shopView.setText(shopName); - break; - default: - break; - } - } - } - - /** - * 案卷提交 - */ - private void submitCase() { - String longitude = longitudeView.getText().toString(); - String latitude = latitudeView.getText().toString(); - if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { - ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); - return; - } - String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(shopKeeper)) { - ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); - return; - } - String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(phoneNumber)) { - ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); - return; - } - if (StringHelper.isPhoneNumber(phoneNumber)) { - String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(fieldIntro)) { - ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); - return; - } - String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(description)) { - ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); - return; - } - if (imageAdapter.getItemCount() != 2) { - ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); - return; - } - shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, - "2", "1", - gridId.substring(0, 6), - gridId.substring(0, 9), - gridId.substring(0, 12), - gridId, description, fieldIntro, - StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); - } else { - ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); - } - } - - @Override - public void showProgress() { - submitDialog.show(); - } - - @Override - public void hideProgress() { - submitDialog.dismiss(); - } - - @Override - public void obtainSubmitResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); - finish(); - } else { - ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); - } - } - - @Override - public void obtainDataFail() { - ToastHelper.showToast("操作失败", ToastHelper.ERROR); - } - - @Override - public void obtainUploadAudioResult(ActionResultBean resultBean) { - - } - - @Override - public void obtainUploadImageResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - PictureFileUtils.deleteAllCacheDirFile(this); - /** - * 系统路径static拼接图片返回路径 - * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg - */ - //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg - int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 2) { - String url = resultBean.getData(); - mediaList.add(url); - realPaths.add(StringHelper.appendCompleteURL(url)); - if (realPaths.size() == 2) { - addImageView.setVisibility(View.GONE); - } - imageAdapter.setMediaList(realPaths); - //九宫格点击事件 - imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { - @Override - public void onClick(int position) { - OtherUtils.showBigImage(context, position, realPaths); - } - }); - //删除按钮点击事件 - imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { - @Override - public void onClick(int position) { - mediaList.remove(position); - realPaths.remove(position); - imageAdapter.setMediaList(realPaths); - if (realPaths.size() != 2) { - addImageView.setVisibility(View.VISIBLE); - } - } - }); - } else { - ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); - } - } - } - - @Override - public void obtainUploadVideoResult(ActionResultBean resultBean) { - - } -} diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java index 2ae9aa6..5dcf237 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java @@ -24,13 +24,13 @@ import com.casic.dcms.ui.CaseOnMapActivity; import com.casic.dcms.ui.CaseSearchActivity; import com.casic.dcms.ui.CaseUploadActivity; +import com.casic.dcms.ui.CaseUploadPackageActivity; import com.casic.dcms.ui.CaseUploadQuicklyActivity; import com.casic.dcms.ui.CaseVerifyActivity; import com.casic.dcms.ui.DataAnalysisActivity; import com.casic.dcms.ui.OvertimeCaseActivity; import com.casic.dcms.ui.PersonOnlineActivity; import com.casic.dcms.ui.PublicToiletActivity; -import com.casic.dcms.ui.ThreePackageUploadActivity; import com.casic.dcms.ui.UrgentCaseActivity; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -119,7 +119,7 @@ intent.setClass(context, CaseUploadQuicklyActivity.class); break; case "三包上报": - intent.setClass(context, ThreePackageUploadActivity.class); + intent.setClass(context, CaseUploadPackageActivity.class); break; case "案卷核实": intent.setClass(context, CaseVerifyActivity.class); diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index b1adeb9..75ac52e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -1,14 +1,15 @@ package com.casic.dcms.ui; import android.annotation.SuppressLint; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; +import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -18,7 +19,6 @@ import android.widget.PopupWindow; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -47,12 +47,13 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.TimeOrDateUtil; import com.casic.dcms.utils.ToastHelper; import com.casic.dcms.widgets.VoicePlayView; -import com.iceteck.silicompressorr.SiliCompressor; +import com.google.gson.Gson; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; @@ -65,10 +66,10 @@ import com.qmuiteam.qmui.widget.popup.QMUIPopup; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import com.zolad.videoslimmer.VideoSlimmer; import java.io.File; import java.io.IOException; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ public class CaseUploadActivity extends BaseCaseActivity implements View.OnClickListener, View.OnTouchListener, ICaseLargeClassView, ICaseSmallClassView, ICaseSubmitCaseView, IUploadFileView { - private Context context = this; @BindView(R.id.caseLayout) LinearLayout caseLayout; @BindView(R.id.caseClassView) @@ -116,12 +116,15 @@ @BindView(R.id.submitButton) QMUIRoundButton submitButton; + private static final String TAG = "CaseUploadActivity"; + private Context context = this; private CaseLargeClassPresenterImpl caseLargeClassPresenter; private CaseSmallClassPresenterImpl caseSmallClassPresenter; private CaseSubmitPresenterImpl caseSubmitPresenter; private List largeClassBeans; private List smallClassBeans; - private QMUITipDialog submitDialog, qmuiTipDialog; + private QMUITipDialog submitDialog; + private ProgressDialog progressDialog; private UploadImagePresenterImpl uploadImagePresenter; private List imageList = new ArrayList<>();//服务器返回的拍照数据集 private ArrayList realPaths = new ArrayList<>();//真是图片路径 @@ -136,7 +139,6 @@ private String audioUrl, videoUrl; private AudioRecodeHelper audioRecodeHelper; private PopupWindow popWindow; - private static WeakReferenceHandler weakReferenceHandler; private boolean isFirstEnter = true; @Override @@ -156,15 +158,18 @@ caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord("提交中,请稍后") .create(); - qmuiTipDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("视频压缩中,请稍后") - .create(); - weakReferenceHandler = new WeakReferenceHandler(this); + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("视频压缩中..."); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCancelable(false); + progressDialog.setCanceledOnTouchOutside(false); + uploadImagePresenter = new UploadImagePresenterImpl(this); uploadAudioPresenter = new UploadAudioPresenterImpl(this); uploadVideoPresenter = new UploadVideoPresenterImpl(this); @@ -179,7 +184,6 @@ public void initEvent() { voiceView.setOnTouchListener(this); submitButton.setChangeAlphaWhenPress(true); - //录音相关 View view = View.inflate(this, R.layout.popu_microphone, null); int popWidth = (int) (QMUIDisplayHelper.getScreenWidth(this) * 0.35); @@ -340,6 +344,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -378,29 +383,25 @@ case PictureConfig.PREVIEW_VIDEO_CODE: LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0); //"realPath":"/storage/emulated/0/Movies/VID_20210426_17552226.mp4" + Log.d(TAG, "onActivityResult: " + new Gson().toJson(media)); //需要手动压缩视频 String mediaRealPath = media.getRealPath(); + if (TextUtils.isEmpty(mediaRealPath)) { + //部分手机getRealPath可能为空,需要备用路径 + mediaRealPath = media.getPath(); + } + if (TextUtils.isEmpty(mediaRealPath) || mediaRealPath.equals("")) { + //如果默认和备用路径还是为空,则不压缩上传 + ToastHelper.showToast("操作失败,无法获取有效的视频文件", ToastHelper.ERROR); + return; + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(mediaRealPath); + String defaultRotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + String defaultBitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - qmuiTipDialog.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - /** - * 视频压缩 - * 第一个参数:视频源文件路径 - * 第二个参数:压缩后视频保存的路径 - */ - String comPressPath = SiliCompressor.with(context).compressVideo(mediaRealPath, FileUtils.getVideoCompressPath()); - Message message = weakReferenceHandler.obtainMessage(); - message.what = 20210427; - message.obj = comPressPath; - weakReferenceHandler.sendMessage(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); + assert defaultRotation != null; + compressVideo(mediaRealPath, defaultRotation, defaultBitrate); break; case Constant.REQUEST_MAP_CODE: if (data == null) { @@ -421,27 +422,46 @@ } } - private static class WeakReferenceHandler extends Handler { - private WeakReference reference; - - private WeakReferenceHandler(CaseUploadActivity activity) { - reference = new WeakReference<>(activity); + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = Constant.DEFAULT_WIDTH / 2; + height = Constant.DEFAULT_HEIGHT / 2; + } else { + width = Constant.DEFAULT_HEIGHT / 2; + height = Constant.DEFAULT_WIDTH / 2; } - - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - CaseUploadActivity caseUploadActivity = reference.get(); - if (msg.what == 20210427) { - caseUploadActivity.qmuiTipDialog.dismiss(); - String comPressPath = (String) msg.obj; - if (!TextUtils.isEmpty(comPressPath)) { - caseUploadActivity.uploadVideoPresenter.onReadyRetrofitRequest(new File(comPressPath)); - } else { - ToastHelper.showToast("案卷视频上传失败", ToastHelper.ERROR); - } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = Constant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, Constant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); } - } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadVideoPresenter.onReadyRetrofitRequest(new File(outputVideoFile)); + } else { + ToastHelper.showToast("压缩失败", ToastHelper.ERROR); + } + progressDialog.dismiss(); + } + }); } /** @@ -614,7 +634,7 @@ videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); String completeURL = StringHelper.appendCompleteURL(videoUrl); - videoPlayerView.setUp(completeURL, ""); + videoPlayerView.setUp(completeURL, "", Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java new file mode 100644 index 0000000..10bfc1b --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java @@ -0,0 +1,332 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseCaseActivity; +import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.OtherUtils; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CaseUploadPackageActivity extends BaseCaseActivity implements View.OnClickListener, + IUploadFileView, ICaseSubmitCaseView { + + private Context context = CaseUploadPackageActivity.this; + @BindView(R.id.shopView) + TextView shopView; + @BindView(R.id.communityView) + EditText communityView; + @BindView(R.id.longitudeView) + TextView longitudeView; + @BindView(R.id.latitudeView) + TextView latitudeView; + @BindView(R.id.shopKeeperView) + EditText shopKeeperView; + @BindView(R.id.phoneNumberView) + EditText phoneNumberView; + @BindView(R.id.caseLocationView) + EditText caseLocationView; + @BindView(R.id.caseDetailEditView) + EditText caseDetailEditView; + @BindView(R.id.selectedResultView) + RecyclerView selectedResultView; + @BindView(R.id.addImageView) + ImageView addImageView; + @BindView(R.id.submitButton) + QMUIRoundButton submitButton; + + private UploadImagePresenterImpl uploadImagePresenter; + private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; + private ImageRecycleViewAdapter imageAdapter; + private QMUITipDialog submitDialog; + private ArrayList realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private String gridId, shopID; + + @Override + public int initLayoutView() { + return R.layout.activity_package; + } + + @Override + protected String setTitleName() { + return "三包上报"; + } + + @Override + public void initData() { + uploadImagePresenter = new UploadImagePresenterImpl(this); + shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + imageAdapter = new ImageRecycleViewAdapter(this); + selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); + selectedResultView.addItemDecoration(new ItemDecorationSpace()); + selectedResultView.setAdapter(imageAdapter); + } + + @Override + public void initEvent() { + submitButton.setChangeAlphaWhenPress(true); + } + + @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.shopLayout: + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", "三包上报"); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .setCanceledOnTouchOutside(false) + .create().show(); + break; + case R.id.submitButton: + submitCase(); + break; + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } + double longitude = data.getDoubleExtra("longitude", 0); + double latitude = data.getDoubleExtra("latitude", 0); + gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String shopName = data.getStringExtra("shopName"); + shopID = data.getStringExtra("shopID"); + + longitudeView.setText(String.valueOf(longitude)); + latitudeView.setText(String.valueOf(latitude)); + communityView.setText(community); + shopView.setText(shopName); + break; + default: + break; + } + } + } + + /** + * 案卷提交 + */ + private void submitCase() { + String longitude = longitudeView.getText().toString(); + String latitude = latitudeView.getText().toString(); + if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { + ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); + return; + } + String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(shopKeeper)) { + ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); + return; + } + String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(phoneNumber)) { + ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); + return; + } + if (StringHelper.isPhoneNumber(phoneNumber)) { + String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(fieldIntro)) { + ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); + return; + } + String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(description)) { + ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); + return; + } + if (imageAdapter.getItemCount() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } + shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, + "2", "1", + gridId.substring(0, 6), + gridId.substring(0, 9), + gridId.substring(0, 12), + gridId, description, fieldIntro, + StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); + } else { + ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.dismiss(); + } + + @Override + public void obtainSubmitResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); + finish(); + } else { + ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); + } + } + + @Override + public void obtainDataFail() { + ToastHelper.showToast("操作失败", ToastHelper.ERROR); + } + + @Override + public void obtainUploadAudioResult(ActionResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 2) { + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + imageAdapter.setMediaList(realPaths); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + OtherUtils.showBigImage(context, position, realPaths); + } + }); + //删除按钮点击事件 + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + mediaList.remove(position); + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } else { + ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); + } + } + } + + @Override + public void obtainUploadVideoResult(ActionResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java index 67a0340..7750f8a 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java @@ -242,6 +242,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java index e27a310..d364d7c 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -179,7 +180,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java index f0e437a..d28d4b2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -44,6 +44,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -285,7 +286,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -518,6 +519,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java deleted file mode 100644 index 1ba1d5b..0000000 --- a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java +++ /dev/null @@ -1,331 +0,0 @@ -package com.casic.dcms.ui; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.text.TextUtils; -import android.view.View; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.ImageRecycleViewAdapter; -import com.casic.dcms.base.BaseCaseActivity; -import com.casic.dcms.bean.ActionResultBean; -import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; -import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; -import com.casic.dcms.mvp.view.ICaseSubmitCaseView; -import com.casic.dcms.mvp.view.IUploadFileView; -import com.casic.dcms.utils.Constant; -import com.casic.dcms.utils.FileUtils; -import com.casic.dcms.utils.GlideLoadEngine; -import com.casic.dcms.utils.ItemDecorationSpace; -import com.casic.dcms.utils.OtherUtils; -import com.casic.dcms.utils.StringHelper; -import com.casic.dcms.utils.ToastHelper; -import com.luck.picture.lib.PictureSelector; -import com.luck.picture.lib.config.PictureConfig; -import com.luck.picture.lib.config.PictureMimeType; -import com.luck.picture.lib.entity.LocalMedia; -import com.luck.picture.lib.tools.PictureFileUtils; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; -import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.OnClick; - -public class ThreePackageUploadActivity extends BaseCaseActivity implements View.OnClickListener, - IUploadFileView, ICaseSubmitCaseView { - - private Context context = ThreePackageUploadActivity.this; - @BindView(R.id.shopView) - TextView shopView; - @BindView(R.id.communityView) - EditText communityView; - @BindView(R.id.longitudeView) - TextView longitudeView; - @BindView(R.id.latitudeView) - TextView latitudeView; - @BindView(R.id.shopKeeperView) - EditText shopKeeperView; - @BindView(R.id.phoneNumberView) - EditText phoneNumberView; - @BindView(R.id.caseLocationView) - EditText caseLocationView; - @BindView(R.id.caseDetailEditView) - EditText caseDetailEditView; - @BindView(R.id.selectedResultView) - RecyclerView selectedResultView; - @BindView(R.id.addImageView) - ImageView addImageView; - @BindView(R.id.submitButton) - QMUIRoundButton submitButton; - - private UploadImagePresenterImpl uploadImagePresenter; - private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; - private ImageRecycleViewAdapter imageAdapter; - private QMUITipDialog submitDialog; - private ArrayList realPaths = new ArrayList<>();//真是图片路径 - private List mediaList = new ArrayList<>();//上传到服务器的数据集 - private String gridId, shopID; - - @Override - public int initLayoutView() { - return R.layout.activity_package; - } - - @Override - protected String setTitleName() { - return "三包上报"; - } - - @Override - public void initData() { - uploadImagePresenter = new UploadImagePresenterImpl(this); - shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); - submitDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("提交中,请稍后") - .create(); - imageAdapter = new ImageRecycleViewAdapter(this); - selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); - selectedResultView.addItemDecoration(new ItemDecorationSpace()); - selectedResultView.setAdapter(imageAdapter); - } - - @Override - public void initEvent() { - submitButton.setChangeAlphaWhenPress(true); - } - - @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.shopLayout: - Intent intent = new Intent(this, ArcGISMapActivity.class); - intent.putExtra("type", "三包上报"); - startActivityForResult(intent, Constant.REQUEST_MAP_CODE); - break; - case R.id.addImageView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("相册中选取", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //选图 - selectPicture(); - } - }) - .addItem("相机拍照", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //拍照 - takePicture(); - } - }) - .setCanceledOnTouchOutside(false) - .create().show(); - break; - case R.id.submitButton: - submitCase(); - break; - } - } - - private void selectPicture() { - PictureSelector.create(this) - .openGallery(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(2) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.CHOOSE_REQUEST); - } - - private void takePicture() { - PictureSelector.create(this) - .openCamera(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(1) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.REQUEST_CAMERA); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK) { - switch (requestCode) { - case PictureConfig.CHOOSE_REQUEST: - List selectList = PictureSelector.obtainMultipleResult(data); - for (LocalMedia media : selectList) { - String mediaCompressPath = media.getCompressPath(); - uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); - } - break; - case PictureConfig.REQUEST_CAMERA: - LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); - uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); - break; - case Constant.REQUEST_MAP_CODE: - if (data == null) { - return; - } - double longitude = data.getDoubleExtra("longitude", 0); - double latitude = data.getDoubleExtra("latitude", 0); - gridId = data.getStringExtra("gridId"); - String community = data.getStringExtra("community"); - String shopName = data.getStringExtra("shopName"); - shopID = data.getStringExtra("shopID"); - - longitudeView.setText(String.valueOf(longitude)); - latitudeView.setText(String.valueOf(latitude)); - communityView.setText(community); - shopView.setText(shopName); - break; - default: - break; - } - } - } - - /** - * 案卷提交 - */ - private void submitCase() { - String longitude = longitudeView.getText().toString(); - String latitude = latitudeView.getText().toString(); - if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { - ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); - return; - } - String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(shopKeeper)) { - ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); - return; - } - String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(phoneNumber)) { - ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); - return; - } - if (StringHelper.isPhoneNumber(phoneNumber)) { - String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(fieldIntro)) { - ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); - return; - } - String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(description)) { - ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); - return; - } - if (imageAdapter.getItemCount() != 2) { - ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); - return; - } - shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, - "2", "1", - gridId.substring(0, 6), - gridId.substring(0, 9), - gridId.substring(0, 12), - gridId, description, fieldIntro, - StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); - } else { - ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); - } - } - - @Override - public void showProgress() { - submitDialog.show(); - } - - @Override - public void hideProgress() { - submitDialog.dismiss(); - } - - @Override - public void obtainSubmitResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); - finish(); - } else { - ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); - } - } - - @Override - public void obtainDataFail() { - ToastHelper.showToast("操作失败", ToastHelper.ERROR); - } - - @Override - public void obtainUploadAudioResult(ActionResultBean resultBean) { - - } - - @Override - public void obtainUploadImageResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - PictureFileUtils.deleteAllCacheDirFile(this); - /** - * 系统路径static拼接图片返回路径 - * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg - */ - //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg - int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 2) { - String url = resultBean.getData(); - mediaList.add(url); - realPaths.add(StringHelper.appendCompleteURL(url)); - if (realPaths.size() == 2) { - addImageView.setVisibility(View.GONE); - } - imageAdapter.setMediaList(realPaths); - //九宫格点击事件 - imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { - @Override - public void onClick(int position) { - OtherUtils.showBigImage(context, position, realPaths); - } - }); - //删除按钮点击事件 - imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { - @Override - public void onClick(int position) { - mediaList.remove(position); - realPaths.remove(position); - imageAdapter.setMediaList(realPaths); - if (realPaths.size() != 2) { - addImageView.setVisibility(View.VISIBLE); - } - } - }); - } else { - ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); - } - } - } - - @Override - public void obtainUploadVideoResult(ActionResultBean resultBean) { - - } -} diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java index 2ae9aa6..5dcf237 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java @@ -24,13 +24,13 @@ import com.casic.dcms.ui.CaseOnMapActivity; import com.casic.dcms.ui.CaseSearchActivity; import com.casic.dcms.ui.CaseUploadActivity; +import com.casic.dcms.ui.CaseUploadPackageActivity; import com.casic.dcms.ui.CaseUploadQuicklyActivity; import com.casic.dcms.ui.CaseVerifyActivity; import com.casic.dcms.ui.DataAnalysisActivity; import com.casic.dcms.ui.OvertimeCaseActivity; import com.casic.dcms.ui.PersonOnlineActivity; import com.casic.dcms.ui.PublicToiletActivity; -import com.casic.dcms.ui.ThreePackageUploadActivity; import com.casic.dcms.ui.UrgentCaseActivity; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -119,7 +119,7 @@ intent.setClass(context, CaseUploadQuicklyActivity.class); break; case "三包上报": - intent.setClass(context, ThreePackageUploadActivity.class); + intent.setClass(context, CaseUploadPackageActivity.class); break; case "案卷核实": intent.setClass(context, CaseVerifyActivity.class); diff --git a/app/src/main/java/com/casic/dcms/utils/Constant.java b/app/src/main/java/com/casic/dcms/utils/Constant.java index d948e35..036f762 100644 --- a/app/src/main/java/com/casic/dcms/utils/Constant.java +++ b/app/src/main/java/com/casic/dcms/utils/Constant.java @@ -40,6 +40,9 @@ public static final int REQUEST_REFRESH_CODE = 9002; public static final int PAGE_LIMIT = 15; + public static final int BITRATE = 200 * 360 * 30; + public static final int DEFAULT_WIDTH = 720; + public static final int DEFAULT_HEIGHT = 1280; public static final int CASE_HANDLE = 0; public static final int CASE_VERIFY = 1; diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index b1adeb9..75ac52e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -1,14 +1,15 @@ package com.casic.dcms.ui; import android.annotation.SuppressLint; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; +import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -18,7 +19,6 @@ import android.widget.PopupWindow; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -47,12 +47,13 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.TimeOrDateUtil; import com.casic.dcms.utils.ToastHelper; import com.casic.dcms.widgets.VoicePlayView; -import com.iceteck.silicompressorr.SiliCompressor; +import com.google.gson.Gson; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; @@ -65,10 +66,10 @@ import com.qmuiteam.qmui.widget.popup.QMUIPopup; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import com.zolad.videoslimmer.VideoSlimmer; import java.io.File; import java.io.IOException; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ public class CaseUploadActivity extends BaseCaseActivity implements View.OnClickListener, View.OnTouchListener, ICaseLargeClassView, ICaseSmallClassView, ICaseSubmitCaseView, IUploadFileView { - private Context context = this; @BindView(R.id.caseLayout) LinearLayout caseLayout; @BindView(R.id.caseClassView) @@ -116,12 +116,15 @@ @BindView(R.id.submitButton) QMUIRoundButton submitButton; + private static final String TAG = "CaseUploadActivity"; + private Context context = this; private CaseLargeClassPresenterImpl caseLargeClassPresenter; private CaseSmallClassPresenterImpl caseSmallClassPresenter; private CaseSubmitPresenterImpl caseSubmitPresenter; private List largeClassBeans; private List smallClassBeans; - private QMUITipDialog submitDialog, qmuiTipDialog; + private QMUITipDialog submitDialog; + private ProgressDialog progressDialog; private UploadImagePresenterImpl uploadImagePresenter; private List imageList = new ArrayList<>();//服务器返回的拍照数据集 private ArrayList realPaths = new ArrayList<>();//真是图片路径 @@ -136,7 +139,6 @@ private String audioUrl, videoUrl; private AudioRecodeHelper audioRecodeHelper; private PopupWindow popWindow; - private static WeakReferenceHandler weakReferenceHandler; private boolean isFirstEnter = true; @Override @@ -156,15 +158,18 @@ caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord("提交中,请稍后") .create(); - qmuiTipDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("视频压缩中,请稍后") - .create(); - weakReferenceHandler = new WeakReferenceHandler(this); + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("视频压缩中..."); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCancelable(false); + progressDialog.setCanceledOnTouchOutside(false); + uploadImagePresenter = new UploadImagePresenterImpl(this); uploadAudioPresenter = new UploadAudioPresenterImpl(this); uploadVideoPresenter = new UploadVideoPresenterImpl(this); @@ -179,7 +184,6 @@ public void initEvent() { voiceView.setOnTouchListener(this); submitButton.setChangeAlphaWhenPress(true); - //录音相关 View view = View.inflate(this, R.layout.popu_microphone, null); int popWidth = (int) (QMUIDisplayHelper.getScreenWidth(this) * 0.35); @@ -340,6 +344,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -378,29 +383,25 @@ case PictureConfig.PREVIEW_VIDEO_CODE: LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0); //"realPath":"/storage/emulated/0/Movies/VID_20210426_17552226.mp4" + Log.d(TAG, "onActivityResult: " + new Gson().toJson(media)); //需要手动压缩视频 String mediaRealPath = media.getRealPath(); + if (TextUtils.isEmpty(mediaRealPath)) { + //部分手机getRealPath可能为空,需要备用路径 + mediaRealPath = media.getPath(); + } + if (TextUtils.isEmpty(mediaRealPath) || mediaRealPath.equals("")) { + //如果默认和备用路径还是为空,则不压缩上传 + ToastHelper.showToast("操作失败,无法获取有效的视频文件", ToastHelper.ERROR); + return; + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(mediaRealPath); + String defaultRotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + String defaultBitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - qmuiTipDialog.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - /** - * 视频压缩 - * 第一个参数:视频源文件路径 - * 第二个参数:压缩后视频保存的路径 - */ - String comPressPath = SiliCompressor.with(context).compressVideo(mediaRealPath, FileUtils.getVideoCompressPath()); - Message message = weakReferenceHandler.obtainMessage(); - message.what = 20210427; - message.obj = comPressPath; - weakReferenceHandler.sendMessage(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); + assert defaultRotation != null; + compressVideo(mediaRealPath, defaultRotation, defaultBitrate); break; case Constant.REQUEST_MAP_CODE: if (data == null) { @@ -421,27 +422,46 @@ } } - private static class WeakReferenceHandler extends Handler { - private WeakReference reference; - - private WeakReferenceHandler(CaseUploadActivity activity) { - reference = new WeakReference<>(activity); + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = Constant.DEFAULT_WIDTH / 2; + height = Constant.DEFAULT_HEIGHT / 2; + } else { + width = Constant.DEFAULT_HEIGHT / 2; + height = Constant.DEFAULT_WIDTH / 2; } - - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - CaseUploadActivity caseUploadActivity = reference.get(); - if (msg.what == 20210427) { - caseUploadActivity.qmuiTipDialog.dismiss(); - String comPressPath = (String) msg.obj; - if (!TextUtils.isEmpty(comPressPath)) { - caseUploadActivity.uploadVideoPresenter.onReadyRetrofitRequest(new File(comPressPath)); - } else { - ToastHelper.showToast("案卷视频上传失败", ToastHelper.ERROR); - } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = Constant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, Constant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); } - } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadVideoPresenter.onReadyRetrofitRequest(new File(outputVideoFile)); + } else { + ToastHelper.showToast("压缩失败", ToastHelper.ERROR); + } + progressDialog.dismiss(); + } + }); } /** @@ -614,7 +634,7 @@ videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); String completeURL = StringHelper.appendCompleteURL(videoUrl); - videoPlayerView.setUp(completeURL, ""); + videoPlayerView.setUp(completeURL, "", Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java new file mode 100644 index 0000000..10bfc1b --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java @@ -0,0 +1,332 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseCaseActivity; +import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.OtherUtils; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CaseUploadPackageActivity extends BaseCaseActivity implements View.OnClickListener, + IUploadFileView, ICaseSubmitCaseView { + + private Context context = CaseUploadPackageActivity.this; + @BindView(R.id.shopView) + TextView shopView; + @BindView(R.id.communityView) + EditText communityView; + @BindView(R.id.longitudeView) + TextView longitudeView; + @BindView(R.id.latitudeView) + TextView latitudeView; + @BindView(R.id.shopKeeperView) + EditText shopKeeperView; + @BindView(R.id.phoneNumberView) + EditText phoneNumberView; + @BindView(R.id.caseLocationView) + EditText caseLocationView; + @BindView(R.id.caseDetailEditView) + EditText caseDetailEditView; + @BindView(R.id.selectedResultView) + RecyclerView selectedResultView; + @BindView(R.id.addImageView) + ImageView addImageView; + @BindView(R.id.submitButton) + QMUIRoundButton submitButton; + + private UploadImagePresenterImpl uploadImagePresenter; + private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; + private ImageRecycleViewAdapter imageAdapter; + private QMUITipDialog submitDialog; + private ArrayList realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private String gridId, shopID; + + @Override + public int initLayoutView() { + return R.layout.activity_package; + } + + @Override + protected String setTitleName() { + return "三包上报"; + } + + @Override + public void initData() { + uploadImagePresenter = new UploadImagePresenterImpl(this); + shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + imageAdapter = new ImageRecycleViewAdapter(this); + selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); + selectedResultView.addItemDecoration(new ItemDecorationSpace()); + selectedResultView.setAdapter(imageAdapter); + } + + @Override + public void initEvent() { + submitButton.setChangeAlphaWhenPress(true); + } + + @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.shopLayout: + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", "三包上报"); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .setCanceledOnTouchOutside(false) + .create().show(); + break; + case R.id.submitButton: + submitCase(); + break; + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } + double longitude = data.getDoubleExtra("longitude", 0); + double latitude = data.getDoubleExtra("latitude", 0); + gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String shopName = data.getStringExtra("shopName"); + shopID = data.getStringExtra("shopID"); + + longitudeView.setText(String.valueOf(longitude)); + latitudeView.setText(String.valueOf(latitude)); + communityView.setText(community); + shopView.setText(shopName); + break; + default: + break; + } + } + } + + /** + * 案卷提交 + */ + private void submitCase() { + String longitude = longitudeView.getText().toString(); + String latitude = latitudeView.getText().toString(); + if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { + ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); + return; + } + String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(shopKeeper)) { + ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); + return; + } + String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(phoneNumber)) { + ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); + return; + } + if (StringHelper.isPhoneNumber(phoneNumber)) { + String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(fieldIntro)) { + ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); + return; + } + String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(description)) { + ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); + return; + } + if (imageAdapter.getItemCount() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } + shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, + "2", "1", + gridId.substring(0, 6), + gridId.substring(0, 9), + gridId.substring(0, 12), + gridId, description, fieldIntro, + StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); + } else { + ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.dismiss(); + } + + @Override + public void obtainSubmitResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); + finish(); + } else { + ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); + } + } + + @Override + public void obtainDataFail() { + ToastHelper.showToast("操作失败", ToastHelper.ERROR); + } + + @Override + public void obtainUploadAudioResult(ActionResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 2) { + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + imageAdapter.setMediaList(realPaths); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + OtherUtils.showBigImage(context, position, realPaths); + } + }); + //删除按钮点击事件 + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + mediaList.remove(position); + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } else { + ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); + } + } + } + + @Override + public void obtainUploadVideoResult(ActionResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java index 67a0340..7750f8a 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java @@ -242,6 +242,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java index e27a310..d364d7c 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -179,7 +180,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java index f0e437a..d28d4b2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -44,6 +44,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -285,7 +286,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -518,6 +519,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java deleted file mode 100644 index 1ba1d5b..0000000 --- a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java +++ /dev/null @@ -1,331 +0,0 @@ -package com.casic.dcms.ui; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.text.TextUtils; -import android.view.View; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.ImageRecycleViewAdapter; -import com.casic.dcms.base.BaseCaseActivity; -import com.casic.dcms.bean.ActionResultBean; -import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; -import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; -import com.casic.dcms.mvp.view.ICaseSubmitCaseView; -import com.casic.dcms.mvp.view.IUploadFileView; -import com.casic.dcms.utils.Constant; -import com.casic.dcms.utils.FileUtils; -import com.casic.dcms.utils.GlideLoadEngine; -import com.casic.dcms.utils.ItemDecorationSpace; -import com.casic.dcms.utils.OtherUtils; -import com.casic.dcms.utils.StringHelper; -import com.casic.dcms.utils.ToastHelper; -import com.luck.picture.lib.PictureSelector; -import com.luck.picture.lib.config.PictureConfig; -import com.luck.picture.lib.config.PictureMimeType; -import com.luck.picture.lib.entity.LocalMedia; -import com.luck.picture.lib.tools.PictureFileUtils; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; -import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.OnClick; - -public class ThreePackageUploadActivity extends BaseCaseActivity implements View.OnClickListener, - IUploadFileView, ICaseSubmitCaseView { - - private Context context = ThreePackageUploadActivity.this; - @BindView(R.id.shopView) - TextView shopView; - @BindView(R.id.communityView) - EditText communityView; - @BindView(R.id.longitudeView) - TextView longitudeView; - @BindView(R.id.latitudeView) - TextView latitudeView; - @BindView(R.id.shopKeeperView) - EditText shopKeeperView; - @BindView(R.id.phoneNumberView) - EditText phoneNumberView; - @BindView(R.id.caseLocationView) - EditText caseLocationView; - @BindView(R.id.caseDetailEditView) - EditText caseDetailEditView; - @BindView(R.id.selectedResultView) - RecyclerView selectedResultView; - @BindView(R.id.addImageView) - ImageView addImageView; - @BindView(R.id.submitButton) - QMUIRoundButton submitButton; - - private UploadImagePresenterImpl uploadImagePresenter; - private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; - private ImageRecycleViewAdapter imageAdapter; - private QMUITipDialog submitDialog; - private ArrayList realPaths = new ArrayList<>();//真是图片路径 - private List mediaList = new ArrayList<>();//上传到服务器的数据集 - private String gridId, shopID; - - @Override - public int initLayoutView() { - return R.layout.activity_package; - } - - @Override - protected String setTitleName() { - return "三包上报"; - } - - @Override - public void initData() { - uploadImagePresenter = new UploadImagePresenterImpl(this); - shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); - submitDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("提交中,请稍后") - .create(); - imageAdapter = new ImageRecycleViewAdapter(this); - selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); - selectedResultView.addItemDecoration(new ItemDecorationSpace()); - selectedResultView.setAdapter(imageAdapter); - } - - @Override - public void initEvent() { - submitButton.setChangeAlphaWhenPress(true); - } - - @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.shopLayout: - Intent intent = new Intent(this, ArcGISMapActivity.class); - intent.putExtra("type", "三包上报"); - startActivityForResult(intent, Constant.REQUEST_MAP_CODE); - break; - case R.id.addImageView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("相册中选取", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //选图 - selectPicture(); - } - }) - .addItem("相机拍照", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //拍照 - takePicture(); - } - }) - .setCanceledOnTouchOutside(false) - .create().show(); - break; - case R.id.submitButton: - submitCase(); - break; - } - } - - private void selectPicture() { - PictureSelector.create(this) - .openGallery(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(2) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.CHOOSE_REQUEST); - } - - private void takePicture() { - PictureSelector.create(this) - .openCamera(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(1) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.REQUEST_CAMERA); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK) { - switch (requestCode) { - case PictureConfig.CHOOSE_REQUEST: - List selectList = PictureSelector.obtainMultipleResult(data); - for (LocalMedia media : selectList) { - String mediaCompressPath = media.getCompressPath(); - uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); - } - break; - case PictureConfig.REQUEST_CAMERA: - LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); - uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); - break; - case Constant.REQUEST_MAP_CODE: - if (data == null) { - return; - } - double longitude = data.getDoubleExtra("longitude", 0); - double latitude = data.getDoubleExtra("latitude", 0); - gridId = data.getStringExtra("gridId"); - String community = data.getStringExtra("community"); - String shopName = data.getStringExtra("shopName"); - shopID = data.getStringExtra("shopID"); - - longitudeView.setText(String.valueOf(longitude)); - latitudeView.setText(String.valueOf(latitude)); - communityView.setText(community); - shopView.setText(shopName); - break; - default: - break; - } - } - } - - /** - * 案卷提交 - */ - private void submitCase() { - String longitude = longitudeView.getText().toString(); - String latitude = latitudeView.getText().toString(); - if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { - ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); - return; - } - String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(shopKeeper)) { - ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); - return; - } - String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(phoneNumber)) { - ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); - return; - } - if (StringHelper.isPhoneNumber(phoneNumber)) { - String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(fieldIntro)) { - ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); - return; - } - String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(description)) { - ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); - return; - } - if (imageAdapter.getItemCount() != 2) { - ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); - return; - } - shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, - "2", "1", - gridId.substring(0, 6), - gridId.substring(0, 9), - gridId.substring(0, 12), - gridId, description, fieldIntro, - StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); - } else { - ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); - } - } - - @Override - public void showProgress() { - submitDialog.show(); - } - - @Override - public void hideProgress() { - submitDialog.dismiss(); - } - - @Override - public void obtainSubmitResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); - finish(); - } else { - ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); - } - } - - @Override - public void obtainDataFail() { - ToastHelper.showToast("操作失败", ToastHelper.ERROR); - } - - @Override - public void obtainUploadAudioResult(ActionResultBean resultBean) { - - } - - @Override - public void obtainUploadImageResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - PictureFileUtils.deleteAllCacheDirFile(this); - /** - * 系统路径static拼接图片返回路径 - * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg - */ - //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg - int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 2) { - String url = resultBean.getData(); - mediaList.add(url); - realPaths.add(StringHelper.appendCompleteURL(url)); - if (realPaths.size() == 2) { - addImageView.setVisibility(View.GONE); - } - imageAdapter.setMediaList(realPaths); - //九宫格点击事件 - imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { - @Override - public void onClick(int position) { - OtherUtils.showBigImage(context, position, realPaths); - } - }); - //删除按钮点击事件 - imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { - @Override - public void onClick(int position) { - mediaList.remove(position); - realPaths.remove(position); - imageAdapter.setMediaList(realPaths); - if (realPaths.size() != 2) { - addImageView.setVisibility(View.VISIBLE); - } - } - }); - } else { - ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); - } - } - } - - @Override - public void obtainUploadVideoResult(ActionResultBean resultBean) { - - } -} diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java index 2ae9aa6..5dcf237 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java @@ -24,13 +24,13 @@ import com.casic.dcms.ui.CaseOnMapActivity; import com.casic.dcms.ui.CaseSearchActivity; import com.casic.dcms.ui.CaseUploadActivity; +import com.casic.dcms.ui.CaseUploadPackageActivity; import com.casic.dcms.ui.CaseUploadQuicklyActivity; import com.casic.dcms.ui.CaseVerifyActivity; import com.casic.dcms.ui.DataAnalysisActivity; import com.casic.dcms.ui.OvertimeCaseActivity; import com.casic.dcms.ui.PersonOnlineActivity; import com.casic.dcms.ui.PublicToiletActivity; -import com.casic.dcms.ui.ThreePackageUploadActivity; import com.casic.dcms.ui.UrgentCaseActivity; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -119,7 +119,7 @@ intent.setClass(context, CaseUploadQuicklyActivity.class); break; case "三包上报": - intent.setClass(context, ThreePackageUploadActivity.class); + intent.setClass(context, CaseUploadPackageActivity.class); break; case "案卷核实": intent.setClass(context, CaseVerifyActivity.class); diff --git a/app/src/main/java/com/casic/dcms/utils/Constant.java b/app/src/main/java/com/casic/dcms/utils/Constant.java index d948e35..036f762 100644 --- a/app/src/main/java/com/casic/dcms/utils/Constant.java +++ b/app/src/main/java/com/casic/dcms/utils/Constant.java @@ -40,6 +40,9 @@ public static final int REQUEST_REFRESH_CODE = 9002; public static final int PAGE_LIMIT = 15; + public static final int BITRATE = 200 * 360 * 30; + public static final int DEFAULT_WIDTH = 720; + public static final int DEFAULT_HEIGHT = 1280; public static final int CASE_HANDLE = 0; public static final int CASE_VERIFY = 1; diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index c07978f..315a587 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -2,7 +2,6 @@ import android.annotation.SuppressLint; import android.content.Context; -import android.os.Environment; import android.util.Log; import java.io.File; @@ -19,6 +18,7 @@ private static File imageDir; private static File waterImageDir; private static File downloadDir; + private static File videoDir; public static void initFileConfig(Context context) { FileUtils.context = context; @@ -57,6 +57,13 @@ Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); } } + videoDir = new File(parentDir, "CompressVideoFile"); + if (!videoDir.exists()) { + boolean mkVideoDir = videoDir.mkdir(); + if (mkVideoDir) { + Log.d(TAG, "initFileConfig: 创建CompressVideoFile文件夹"); + } + } } static File getOutputAudioFile() { @@ -160,7 +167,32 @@ return downloadDir.toString(); } - public static String getVideoCompressPath() { - return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); + public static String getOutputVideoFile() { + if (videoDir == null) { + File parentDir = new File(context.getFilesDir().getAbsolutePath(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "getOutputVideoFile: 创建Casic文件夹"); + } + } + videoDir = new File(parentDir, "CompressVideoFile"); + if (!videoDir.exists()) { + boolean mkVideoDir = videoDir.mkdir(); + if (mkVideoDir) { + Log.d(TAG, "getOutputVideoFile: 创建CompressVideoFile文件夹"); + } + } + } + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); + File videoFile = new File(videoDir + File.separator + "VID_" + timeStamp + ".mp4"); + if (!videoFile.exists()) { + try { + videoFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return videoFile.getPath(); } } diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index b1adeb9..75ac52e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -1,14 +1,15 @@ package com.casic.dcms.ui; import android.annotation.SuppressLint; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; +import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -18,7 +19,6 @@ import android.widget.PopupWindow; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -47,12 +47,13 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.TimeOrDateUtil; import com.casic.dcms.utils.ToastHelper; import com.casic.dcms.widgets.VoicePlayView; -import com.iceteck.silicompressorr.SiliCompressor; +import com.google.gson.Gson; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; @@ -65,10 +66,10 @@ import com.qmuiteam.qmui.widget.popup.QMUIPopup; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import com.zolad.videoslimmer.VideoSlimmer; import java.io.File; import java.io.IOException; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ public class CaseUploadActivity extends BaseCaseActivity implements View.OnClickListener, View.OnTouchListener, ICaseLargeClassView, ICaseSmallClassView, ICaseSubmitCaseView, IUploadFileView { - private Context context = this; @BindView(R.id.caseLayout) LinearLayout caseLayout; @BindView(R.id.caseClassView) @@ -116,12 +116,15 @@ @BindView(R.id.submitButton) QMUIRoundButton submitButton; + private static final String TAG = "CaseUploadActivity"; + private Context context = this; private CaseLargeClassPresenterImpl caseLargeClassPresenter; private CaseSmallClassPresenterImpl caseSmallClassPresenter; private CaseSubmitPresenterImpl caseSubmitPresenter; private List largeClassBeans; private List smallClassBeans; - private QMUITipDialog submitDialog, qmuiTipDialog; + private QMUITipDialog submitDialog; + private ProgressDialog progressDialog; private UploadImagePresenterImpl uploadImagePresenter; private List imageList = new ArrayList<>();//服务器返回的拍照数据集 private ArrayList realPaths = new ArrayList<>();//真是图片路径 @@ -136,7 +139,6 @@ private String audioUrl, videoUrl; private AudioRecodeHelper audioRecodeHelper; private PopupWindow popWindow; - private static WeakReferenceHandler weakReferenceHandler; private boolean isFirstEnter = true; @Override @@ -156,15 +158,18 @@ caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord("提交中,请稍后") .create(); - qmuiTipDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("视频压缩中,请稍后") - .create(); - weakReferenceHandler = new WeakReferenceHandler(this); + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("视频压缩中..."); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCancelable(false); + progressDialog.setCanceledOnTouchOutside(false); + uploadImagePresenter = new UploadImagePresenterImpl(this); uploadAudioPresenter = new UploadAudioPresenterImpl(this); uploadVideoPresenter = new UploadVideoPresenterImpl(this); @@ -179,7 +184,6 @@ public void initEvent() { voiceView.setOnTouchListener(this); submitButton.setChangeAlphaWhenPress(true); - //录音相关 View view = View.inflate(this, R.layout.popu_microphone, null); int popWidth = (int) (QMUIDisplayHelper.getScreenWidth(this) * 0.35); @@ -340,6 +344,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -378,29 +383,25 @@ case PictureConfig.PREVIEW_VIDEO_CODE: LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0); //"realPath":"/storage/emulated/0/Movies/VID_20210426_17552226.mp4" + Log.d(TAG, "onActivityResult: " + new Gson().toJson(media)); //需要手动压缩视频 String mediaRealPath = media.getRealPath(); + if (TextUtils.isEmpty(mediaRealPath)) { + //部分手机getRealPath可能为空,需要备用路径 + mediaRealPath = media.getPath(); + } + if (TextUtils.isEmpty(mediaRealPath) || mediaRealPath.equals("")) { + //如果默认和备用路径还是为空,则不压缩上传 + ToastHelper.showToast("操作失败,无法获取有效的视频文件", ToastHelper.ERROR); + return; + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(mediaRealPath); + String defaultRotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + String defaultBitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - qmuiTipDialog.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - /** - * 视频压缩 - * 第一个参数:视频源文件路径 - * 第二个参数:压缩后视频保存的路径 - */ - String comPressPath = SiliCompressor.with(context).compressVideo(mediaRealPath, FileUtils.getVideoCompressPath()); - Message message = weakReferenceHandler.obtainMessage(); - message.what = 20210427; - message.obj = comPressPath; - weakReferenceHandler.sendMessage(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); + assert defaultRotation != null; + compressVideo(mediaRealPath, defaultRotation, defaultBitrate); break; case Constant.REQUEST_MAP_CODE: if (data == null) { @@ -421,27 +422,46 @@ } } - private static class WeakReferenceHandler extends Handler { - private WeakReference reference; - - private WeakReferenceHandler(CaseUploadActivity activity) { - reference = new WeakReference<>(activity); + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = Constant.DEFAULT_WIDTH / 2; + height = Constant.DEFAULT_HEIGHT / 2; + } else { + width = Constant.DEFAULT_HEIGHT / 2; + height = Constant.DEFAULT_WIDTH / 2; } - - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - CaseUploadActivity caseUploadActivity = reference.get(); - if (msg.what == 20210427) { - caseUploadActivity.qmuiTipDialog.dismiss(); - String comPressPath = (String) msg.obj; - if (!TextUtils.isEmpty(comPressPath)) { - caseUploadActivity.uploadVideoPresenter.onReadyRetrofitRequest(new File(comPressPath)); - } else { - ToastHelper.showToast("案卷视频上传失败", ToastHelper.ERROR); - } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = Constant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, Constant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); } - } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadVideoPresenter.onReadyRetrofitRequest(new File(outputVideoFile)); + } else { + ToastHelper.showToast("压缩失败", ToastHelper.ERROR); + } + progressDialog.dismiss(); + } + }); } /** @@ -614,7 +634,7 @@ videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); String completeURL = StringHelper.appendCompleteURL(videoUrl); - videoPlayerView.setUp(completeURL, ""); + videoPlayerView.setUp(completeURL, "", Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java new file mode 100644 index 0000000..10bfc1b --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java @@ -0,0 +1,332 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseCaseActivity; +import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.OtherUtils; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CaseUploadPackageActivity extends BaseCaseActivity implements View.OnClickListener, + IUploadFileView, ICaseSubmitCaseView { + + private Context context = CaseUploadPackageActivity.this; + @BindView(R.id.shopView) + TextView shopView; + @BindView(R.id.communityView) + EditText communityView; + @BindView(R.id.longitudeView) + TextView longitudeView; + @BindView(R.id.latitudeView) + TextView latitudeView; + @BindView(R.id.shopKeeperView) + EditText shopKeeperView; + @BindView(R.id.phoneNumberView) + EditText phoneNumberView; + @BindView(R.id.caseLocationView) + EditText caseLocationView; + @BindView(R.id.caseDetailEditView) + EditText caseDetailEditView; + @BindView(R.id.selectedResultView) + RecyclerView selectedResultView; + @BindView(R.id.addImageView) + ImageView addImageView; + @BindView(R.id.submitButton) + QMUIRoundButton submitButton; + + private UploadImagePresenterImpl uploadImagePresenter; + private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; + private ImageRecycleViewAdapter imageAdapter; + private QMUITipDialog submitDialog; + private ArrayList realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private String gridId, shopID; + + @Override + public int initLayoutView() { + return R.layout.activity_package; + } + + @Override + protected String setTitleName() { + return "三包上报"; + } + + @Override + public void initData() { + uploadImagePresenter = new UploadImagePresenterImpl(this); + shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + imageAdapter = new ImageRecycleViewAdapter(this); + selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); + selectedResultView.addItemDecoration(new ItemDecorationSpace()); + selectedResultView.setAdapter(imageAdapter); + } + + @Override + public void initEvent() { + submitButton.setChangeAlphaWhenPress(true); + } + + @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.shopLayout: + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", "三包上报"); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .setCanceledOnTouchOutside(false) + .create().show(); + break; + case R.id.submitButton: + submitCase(); + break; + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } + double longitude = data.getDoubleExtra("longitude", 0); + double latitude = data.getDoubleExtra("latitude", 0); + gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String shopName = data.getStringExtra("shopName"); + shopID = data.getStringExtra("shopID"); + + longitudeView.setText(String.valueOf(longitude)); + latitudeView.setText(String.valueOf(latitude)); + communityView.setText(community); + shopView.setText(shopName); + break; + default: + break; + } + } + } + + /** + * 案卷提交 + */ + private void submitCase() { + String longitude = longitudeView.getText().toString(); + String latitude = latitudeView.getText().toString(); + if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { + ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); + return; + } + String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(shopKeeper)) { + ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); + return; + } + String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(phoneNumber)) { + ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); + return; + } + if (StringHelper.isPhoneNumber(phoneNumber)) { + String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(fieldIntro)) { + ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); + return; + } + String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(description)) { + ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); + return; + } + if (imageAdapter.getItemCount() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } + shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, + "2", "1", + gridId.substring(0, 6), + gridId.substring(0, 9), + gridId.substring(0, 12), + gridId, description, fieldIntro, + StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); + } else { + ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.dismiss(); + } + + @Override + public void obtainSubmitResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); + finish(); + } else { + ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); + } + } + + @Override + public void obtainDataFail() { + ToastHelper.showToast("操作失败", ToastHelper.ERROR); + } + + @Override + public void obtainUploadAudioResult(ActionResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 2) { + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + imageAdapter.setMediaList(realPaths); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + OtherUtils.showBigImage(context, position, realPaths); + } + }); + //删除按钮点击事件 + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + mediaList.remove(position); + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } else { + ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); + } + } + } + + @Override + public void obtainUploadVideoResult(ActionResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java index 67a0340..7750f8a 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java @@ -242,6 +242,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java index e27a310..d364d7c 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -179,7 +180,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java index f0e437a..d28d4b2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -44,6 +44,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -285,7 +286,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -518,6 +519,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java deleted file mode 100644 index 1ba1d5b..0000000 --- a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java +++ /dev/null @@ -1,331 +0,0 @@ -package com.casic.dcms.ui; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.text.TextUtils; -import android.view.View; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.ImageRecycleViewAdapter; -import com.casic.dcms.base.BaseCaseActivity; -import com.casic.dcms.bean.ActionResultBean; -import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; -import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; -import com.casic.dcms.mvp.view.ICaseSubmitCaseView; -import com.casic.dcms.mvp.view.IUploadFileView; -import com.casic.dcms.utils.Constant; -import com.casic.dcms.utils.FileUtils; -import com.casic.dcms.utils.GlideLoadEngine; -import com.casic.dcms.utils.ItemDecorationSpace; -import com.casic.dcms.utils.OtherUtils; -import com.casic.dcms.utils.StringHelper; -import com.casic.dcms.utils.ToastHelper; -import com.luck.picture.lib.PictureSelector; -import com.luck.picture.lib.config.PictureConfig; -import com.luck.picture.lib.config.PictureMimeType; -import com.luck.picture.lib.entity.LocalMedia; -import com.luck.picture.lib.tools.PictureFileUtils; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; -import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.OnClick; - -public class ThreePackageUploadActivity extends BaseCaseActivity implements View.OnClickListener, - IUploadFileView, ICaseSubmitCaseView { - - private Context context = ThreePackageUploadActivity.this; - @BindView(R.id.shopView) - TextView shopView; - @BindView(R.id.communityView) - EditText communityView; - @BindView(R.id.longitudeView) - TextView longitudeView; - @BindView(R.id.latitudeView) - TextView latitudeView; - @BindView(R.id.shopKeeperView) - EditText shopKeeperView; - @BindView(R.id.phoneNumberView) - EditText phoneNumberView; - @BindView(R.id.caseLocationView) - EditText caseLocationView; - @BindView(R.id.caseDetailEditView) - EditText caseDetailEditView; - @BindView(R.id.selectedResultView) - RecyclerView selectedResultView; - @BindView(R.id.addImageView) - ImageView addImageView; - @BindView(R.id.submitButton) - QMUIRoundButton submitButton; - - private UploadImagePresenterImpl uploadImagePresenter; - private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; - private ImageRecycleViewAdapter imageAdapter; - private QMUITipDialog submitDialog; - private ArrayList realPaths = new ArrayList<>();//真是图片路径 - private List mediaList = new ArrayList<>();//上传到服务器的数据集 - private String gridId, shopID; - - @Override - public int initLayoutView() { - return R.layout.activity_package; - } - - @Override - protected String setTitleName() { - return "三包上报"; - } - - @Override - public void initData() { - uploadImagePresenter = new UploadImagePresenterImpl(this); - shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); - submitDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("提交中,请稍后") - .create(); - imageAdapter = new ImageRecycleViewAdapter(this); - selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); - selectedResultView.addItemDecoration(new ItemDecorationSpace()); - selectedResultView.setAdapter(imageAdapter); - } - - @Override - public void initEvent() { - submitButton.setChangeAlphaWhenPress(true); - } - - @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.shopLayout: - Intent intent = new Intent(this, ArcGISMapActivity.class); - intent.putExtra("type", "三包上报"); - startActivityForResult(intent, Constant.REQUEST_MAP_CODE); - break; - case R.id.addImageView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("相册中选取", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //选图 - selectPicture(); - } - }) - .addItem("相机拍照", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //拍照 - takePicture(); - } - }) - .setCanceledOnTouchOutside(false) - .create().show(); - break; - case R.id.submitButton: - submitCase(); - break; - } - } - - private void selectPicture() { - PictureSelector.create(this) - .openGallery(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(2) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.CHOOSE_REQUEST); - } - - private void takePicture() { - PictureSelector.create(this) - .openCamera(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(1) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.REQUEST_CAMERA); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK) { - switch (requestCode) { - case PictureConfig.CHOOSE_REQUEST: - List selectList = PictureSelector.obtainMultipleResult(data); - for (LocalMedia media : selectList) { - String mediaCompressPath = media.getCompressPath(); - uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); - } - break; - case PictureConfig.REQUEST_CAMERA: - LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); - uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); - break; - case Constant.REQUEST_MAP_CODE: - if (data == null) { - return; - } - double longitude = data.getDoubleExtra("longitude", 0); - double latitude = data.getDoubleExtra("latitude", 0); - gridId = data.getStringExtra("gridId"); - String community = data.getStringExtra("community"); - String shopName = data.getStringExtra("shopName"); - shopID = data.getStringExtra("shopID"); - - longitudeView.setText(String.valueOf(longitude)); - latitudeView.setText(String.valueOf(latitude)); - communityView.setText(community); - shopView.setText(shopName); - break; - default: - break; - } - } - } - - /** - * 案卷提交 - */ - private void submitCase() { - String longitude = longitudeView.getText().toString(); - String latitude = latitudeView.getText().toString(); - if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { - ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); - return; - } - String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(shopKeeper)) { - ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); - return; - } - String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(phoneNumber)) { - ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); - return; - } - if (StringHelper.isPhoneNumber(phoneNumber)) { - String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(fieldIntro)) { - ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); - return; - } - String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(description)) { - ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); - return; - } - if (imageAdapter.getItemCount() != 2) { - ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); - return; - } - shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, - "2", "1", - gridId.substring(0, 6), - gridId.substring(0, 9), - gridId.substring(0, 12), - gridId, description, fieldIntro, - StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); - } else { - ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); - } - } - - @Override - public void showProgress() { - submitDialog.show(); - } - - @Override - public void hideProgress() { - submitDialog.dismiss(); - } - - @Override - public void obtainSubmitResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); - finish(); - } else { - ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); - } - } - - @Override - public void obtainDataFail() { - ToastHelper.showToast("操作失败", ToastHelper.ERROR); - } - - @Override - public void obtainUploadAudioResult(ActionResultBean resultBean) { - - } - - @Override - public void obtainUploadImageResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - PictureFileUtils.deleteAllCacheDirFile(this); - /** - * 系统路径static拼接图片返回路径 - * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg - */ - //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg - int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 2) { - String url = resultBean.getData(); - mediaList.add(url); - realPaths.add(StringHelper.appendCompleteURL(url)); - if (realPaths.size() == 2) { - addImageView.setVisibility(View.GONE); - } - imageAdapter.setMediaList(realPaths); - //九宫格点击事件 - imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { - @Override - public void onClick(int position) { - OtherUtils.showBigImage(context, position, realPaths); - } - }); - //删除按钮点击事件 - imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { - @Override - public void onClick(int position) { - mediaList.remove(position); - realPaths.remove(position); - imageAdapter.setMediaList(realPaths); - if (realPaths.size() != 2) { - addImageView.setVisibility(View.VISIBLE); - } - } - }); - } else { - ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); - } - } - } - - @Override - public void obtainUploadVideoResult(ActionResultBean resultBean) { - - } -} diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java index 2ae9aa6..5dcf237 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java @@ -24,13 +24,13 @@ import com.casic.dcms.ui.CaseOnMapActivity; import com.casic.dcms.ui.CaseSearchActivity; import com.casic.dcms.ui.CaseUploadActivity; +import com.casic.dcms.ui.CaseUploadPackageActivity; import com.casic.dcms.ui.CaseUploadQuicklyActivity; import com.casic.dcms.ui.CaseVerifyActivity; import com.casic.dcms.ui.DataAnalysisActivity; import com.casic.dcms.ui.OvertimeCaseActivity; import com.casic.dcms.ui.PersonOnlineActivity; import com.casic.dcms.ui.PublicToiletActivity; -import com.casic.dcms.ui.ThreePackageUploadActivity; import com.casic.dcms.ui.UrgentCaseActivity; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -119,7 +119,7 @@ intent.setClass(context, CaseUploadQuicklyActivity.class); break; case "三包上报": - intent.setClass(context, ThreePackageUploadActivity.class); + intent.setClass(context, CaseUploadPackageActivity.class); break; case "案卷核实": intent.setClass(context, CaseVerifyActivity.class); diff --git a/app/src/main/java/com/casic/dcms/utils/Constant.java b/app/src/main/java/com/casic/dcms/utils/Constant.java index d948e35..036f762 100644 --- a/app/src/main/java/com/casic/dcms/utils/Constant.java +++ b/app/src/main/java/com/casic/dcms/utils/Constant.java @@ -40,6 +40,9 @@ public static final int REQUEST_REFRESH_CODE = 9002; public static final int PAGE_LIMIT = 15; + public static final int BITRATE = 200 * 360 * 30; + public static final int DEFAULT_WIDTH = 720; + public static final int DEFAULT_HEIGHT = 1280; public static final int CASE_HANDLE = 0; public static final int CASE_VERIFY = 1; diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index c07978f..315a587 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -2,7 +2,6 @@ import android.annotation.SuppressLint; import android.content.Context; -import android.os.Environment; import android.util.Log; import java.io.File; @@ -19,6 +18,7 @@ private static File imageDir; private static File waterImageDir; private static File downloadDir; + private static File videoDir; public static void initFileConfig(Context context) { FileUtils.context = context; @@ -57,6 +57,13 @@ Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); } } + videoDir = new File(parentDir, "CompressVideoFile"); + if (!videoDir.exists()) { + boolean mkVideoDir = videoDir.mkdir(); + if (mkVideoDir) { + Log.d(TAG, "initFileConfig: 创建CompressVideoFile文件夹"); + } + } } static File getOutputAudioFile() { @@ -160,7 +167,32 @@ return downloadDir.toString(); } - public static String getVideoCompressPath() { - return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); + public static String getOutputVideoFile() { + if (videoDir == null) { + File parentDir = new File(context.getFilesDir().getAbsolutePath(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "getOutputVideoFile: 创建Casic文件夹"); + } + } + videoDir = new File(parentDir, "CompressVideoFile"); + if (!videoDir.exists()) { + boolean mkVideoDir = videoDir.mkdir(); + if (mkVideoDir) { + Log.d(TAG, "getOutputVideoFile: 创建CompressVideoFile文件夹"); + } + } + } + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); + File videoFile = new File(videoDir + File.separator + "VID_" + timeStamp + ".mp4"); + if (!videoFile.exists()) { + try { + videoFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return videoFile.getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java b/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java new file mode 100644 index 0000000..b82c57d --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java @@ -0,0 +1,320 @@ +package com.casic.dcms.utils; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.net.Uri; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; +import android.view.Surface; + +import com.casic.dcms.R; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.DefaultLoadControl; +import com.google.android.exoplayer2.DefaultRenderersFactory; +import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.LoadControl; +import com.google.android.exoplayer2.PlaybackParameters; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.RenderersFactory; +import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.source.MediaSource; +import com.google.android.exoplayer2.source.ProgressiveMediaSource; +import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.source.hls.HlsMediaSource; +import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; +import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.trackselection.TrackSelector; +import com.google.android.exoplayer2.upstream.BandwidthMeter; +import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DefaultAllocator; +import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; +import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.util.Util; +import com.google.android.exoplayer2.video.VideoListener; + +import org.jetbrains.annotations.NotNull; + +import cn.jzvd.JZMediaInterface; +import cn.jzvd.Jzvd; + +public class JzExoMedia extends JZMediaInterface implements Player.EventListener, VideoListener { + + private static final String TAG = "JzExoMedia"; + private SimpleExoPlayer simpleExoPlayer; + private long previousSeek = 0; + private Runnable callback; + + public JzExoMedia(Jzvd jzvd) { + super(jzvd); + } + + @Override + public void start() { + simpleExoPlayer.setPlayWhenReady(true); + } + + @Override + public void prepare() { + Context context = jzvd.getContext(); + release(); + mMediaHandlerThread = new HandlerThread("JZVD"); + mMediaHandlerThread.start(); + mMediaHandler = new Handler(context.getMainLooper());//主线程还是非主线程,就在这里 + handler = new Handler(); + mMediaHandler.post(() -> { + AdaptiveTrackSelection.Factory factory = new AdaptiveTrackSelection.Factory(); + TrackSelector trackSelector = new DefaultTrackSelector(context, factory); + + LoadControl loadControl = new DefaultLoadControl.Builder() + .setAllocator(new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE)) + .setBufferDurationsMs(360000, 600000, 1000, 5000) + .setPrioritizeTimeOverSizeThresholds(false) + .setTargetBufferBytes(C.LENGTH_UNSET) + .createDefaultLoadControl(); + + BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder(context).build(); + // 2. Create the player + + RenderersFactory renderersFactory = new DefaultRenderersFactory(context); + simpleExoPlayer = new SimpleExoPlayer.Builder(context, renderersFactory) + .setTrackSelector(trackSelector) + .setLoadControl(loadControl) + .setBandwidthMeter(bandwidthMeter) + .build(); + // Produces DataSource instances through which media data is loaded. + DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, + Util.getUserAgent(context, context.getResources().getString(R.string.app_name))); + + String currUrl = jzvd.jzDataSource.getCurrentUrl().toString(); + MediaSource videoSource; + if (currUrl.contains(".m3u8")) { + videoSource = new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(currUrl)); + //addEventListener 这里只有两个参数都要传入值才可以成功设置 + // 否者会被断言 Assertions.checkArgument(handler != null && eventListener != null); + // 并且报错 IllegalArgumentException() 所以不需要添加监听器时 注释掉 + // videoSource .addEventListener( handler, null); + } else { + videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(currUrl)); + } + simpleExoPlayer.addVideoListener(this); + Log.e(TAG, "URL Link = " + currUrl); + + simpleExoPlayer.addListener(this); + boolean isLoop = jzvd.jzDataSource.looping; + if (isLoop) { + simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_ONE); + } else { + simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_OFF); + } + simpleExoPlayer.prepare(videoSource); + simpleExoPlayer.setPlayWhenReady(true); + callback = new onBufferingUpdate(); + if (jzvd.textureView != null) { + SurfaceTexture surfaceTexture = jzvd.textureView.getSurfaceTexture(); + if (surfaceTexture != null) { + simpleExoPlayer.setVideoSurface(new Surface(surfaceTexture)); + } + } + }); + } + + @Override + public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) { + handler.post(() -> jzvd.onVideoSizeChanged((int) (width * pixelWidthHeightRatio), height)); + } + + @Override + public void onRenderedFirstFrame() { + + } + + @Override + public void pause() { + simpleExoPlayer.setPlayWhenReady(false); + } + + @Override + public boolean isPlaying() { + return simpleExoPlayer.getPlayWhenReady(); + } + + @Override + public void seekTo(long time) { + if (simpleExoPlayer == null) { + return; + } + if (time != previousSeek) { + if (time >= simpleExoPlayer.getBufferedPosition()) { + jzvd.onStatePreparingPlaying(); + } + simpleExoPlayer.seekTo(time); + previousSeek = time; + jzvd.seekToInAdvance = time; + } + } + + @Override + public void release() { + if (mMediaHandler != null && mMediaHandlerThread != null && simpleExoPlayer != null) { + HandlerThread tmpHandlerThread = mMediaHandlerThread; + SimpleExoPlayer tmpMediaPlayer = simpleExoPlayer; + JZMediaInterface.SAVED_SURFACE = null; + mMediaHandler.post(() -> { + tmpMediaPlayer.release();//release就不能放到主线程里,界面会卡顿 + tmpHandlerThread.quit(); + }); + simpleExoPlayer = null; + } + } + + @Override + public long getCurrentPosition() { + if (simpleExoPlayer != null) + return simpleExoPlayer.getCurrentPosition(); + else return 0; + } + + @Override + public long getDuration() { + if (simpleExoPlayer != null) + return simpleExoPlayer.getDuration(); + else return 0; + } + + @Override + public void setVolume(float leftVolume, float rightVolume) { + simpleExoPlayer.setVolume(leftVolume); + simpleExoPlayer.setVolume(rightVolume); + } + + @Override + public void setSpeed(float speed) { + PlaybackParameters playbackParameters = new PlaybackParameters(speed, 1.0F); + simpleExoPlayer.setPlaybackParameters(playbackParameters); + } + + @Override + public void onTimelineChanged(final Timeline timeline, Object manifest, final int reason) { + + } + + @Override + public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { + + } + + @Override + public void onLoadingChanged(boolean isLoading) { + + } + + @Override + public void onPlayerStateChanged(final boolean playWhenReady, final int playbackState) { + Log.e(TAG, "onPlayerStateChanged" + playbackState + "/ready=" + playWhenReady); + handler.post(() -> { + switch (playbackState) { + case Player.STATE_IDLE: { + } + break; + case Player.STATE_BUFFERING: { + jzvd.onStatePreparingPlaying(); + handler.post(callback); + } + break; + case Player.STATE_READY: { + if (playWhenReady) { + jzvd.onStatePlaying(); + } + } + break; + case Player.STATE_ENDED: { + jzvd.onCompletion(); + } + break; + } + }); + } + + @Override + public void onRepeatModeChanged(int repeatMode) { + + } + + @Override + public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { + + } + + @Override + public void onPlayerError(ExoPlaybackException error) { + Log.e(TAG, "onPlayerError" + error.toString()); + handler.post(() -> jzvd.onError(1000, 1000)); + } + + @Override + public void onPositionDiscontinuity(int reason) { + + } + + @Override + public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { + + } + + @Override + public void onSeekProcessed() { + handler.post(() -> jzvd.onSeekComplete()); + } + + @Override + public void setSurface(Surface surface) { + if (simpleExoPlayer != null) { + simpleExoPlayer.setVideoSurface(surface); + } else { + Log.e("AGVideo", "simpleExoPlayer为空"); + } + } + + @Override + public void onSurfaceTextureAvailable(@NotNull SurfaceTexture surface, int width, int height) { + if (SAVED_SURFACE == null) { + SAVED_SURFACE = surface; + prepare(); + } else { + jzvd.textureView.setSurfaceTexture(SAVED_SURFACE); + } + } + + @Override + public void onSurfaceTextureSizeChanged(@NotNull SurfaceTexture surface, int width, int height) { + + } + + @Override + public boolean onSurfaceTextureDestroyed(@NotNull SurfaceTexture surface) { + return false; + } + + @Override + public void onSurfaceTextureUpdated(@NotNull SurfaceTexture surface) { + + } + + private class onBufferingUpdate implements Runnable { + @Override + public void run() { + if (simpleExoPlayer != null) { + final int percent = simpleExoPlayer.getBufferedPercentage(); + handler.post(() -> jzvd.setBufferProgress(percent)); + if (percent < 100) { + handler.postDelayed(callback, 300); + } else { + handler.removeCallbacks(callback); + } + } + } + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index b1adeb9..75ac52e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -1,14 +1,15 @@ package com.casic.dcms.ui; import android.annotation.SuppressLint; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; +import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -18,7 +19,6 @@ import android.widget.PopupWindow; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -47,12 +47,13 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.TimeOrDateUtil; import com.casic.dcms.utils.ToastHelper; import com.casic.dcms.widgets.VoicePlayView; -import com.iceteck.silicompressorr.SiliCompressor; +import com.google.gson.Gson; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; @@ -65,10 +66,10 @@ import com.qmuiteam.qmui.widget.popup.QMUIPopup; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import com.zolad.videoslimmer.VideoSlimmer; import java.io.File; import java.io.IOException; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ public class CaseUploadActivity extends BaseCaseActivity implements View.OnClickListener, View.OnTouchListener, ICaseLargeClassView, ICaseSmallClassView, ICaseSubmitCaseView, IUploadFileView { - private Context context = this; @BindView(R.id.caseLayout) LinearLayout caseLayout; @BindView(R.id.caseClassView) @@ -116,12 +116,15 @@ @BindView(R.id.submitButton) QMUIRoundButton submitButton; + private static final String TAG = "CaseUploadActivity"; + private Context context = this; private CaseLargeClassPresenterImpl caseLargeClassPresenter; private CaseSmallClassPresenterImpl caseSmallClassPresenter; private CaseSubmitPresenterImpl caseSubmitPresenter; private List largeClassBeans; private List smallClassBeans; - private QMUITipDialog submitDialog, qmuiTipDialog; + private QMUITipDialog submitDialog; + private ProgressDialog progressDialog; private UploadImagePresenterImpl uploadImagePresenter; private List imageList = new ArrayList<>();//服务器返回的拍照数据集 private ArrayList realPaths = new ArrayList<>();//真是图片路径 @@ -136,7 +139,6 @@ private String audioUrl, videoUrl; private AudioRecodeHelper audioRecodeHelper; private PopupWindow popWindow; - private static WeakReferenceHandler weakReferenceHandler; private boolean isFirstEnter = true; @Override @@ -156,15 +158,18 @@ caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord("提交中,请稍后") .create(); - qmuiTipDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("视频压缩中,请稍后") - .create(); - weakReferenceHandler = new WeakReferenceHandler(this); + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("视频压缩中..."); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCancelable(false); + progressDialog.setCanceledOnTouchOutside(false); + uploadImagePresenter = new UploadImagePresenterImpl(this); uploadAudioPresenter = new UploadAudioPresenterImpl(this); uploadVideoPresenter = new UploadVideoPresenterImpl(this); @@ -179,7 +184,6 @@ public void initEvent() { voiceView.setOnTouchListener(this); submitButton.setChangeAlphaWhenPress(true); - //录音相关 View view = View.inflate(this, R.layout.popu_microphone, null); int popWidth = (int) (QMUIDisplayHelper.getScreenWidth(this) * 0.35); @@ -340,6 +344,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -378,29 +383,25 @@ case PictureConfig.PREVIEW_VIDEO_CODE: LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0); //"realPath":"/storage/emulated/0/Movies/VID_20210426_17552226.mp4" + Log.d(TAG, "onActivityResult: " + new Gson().toJson(media)); //需要手动压缩视频 String mediaRealPath = media.getRealPath(); + if (TextUtils.isEmpty(mediaRealPath)) { + //部分手机getRealPath可能为空,需要备用路径 + mediaRealPath = media.getPath(); + } + if (TextUtils.isEmpty(mediaRealPath) || mediaRealPath.equals("")) { + //如果默认和备用路径还是为空,则不压缩上传 + ToastHelper.showToast("操作失败,无法获取有效的视频文件", ToastHelper.ERROR); + return; + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(mediaRealPath); + String defaultRotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + String defaultBitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - qmuiTipDialog.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - /** - * 视频压缩 - * 第一个参数:视频源文件路径 - * 第二个参数:压缩后视频保存的路径 - */ - String comPressPath = SiliCompressor.with(context).compressVideo(mediaRealPath, FileUtils.getVideoCompressPath()); - Message message = weakReferenceHandler.obtainMessage(); - message.what = 20210427; - message.obj = comPressPath; - weakReferenceHandler.sendMessage(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); + assert defaultRotation != null; + compressVideo(mediaRealPath, defaultRotation, defaultBitrate); break; case Constant.REQUEST_MAP_CODE: if (data == null) { @@ -421,27 +422,46 @@ } } - private static class WeakReferenceHandler extends Handler { - private WeakReference reference; - - private WeakReferenceHandler(CaseUploadActivity activity) { - reference = new WeakReference<>(activity); + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = Constant.DEFAULT_WIDTH / 2; + height = Constant.DEFAULT_HEIGHT / 2; + } else { + width = Constant.DEFAULT_HEIGHT / 2; + height = Constant.DEFAULT_WIDTH / 2; } - - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - CaseUploadActivity caseUploadActivity = reference.get(); - if (msg.what == 20210427) { - caseUploadActivity.qmuiTipDialog.dismiss(); - String comPressPath = (String) msg.obj; - if (!TextUtils.isEmpty(comPressPath)) { - caseUploadActivity.uploadVideoPresenter.onReadyRetrofitRequest(new File(comPressPath)); - } else { - ToastHelper.showToast("案卷视频上传失败", ToastHelper.ERROR); - } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = Constant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, Constant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); } - } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadVideoPresenter.onReadyRetrofitRequest(new File(outputVideoFile)); + } else { + ToastHelper.showToast("压缩失败", ToastHelper.ERROR); + } + progressDialog.dismiss(); + } + }); } /** @@ -614,7 +634,7 @@ videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); String completeURL = StringHelper.appendCompleteURL(videoUrl); - videoPlayerView.setUp(completeURL, ""); + videoPlayerView.setUp(completeURL, "", Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java new file mode 100644 index 0000000..10bfc1b --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java @@ -0,0 +1,332 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseCaseActivity; +import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.OtherUtils; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CaseUploadPackageActivity extends BaseCaseActivity implements View.OnClickListener, + IUploadFileView, ICaseSubmitCaseView { + + private Context context = CaseUploadPackageActivity.this; + @BindView(R.id.shopView) + TextView shopView; + @BindView(R.id.communityView) + EditText communityView; + @BindView(R.id.longitudeView) + TextView longitudeView; + @BindView(R.id.latitudeView) + TextView latitudeView; + @BindView(R.id.shopKeeperView) + EditText shopKeeperView; + @BindView(R.id.phoneNumberView) + EditText phoneNumberView; + @BindView(R.id.caseLocationView) + EditText caseLocationView; + @BindView(R.id.caseDetailEditView) + EditText caseDetailEditView; + @BindView(R.id.selectedResultView) + RecyclerView selectedResultView; + @BindView(R.id.addImageView) + ImageView addImageView; + @BindView(R.id.submitButton) + QMUIRoundButton submitButton; + + private UploadImagePresenterImpl uploadImagePresenter; + private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; + private ImageRecycleViewAdapter imageAdapter; + private QMUITipDialog submitDialog; + private ArrayList realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private String gridId, shopID; + + @Override + public int initLayoutView() { + return R.layout.activity_package; + } + + @Override + protected String setTitleName() { + return "三包上报"; + } + + @Override + public void initData() { + uploadImagePresenter = new UploadImagePresenterImpl(this); + shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + imageAdapter = new ImageRecycleViewAdapter(this); + selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); + selectedResultView.addItemDecoration(new ItemDecorationSpace()); + selectedResultView.setAdapter(imageAdapter); + } + + @Override + public void initEvent() { + submitButton.setChangeAlphaWhenPress(true); + } + + @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.shopLayout: + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", "三包上报"); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .setCanceledOnTouchOutside(false) + .create().show(); + break; + case R.id.submitButton: + submitCase(); + break; + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } + double longitude = data.getDoubleExtra("longitude", 0); + double latitude = data.getDoubleExtra("latitude", 0); + gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String shopName = data.getStringExtra("shopName"); + shopID = data.getStringExtra("shopID"); + + longitudeView.setText(String.valueOf(longitude)); + latitudeView.setText(String.valueOf(latitude)); + communityView.setText(community); + shopView.setText(shopName); + break; + default: + break; + } + } + } + + /** + * 案卷提交 + */ + private void submitCase() { + String longitude = longitudeView.getText().toString(); + String latitude = latitudeView.getText().toString(); + if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { + ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); + return; + } + String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(shopKeeper)) { + ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); + return; + } + String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(phoneNumber)) { + ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); + return; + } + if (StringHelper.isPhoneNumber(phoneNumber)) { + String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(fieldIntro)) { + ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); + return; + } + String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(description)) { + ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); + return; + } + if (imageAdapter.getItemCount() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } + shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, + "2", "1", + gridId.substring(0, 6), + gridId.substring(0, 9), + gridId.substring(0, 12), + gridId, description, fieldIntro, + StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); + } else { + ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.dismiss(); + } + + @Override + public void obtainSubmitResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); + finish(); + } else { + ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); + } + } + + @Override + public void obtainDataFail() { + ToastHelper.showToast("操作失败", ToastHelper.ERROR); + } + + @Override + public void obtainUploadAudioResult(ActionResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 2) { + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + imageAdapter.setMediaList(realPaths); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + OtherUtils.showBigImage(context, position, realPaths); + } + }); + //删除按钮点击事件 + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + mediaList.remove(position); + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } else { + ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); + } + } + } + + @Override + public void obtainUploadVideoResult(ActionResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java index 67a0340..7750f8a 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java @@ -242,6 +242,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java index e27a310..d364d7c 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -179,7 +180,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java index f0e437a..d28d4b2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -44,6 +44,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -285,7 +286,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -518,6 +519,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java deleted file mode 100644 index 1ba1d5b..0000000 --- a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java +++ /dev/null @@ -1,331 +0,0 @@ -package com.casic.dcms.ui; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.text.TextUtils; -import android.view.View; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.ImageRecycleViewAdapter; -import com.casic.dcms.base.BaseCaseActivity; -import com.casic.dcms.bean.ActionResultBean; -import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; -import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; -import com.casic.dcms.mvp.view.ICaseSubmitCaseView; -import com.casic.dcms.mvp.view.IUploadFileView; -import com.casic.dcms.utils.Constant; -import com.casic.dcms.utils.FileUtils; -import com.casic.dcms.utils.GlideLoadEngine; -import com.casic.dcms.utils.ItemDecorationSpace; -import com.casic.dcms.utils.OtherUtils; -import com.casic.dcms.utils.StringHelper; -import com.casic.dcms.utils.ToastHelper; -import com.luck.picture.lib.PictureSelector; -import com.luck.picture.lib.config.PictureConfig; -import com.luck.picture.lib.config.PictureMimeType; -import com.luck.picture.lib.entity.LocalMedia; -import com.luck.picture.lib.tools.PictureFileUtils; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; -import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.OnClick; - -public class ThreePackageUploadActivity extends BaseCaseActivity implements View.OnClickListener, - IUploadFileView, ICaseSubmitCaseView { - - private Context context = ThreePackageUploadActivity.this; - @BindView(R.id.shopView) - TextView shopView; - @BindView(R.id.communityView) - EditText communityView; - @BindView(R.id.longitudeView) - TextView longitudeView; - @BindView(R.id.latitudeView) - TextView latitudeView; - @BindView(R.id.shopKeeperView) - EditText shopKeeperView; - @BindView(R.id.phoneNumberView) - EditText phoneNumberView; - @BindView(R.id.caseLocationView) - EditText caseLocationView; - @BindView(R.id.caseDetailEditView) - EditText caseDetailEditView; - @BindView(R.id.selectedResultView) - RecyclerView selectedResultView; - @BindView(R.id.addImageView) - ImageView addImageView; - @BindView(R.id.submitButton) - QMUIRoundButton submitButton; - - private UploadImagePresenterImpl uploadImagePresenter; - private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; - private ImageRecycleViewAdapter imageAdapter; - private QMUITipDialog submitDialog; - private ArrayList realPaths = new ArrayList<>();//真是图片路径 - private List mediaList = new ArrayList<>();//上传到服务器的数据集 - private String gridId, shopID; - - @Override - public int initLayoutView() { - return R.layout.activity_package; - } - - @Override - protected String setTitleName() { - return "三包上报"; - } - - @Override - public void initData() { - uploadImagePresenter = new UploadImagePresenterImpl(this); - shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); - submitDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("提交中,请稍后") - .create(); - imageAdapter = new ImageRecycleViewAdapter(this); - selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); - selectedResultView.addItemDecoration(new ItemDecorationSpace()); - selectedResultView.setAdapter(imageAdapter); - } - - @Override - public void initEvent() { - submitButton.setChangeAlphaWhenPress(true); - } - - @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.shopLayout: - Intent intent = new Intent(this, ArcGISMapActivity.class); - intent.putExtra("type", "三包上报"); - startActivityForResult(intent, Constant.REQUEST_MAP_CODE); - break; - case R.id.addImageView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("相册中选取", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //选图 - selectPicture(); - } - }) - .addItem("相机拍照", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //拍照 - takePicture(); - } - }) - .setCanceledOnTouchOutside(false) - .create().show(); - break; - case R.id.submitButton: - submitCase(); - break; - } - } - - private void selectPicture() { - PictureSelector.create(this) - .openGallery(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(2) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.CHOOSE_REQUEST); - } - - private void takePicture() { - PictureSelector.create(this) - .openCamera(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(1) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.REQUEST_CAMERA); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK) { - switch (requestCode) { - case PictureConfig.CHOOSE_REQUEST: - List selectList = PictureSelector.obtainMultipleResult(data); - for (LocalMedia media : selectList) { - String mediaCompressPath = media.getCompressPath(); - uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); - } - break; - case PictureConfig.REQUEST_CAMERA: - LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); - uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); - break; - case Constant.REQUEST_MAP_CODE: - if (data == null) { - return; - } - double longitude = data.getDoubleExtra("longitude", 0); - double latitude = data.getDoubleExtra("latitude", 0); - gridId = data.getStringExtra("gridId"); - String community = data.getStringExtra("community"); - String shopName = data.getStringExtra("shopName"); - shopID = data.getStringExtra("shopID"); - - longitudeView.setText(String.valueOf(longitude)); - latitudeView.setText(String.valueOf(latitude)); - communityView.setText(community); - shopView.setText(shopName); - break; - default: - break; - } - } - } - - /** - * 案卷提交 - */ - private void submitCase() { - String longitude = longitudeView.getText().toString(); - String latitude = latitudeView.getText().toString(); - if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { - ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); - return; - } - String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(shopKeeper)) { - ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); - return; - } - String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(phoneNumber)) { - ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); - return; - } - if (StringHelper.isPhoneNumber(phoneNumber)) { - String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(fieldIntro)) { - ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); - return; - } - String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(description)) { - ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); - return; - } - if (imageAdapter.getItemCount() != 2) { - ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); - return; - } - shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, - "2", "1", - gridId.substring(0, 6), - gridId.substring(0, 9), - gridId.substring(0, 12), - gridId, description, fieldIntro, - StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); - } else { - ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); - } - } - - @Override - public void showProgress() { - submitDialog.show(); - } - - @Override - public void hideProgress() { - submitDialog.dismiss(); - } - - @Override - public void obtainSubmitResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); - finish(); - } else { - ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); - } - } - - @Override - public void obtainDataFail() { - ToastHelper.showToast("操作失败", ToastHelper.ERROR); - } - - @Override - public void obtainUploadAudioResult(ActionResultBean resultBean) { - - } - - @Override - public void obtainUploadImageResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - PictureFileUtils.deleteAllCacheDirFile(this); - /** - * 系统路径static拼接图片返回路径 - * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg - */ - //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg - int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 2) { - String url = resultBean.getData(); - mediaList.add(url); - realPaths.add(StringHelper.appendCompleteURL(url)); - if (realPaths.size() == 2) { - addImageView.setVisibility(View.GONE); - } - imageAdapter.setMediaList(realPaths); - //九宫格点击事件 - imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { - @Override - public void onClick(int position) { - OtherUtils.showBigImage(context, position, realPaths); - } - }); - //删除按钮点击事件 - imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { - @Override - public void onClick(int position) { - mediaList.remove(position); - realPaths.remove(position); - imageAdapter.setMediaList(realPaths); - if (realPaths.size() != 2) { - addImageView.setVisibility(View.VISIBLE); - } - } - }); - } else { - ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); - } - } - } - - @Override - public void obtainUploadVideoResult(ActionResultBean resultBean) { - - } -} diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java index 2ae9aa6..5dcf237 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java @@ -24,13 +24,13 @@ import com.casic.dcms.ui.CaseOnMapActivity; import com.casic.dcms.ui.CaseSearchActivity; import com.casic.dcms.ui.CaseUploadActivity; +import com.casic.dcms.ui.CaseUploadPackageActivity; import com.casic.dcms.ui.CaseUploadQuicklyActivity; import com.casic.dcms.ui.CaseVerifyActivity; import com.casic.dcms.ui.DataAnalysisActivity; import com.casic.dcms.ui.OvertimeCaseActivity; import com.casic.dcms.ui.PersonOnlineActivity; import com.casic.dcms.ui.PublicToiletActivity; -import com.casic.dcms.ui.ThreePackageUploadActivity; import com.casic.dcms.ui.UrgentCaseActivity; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -119,7 +119,7 @@ intent.setClass(context, CaseUploadQuicklyActivity.class); break; case "三包上报": - intent.setClass(context, ThreePackageUploadActivity.class); + intent.setClass(context, CaseUploadPackageActivity.class); break; case "案卷核实": intent.setClass(context, CaseVerifyActivity.class); diff --git a/app/src/main/java/com/casic/dcms/utils/Constant.java b/app/src/main/java/com/casic/dcms/utils/Constant.java index d948e35..036f762 100644 --- a/app/src/main/java/com/casic/dcms/utils/Constant.java +++ b/app/src/main/java/com/casic/dcms/utils/Constant.java @@ -40,6 +40,9 @@ public static final int REQUEST_REFRESH_CODE = 9002; public static final int PAGE_LIMIT = 15; + public static final int BITRATE = 200 * 360 * 30; + public static final int DEFAULT_WIDTH = 720; + public static final int DEFAULT_HEIGHT = 1280; public static final int CASE_HANDLE = 0; public static final int CASE_VERIFY = 1; diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index c07978f..315a587 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -2,7 +2,6 @@ import android.annotation.SuppressLint; import android.content.Context; -import android.os.Environment; import android.util.Log; import java.io.File; @@ -19,6 +18,7 @@ private static File imageDir; private static File waterImageDir; private static File downloadDir; + private static File videoDir; public static void initFileConfig(Context context) { FileUtils.context = context; @@ -57,6 +57,13 @@ Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); } } + videoDir = new File(parentDir, "CompressVideoFile"); + if (!videoDir.exists()) { + boolean mkVideoDir = videoDir.mkdir(); + if (mkVideoDir) { + Log.d(TAG, "initFileConfig: 创建CompressVideoFile文件夹"); + } + } } static File getOutputAudioFile() { @@ -160,7 +167,32 @@ return downloadDir.toString(); } - public static String getVideoCompressPath() { - return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); + public static String getOutputVideoFile() { + if (videoDir == null) { + File parentDir = new File(context.getFilesDir().getAbsolutePath(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "getOutputVideoFile: 创建Casic文件夹"); + } + } + videoDir = new File(parentDir, "CompressVideoFile"); + if (!videoDir.exists()) { + boolean mkVideoDir = videoDir.mkdir(); + if (mkVideoDir) { + Log.d(TAG, "getOutputVideoFile: 创建CompressVideoFile文件夹"); + } + } + } + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); + File videoFile = new File(videoDir + File.separator + "VID_" + timeStamp + ".mp4"); + if (!videoFile.exists()) { + try { + videoFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return videoFile.getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java b/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java new file mode 100644 index 0000000..b82c57d --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java @@ -0,0 +1,320 @@ +package com.casic.dcms.utils; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.net.Uri; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; +import android.view.Surface; + +import com.casic.dcms.R; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.DefaultLoadControl; +import com.google.android.exoplayer2.DefaultRenderersFactory; +import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.LoadControl; +import com.google.android.exoplayer2.PlaybackParameters; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.RenderersFactory; +import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.source.MediaSource; +import com.google.android.exoplayer2.source.ProgressiveMediaSource; +import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.source.hls.HlsMediaSource; +import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; +import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.trackselection.TrackSelector; +import com.google.android.exoplayer2.upstream.BandwidthMeter; +import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DefaultAllocator; +import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; +import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.util.Util; +import com.google.android.exoplayer2.video.VideoListener; + +import org.jetbrains.annotations.NotNull; + +import cn.jzvd.JZMediaInterface; +import cn.jzvd.Jzvd; + +public class JzExoMedia extends JZMediaInterface implements Player.EventListener, VideoListener { + + private static final String TAG = "JzExoMedia"; + private SimpleExoPlayer simpleExoPlayer; + private long previousSeek = 0; + private Runnable callback; + + public JzExoMedia(Jzvd jzvd) { + super(jzvd); + } + + @Override + public void start() { + simpleExoPlayer.setPlayWhenReady(true); + } + + @Override + public void prepare() { + Context context = jzvd.getContext(); + release(); + mMediaHandlerThread = new HandlerThread("JZVD"); + mMediaHandlerThread.start(); + mMediaHandler = new Handler(context.getMainLooper());//主线程还是非主线程,就在这里 + handler = new Handler(); + mMediaHandler.post(() -> { + AdaptiveTrackSelection.Factory factory = new AdaptiveTrackSelection.Factory(); + TrackSelector trackSelector = new DefaultTrackSelector(context, factory); + + LoadControl loadControl = new DefaultLoadControl.Builder() + .setAllocator(new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE)) + .setBufferDurationsMs(360000, 600000, 1000, 5000) + .setPrioritizeTimeOverSizeThresholds(false) + .setTargetBufferBytes(C.LENGTH_UNSET) + .createDefaultLoadControl(); + + BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder(context).build(); + // 2. Create the player + + RenderersFactory renderersFactory = new DefaultRenderersFactory(context); + simpleExoPlayer = new SimpleExoPlayer.Builder(context, renderersFactory) + .setTrackSelector(trackSelector) + .setLoadControl(loadControl) + .setBandwidthMeter(bandwidthMeter) + .build(); + // Produces DataSource instances through which media data is loaded. + DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, + Util.getUserAgent(context, context.getResources().getString(R.string.app_name))); + + String currUrl = jzvd.jzDataSource.getCurrentUrl().toString(); + MediaSource videoSource; + if (currUrl.contains(".m3u8")) { + videoSource = new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(currUrl)); + //addEventListener 这里只有两个参数都要传入值才可以成功设置 + // 否者会被断言 Assertions.checkArgument(handler != null && eventListener != null); + // 并且报错 IllegalArgumentException() 所以不需要添加监听器时 注释掉 + // videoSource .addEventListener( handler, null); + } else { + videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(currUrl)); + } + simpleExoPlayer.addVideoListener(this); + Log.e(TAG, "URL Link = " + currUrl); + + simpleExoPlayer.addListener(this); + boolean isLoop = jzvd.jzDataSource.looping; + if (isLoop) { + simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_ONE); + } else { + simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_OFF); + } + simpleExoPlayer.prepare(videoSource); + simpleExoPlayer.setPlayWhenReady(true); + callback = new onBufferingUpdate(); + if (jzvd.textureView != null) { + SurfaceTexture surfaceTexture = jzvd.textureView.getSurfaceTexture(); + if (surfaceTexture != null) { + simpleExoPlayer.setVideoSurface(new Surface(surfaceTexture)); + } + } + }); + } + + @Override + public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) { + handler.post(() -> jzvd.onVideoSizeChanged((int) (width * pixelWidthHeightRatio), height)); + } + + @Override + public void onRenderedFirstFrame() { + + } + + @Override + public void pause() { + simpleExoPlayer.setPlayWhenReady(false); + } + + @Override + public boolean isPlaying() { + return simpleExoPlayer.getPlayWhenReady(); + } + + @Override + public void seekTo(long time) { + if (simpleExoPlayer == null) { + return; + } + if (time != previousSeek) { + if (time >= simpleExoPlayer.getBufferedPosition()) { + jzvd.onStatePreparingPlaying(); + } + simpleExoPlayer.seekTo(time); + previousSeek = time; + jzvd.seekToInAdvance = time; + } + } + + @Override + public void release() { + if (mMediaHandler != null && mMediaHandlerThread != null && simpleExoPlayer != null) { + HandlerThread tmpHandlerThread = mMediaHandlerThread; + SimpleExoPlayer tmpMediaPlayer = simpleExoPlayer; + JZMediaInterface.SAVED_SURFACE = null; + mMediaHandler.post(() -> { + tmpMediaPlayer.release();//release就不能放到主线程里,界面会卡顿 + tmpHandlerThread.quit(); + }); + simpleExoPlayer = null; + } + } + + @Override + public long getCurrentPosition() { + if (simpleExoPlayer != null) + return simpleExoPlayer.getCurrentPosition(); + else return 0; + } + + @Override + public long getDuration() { + if (simpleExoPlayer != null) + return simpleExoPlayer.getDuration(); + else return 0; + } + + @Override + public void setVolume(float leftVolume, float rightVolume) { + simpleExoPlayer.setVolume(leftVolume); + simpleExoPlayer.setVolume(rightVolume); + } + + @Override + public void setSpeed(float speed) { + PlaybackParameters playbackParameters = new PlaybackParameters(speed, 1.0F); + simpleExoPlayer.setPlaybackParameters(playbackParameters); + } + + @Override + public void onTimelineChanged(final Timeline timeline, Object manifest, final int reason) { + + } + + @Override + public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { + + } + + @Override + public void onLoadingChanged(boolean isLoading) { + + } + + @Override + public void onPlayerStateChanged(final boolean playWhenReady, final int playbackState) { + Log.e(TAG, "onPlayerStateChanged" + playbackState + "/ready=" + playWhenReady); + handler.post(() -> { + switch (playbackState) { + case Player.STATE_IDLE: { + } + break; + case Player.STATE_BUFFERING: { + jzvd.onStatePreparingPlaying(); + handler.post(callback); + } + break; + case Player.STATE_READY: { + if (playWhenReady) { + jzvd.onStatePlaying(); + } + } + break; + case Player.STATE_ENDED: { + jzvd.onCompletion(); + } + break; + } + }); + } + + @Override + public void onRepeatModeChanged(int repeatMode) { + + } + + @Override + public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { + + } + + @Override + public void onPlayerError(ExoPlaybackException error) { + Log.e(TAG, "onPlayerError" + error.toString()); + handler.post(() -> jzvd.onError(1000, 1000)); + } + + @Override + public void onPositionDiscontinuity(int reason) { + + } + + @Override + public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { + + } + + @Override + public void onSeekProcessed() { + handler.post(() -> jzvd.onSeekComplete()); + } + + @Override + public void setSurface(Surface surface) { + if (simpleExoPlayer != null) { + simpleExoPlayer.setVideoSurface(surface); + } else { + Log.e("AGVideo", "simpleExoPlayer为空"); + } + } + + @Override + public void onSurfaceTextureAvailable(@NotNull SurfaceTexture surface, int width, int height) { + if (SAVED_SURFACE == null) { + SAVED_SURFACE = surface; + prepare(); + } else { + jzvd.textureView.setSurfaceTexture(SAVED_SURFACE); + } + } + + @Override + public void onSurfaceTextureSizeChanged(@NotNull SurfaceTexture surface, int width, int height) { + + } + + @Override + public boolean onSurfaceTextureDestroyed(@NotNull SurfaceTexture surface) { + return false; + } + + @Override + public void onSurfaceTextureUpdated(@NotNull SurfaceTexture surface) { + + } + + private class onBufferingUpdate implements Runnable { + @Override + public void run() { + if (simpleExoPlayer != null) { + final int percent = simpleExoPlayer.getBufferedPercentage(); + handler.post(() -> jzvd.setBufferProgress(percent)); + if (percent < 100) { + handler.postDelayed(callback, 300); + } else { + handler.removeCallbacks(callback); + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java b/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java deleted file mode 100644 index 4683201..0000000 --- a/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.dcms.utils; - -import androidx.core.content.FileProvider; - -public class VersionUpgradeFileProvider extends FileProvider { -} diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index b1adeb9..75ac52e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -1,14 +1,15 @@ package com.casic.dcms.ui; import android.annotation.SuppressLint; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; +import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -18,7 +19,6 @@ import android.widget.PopupWindow; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -47,12 +47,13 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.TimeOrDateUtil; import com.casic.dcms.utils.ToastHelper; import com.casic.dcms.widgets.VoicePlayView; -import com.iceteck.silicompressorr.SiliCompressor; +import com.google.gson.Gson; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; @@ -65,10 +66,10 @@ import com.qmuiteam.qmui.widget.popup.QMUIPopup; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import com.zolad.videoslimmer.VideoSlimmer; import java.io.File; import java.io.IOException; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ public class CaseUploadActivity extends BaseCaseActivity implements View.OnClickListener, View.OnTouchListener, ICaseLargeClassView, ICaseSmallClassView, ICaseSubmitCaseView, IUploadFileView { - private Context context = this; @BindView(R.id.caseLayout) LinearLayout caseLayout; @BindView(R.id.caseClassView) @@ -116,12 +116,15 @@ @BindView(R.id.submitButton) QMUIRoundButton submitButton; + private static final String TAG = "CaseUploadActivity"; + private Context context = this; private CaseLargeClassPresenterImpl caseLargeClassPresenter; private CaseSmallClassPresenterImpl caseSmallClassPresenter; private CaseSubmitPresenterImpl caseSubmitPresenter; private List largeClassBeans; private List smallClassBeans; - private QMUITipDialog submitDialog, qmuiTipDialog; + private QMUITipDialog submitDialog; + private ProgressDialog progressDialog; private UploadImagePresenterImpl uploadImagePresenter; private List imageList = new ArrayList<>();//服务器返回的拍照数据集 private ArrayList realPaths = new ArrayList<>();//真是图片路径 @@ -136,7 +139,6 @@ private String audioUrl, videoUrl; private AudioRecodeHelper audioRecodeHelper; private PopupWindow popWindow; - private static WeakReferenceHandler weakReferenceHandler; private boolean isFirstEnter = true; @Override @@ -156,15 +158,18 @@ caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord("提交中,请稍后") .create(); - qmuiTipDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("视频压缩中,请稍后") - .create(); - weakReferenceHandler = new WeakReferenceHandler(this); + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("视频压缩中..."); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCancelable(false); + progressDialog.setCanceledOnTouchOutside(false); + uploadImagePresenter = new UploadImagePresenterImpl(this); uploadAudioPresenter = new UploadAudioPresenterImpl(this); uploadVideoPresenter = new UploadVideoPresenterImpl(this); @@ -179,7 +184,6 @@ public void initEvent() { voiceView.setOnTouchListener(this); submitButton.setChangeAlphaWhenPress(true); - //录音相关 View view = View.inflate(this, R.layout.popu_microphone, null); int popWidth = (int) (QMUIDisplayHelper.getScreenWidth(this) * 0.35); @@ -340,6 +344,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -378,29 +383,25 @@ case PictureConfig.PREVIEW_VIDEO_CODE: LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0); //"realPath":"/storage/emulated/0/Movies/VID_20210426_17552226.mp4" + Log.d(TAG, "onActivityResult: " + new Gson().toJson(media)); //需要手动压缩视频 String mediaRealPath = media.getRealPath(); + if (TextUtils.isEmpty(mediaRealPath)) { + //部分手机getRealPath可能为空,需要备用路径 + mediaRealPath = media.getPath(); + } + if (TextUtils.isEmpty(mediaRealPath) || mediaRealPath.equals("")) { + //如果默认和备用路径还是为空,则不压缩上传 + ToastHelper.showToast("操作失败,无法获取有效的视频文件", ToastHelper.ERROR); + return; + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(mediaRealPath); + String defaultRotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + String defaultBitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - qmuiTipDialog.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - /** - * 视频压缩 - * 第一个参数:视频源文件路径 - * 第二个参数:压缩后视频保存的路径 - */ - String comPressPath = SiliCompressor.with(context).compressVideo(mediaRealPath, FileUtils.getVideoCompressPath()); - Message message = weakReferenceHandler.obtainMessage(); - message.what = 20210427; - message.obj = comPressPath; - weakReferenceHandler.sendMessage(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); + assert defaultRotation != null; + compressVideo(mediaRealPath, defaultRotation, defaultBitrate); break; case Constant.REQUEST_MAP_CODE: if (data == null) { @@ -421,27 +422,46 @@ } } - private static class WeakReferenceHandler extends Handler { - private WeakReference reference; - - private WeakReferenceHandler(CaseUploadActivity activity) { - reference = new WeakReference<>(activity); + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = Constant.DEFAULT_WIDTH / 2; + height = Constant.DEFAULT_HEIGHT / 2; + } else { + width = Constant.DEFAULT_HEIGHT / 2; + height = Constant.DEFAULT_WIDTH / 2; } - - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - CaseUploadActivity caseUploadActivity = reference.get(); - if (msg.what == 20210427) { - caseUploadActivity.qmuiTipDialog.dismiss(); - String comPressPath = (String) msg.obj; - if (!TextUtils.isEmpty(comPressPath)) { - caseUploadActivity.uploadVideoPresenter.onReadyRetrofitRequest(new File(comPressPath)); - } else { - ToastHelper.showToast("案卷视频上传失败", ToastHelper.ERROR); - } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = Constant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, Constant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); } - } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadVideoPresenter.onReadyRetrofitRequest(new File(outputVideoFile)); + } else { + ToastHelper.showToast("压缩失败", ToastHelper.ERROR); + } + progressDialog.dismiss(); + } + }); } /** @@ -614,7 +634,7 @@ videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); String completeURL = StringHelper.appendCompleteURL(videoUrl); - videoPlayerView.setUp(completeURL, ""); + videoPlayerView.setUp(completeURL, "", Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java new file mode 100644 index 0000000..10bfc1b --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java @@ -0,0 +1,332 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseCaseActivity; +import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.OtherUtils; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CaseUploadPackageActivity extends BaseCaseActivity implements View.OnClickListener, + IUploadFileView, ICaseSubmitCaseView { + + private Context context = CaseUploadPackageActivity.this; + @BindView(R.id.shopView) + TextView shopView; + @BindView(R.id.communityView) + EditText communityView; + @BindView(R.id.longitudeView) + TextView longitudeView; + @BindView(R.id.latitudeView) + TextView latitudeView; + @BindView(R.id.shopKeeperView) + EditText shopKeeperView; + @BindView(R.id.phoneNumberView) + EditText phoneNumberView; + @BindView(R.id.caseLocationView) + EditText caseLocationView; + @BindView(R.id.caseDetailEditView) + EditText caseDetailEditView; + @BindView(R.id.selectedResultView) + RecyclerView selectedResultView; + @BindView(R.id.addImageView) + ImageView addImageView; + @BindView(R.id.submitButton) + QMUIRoundButton submitButton; + + private UploadImagePresenterImpl uploadImagePresenter; + private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; + private ImageRecycleViewAdapter imageAdapter; + private QMUITipDialog submitDialog; + private ArrayList realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private String gridId, shopID; + + @Override + public int initLayoutView() { + return R.layout.activity_package; + } + + @Override + protected String setTitleName() { + return "三包上报"; + } + + @Override + public void initData() { + uploadImagePresenter = new UploadImagePresenterImpl(this); + shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + imageAdapter = new ImageRecycleViewAdapter(this); + selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); + selectedResultView.addItemDecoration(new ItemDecorationSpace()); + selectedResultView.setAdapter(imageAdapter); + } + + @Override + public void initEvent() { + submitButton.setChangeAlphaWhenPress(true); + } + + @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.shopLayout: + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", "三包上报"); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .setCanceledOnTouchOutside(false) + .create().show(); + break; + case R.id.submitButton: + submitCase(); + break; + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } + double longitude = data.getDoubleExtra("longitude", 0); + double latitude = data.getDoubleExtra("latitude", 0); + gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String shopName = data.getStringExtra("shopName"); + shopID = data.getStringExtra("shopID"); + + longitudeView.setText(String.valueOf(longitude)); + latitudeView.setText(String.valueOf(latitude)); + communityView.setText(community); + shopView.setText(shopName); + break; + default: + break; + } + } + } + + /** + * 案卷提交 + */ + private void submitCase() { + String longitude = longitudeView.getText().toString(); + String latitude = latitudeView.getText().toString(); + if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { + ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); + return; + } + String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(shopKeeper)) { + ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); + return; + } + String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(phoneNumber)) { + ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); + return; + } + if (StringHelper.isPhoneNumber(phoneNumber)) { + String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(fieldIntro)) { + ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); + return; + } + String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(description)) { + ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); + return; + } + if (imageAdapter.getItemCount() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } + shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, + "2", "1", + gridId.substring(0, 6), + gridId.substring(0, 9), + gridId.substring(0, 12), + gridId, description, fieldIntro, + StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); + } else { + ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.dismiss(); + } + + @Override + public void obtainSubmitResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); + finish(); + } else { + ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); + } + } + + @Override + public void obtainDataFail() { + ToastHelper.showToast("操作失败", ToastHelper.ERROR); + } + + @Override + public void obtainUploadAudioResult(ActionResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 2) { + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + imageAdapter.setMediaList(realPaths); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + OtherUtils.showBigImage(context, position, realPaths); + } + }); + //删除按钮点击事件 + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + mediaList.remove(position); + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } else { + ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); + } + } + } + + @Override + public void obtainUploadVideoResult(ActionResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java index 67a0340..7750f8a 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java @@ -242,6 +242,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java index e27a310..d364d7c 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -179,7 +180,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java index f0e437a..d28d4b2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -44,6 +44,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -285,7 +286,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -518,6 +519,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java deleted file mode 100644 index 1ba1d5b..0000000 --- a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java +++ /dev/null @@ -1,331 +0,0 @@ -package com.casic.dcms.ui; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.text.TextUtils; -import android.view.View; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.ImageRecycleViewAdapter; -import com.casic.dcms.base.BaseCaseActivity; -import com.casic.dcms.bean.ActionResultBean; -import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; -import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; -import com.casic.dcms.mvp.view.ICaseSubmitCaseView; -import com.casic.dcms.mvp.view.IUploadFileView; -import com.casic.dcms.utils.Constant; -import com.casic.dcms.utils.FileUtils; -import com.casic.dcms.utils.GlideLoadEngine; -import com.casic.dcms.utils.ItemDecorationSpace; -import com.casic.dcms.utils.OtherUtils; -import com.casic.dcms.utils.StringHelper; -import com.casic.dcms.utils.ToastHelper; -import com.luck.picture.lib.PictureSelector; -import com.luck.picture.lib.config.PictureConfig; -import com.luck.picture.lib.config.PictureMimeType; -import com.luck.picture.lib.entity.LocalMedia; -import com.luck.picture.lib.tools.PictureFileUtils; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; -import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.OnClick; - -public class ThreePackageUploadActivity extends BaseCaseActivity implements View.OnClickListener, - IUploadFileView, ICaseSubmitCaseView { - - private Context context = ThreePackageUploadActivity.this; - @BindView(R.id.shopView) - TextView shopView; - @BindView(R.id.communityView) - EditText communityView; - @BindView(R.id.longitudeView) - TextView longitudeView; - @BindView(R.id.latitudeView) - TextView latitudeView; - @BindView(R.id.shopKeeperView) - EditText shopKeeperView; - @BindView(R.id.phoneNumberView) - EditText phoneNumberView; - @BindView(R.id.caseLocationView) - EditText caseLocationView; - @BindView(R.id.caseDetailEditView) - EditText caseDetailEditView; - @BindView(R.id.selectedResultView) - RecyclerView selectedResultView; - @BindView(R.id.addImageView) - ImageView addImageView; - @BindView(R.id.submitButton) - QMUIRoundButton submitButton; - - private UploadImagePresenterImpl uploadImagePresenter; - private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; - private ImageRecycleViewAdapter imageAdapter; - private QMUITipDialog submitDialog; - private ArrayList realPaths = new ArrayList<>();//真是图片路径 - private List mediaList = new ArrayList<>();//上传到服务器的数据集 - private String gridId, shopID; - - @Override - public int initLayoutView() { - return R.layout.activity_package; - } - - @Override - protected String setTitleName() { - return "三包上报"; - } - - @Override - public void initData() { - uploadImagePresenter = new UploadImagePresenterImpl(this); - shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); - submitDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("提交中,请稍后") - .create(); - imageAdapter = new ImageRecycleViewAdapter(this); - selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); - selectedResultView.addItemDecoration(new ItemDecorationSpace()); - selectedResultView.setAdapter(imageAdapter); - } - - @Override - public void initEvent() { - submitButton.setChangeAlphaWhenPress(true); - } - - @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.shopLayout: - Intent intent = new Intent(this, ArcGISMapActivity.class); - intent.putExtra("type", "三包上报"); - startActivityForResult(intent, Constant.REQUEST_MAP_CODE); - break; - case R.id.addImageView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("相册中选取", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //选图 - selectPicture(); - } - }) - .addItem("相机拍照", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //拍照 - takePicture(); - } - }) - .setCanceledOnTouchOutside(false) - .create().show(); - break; - case R.id.submitButton: - submitCase(); - break; - } - } - - private void selectPicture() { - PictureSelector.create(this) - .openGallery(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(2) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.CHOOSE_REQUEST); - } - - private void takePicture() { - PictureSelector.create(this) - .openCamera(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(1) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.REQUEST_CAMERA); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK) { - switch (requestCode) { - case PictureConfig.CHOOSE_REQUEST: - List selectList = PictureSelector.obtainMultipleResult(data); - for (LocalMedia media : selectList) { - String mediaCompressPath = media.getCompressPath(); - uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); - } - break; - case PictureConfig.REQUEST_CAMERA: - LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); - uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); - break; - case Constant.REQUEST_MAP_CODE: - if (data == null) { - return; - } - double longitude = data.getDoubleExtra("longitude", 0); - double latitude = data.getDoubleExtra("latitude", 0); - gridId = data.getStringExtra("gridId"); - String community = data.getStringExtra("community"); - String shopName = data.getStringExtra("shopName"); - shopID = data.getStringExtra("shopID"); - - longitudeView.setText(String.valueOf(longitude)); - latitudeView.setText(String.valueOf(latitude)); - communityView.setText(community); - shopView.setText(shopName); - break; - default: - break; - } - } - } - - /** - * 案卷提交 - */ - private void submitCase() { - String longitude = longitudeView.getText().toString(); - String latitude = latitudeView.getText().toString(); - if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { - ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); - return; - } - String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(shopKeeper)) { - ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); - return; - } - String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(phoneNumber)) { - ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); - return; - } - if (StringHelper.isPhoneNumber(phoneNumber)) { - String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(fieldIntro)) { - ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); - return; - } - String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(description)) { - ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); - return; - } - if (imageAdapter.getItemCount() != 2) { - ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); - return; - } - shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, - "2", "1", - gridId.substring(0, 6), - gridId.substring(0, 9), - gridId.substring(0, 12), - gridId, description, fieldIntro, - StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); - } else { - ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); - } - } - - @Override - public void showProgress() { - submitDialog.show(); - } - - @Override - public void hideProgress() { - submitDialog.dismiss(); - } - - @Override - public void obtainSubmitResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); - finish(); - } else { - ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); - } - } - - @Override - public void obtainDataFail() { - ToastHelper.showToast("操作失败", ToastHelper.ERROR); - } - - @Override - public void obtainUploadAudioResult(ActionResultBean resultBean) { - - } - - @Override - public void obtainUploadImageResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - PictureFileUtils.deleteAllCacheDirFile(this); - /** - * 系统路径static拼接图片返回路径 - * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg - */ - //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg - int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 2) { - String url = resultBean.getData(); - mediaList.add(url); - realPaths.add(StringHelper.appendCompleteURL(url)); - if (realPaths.size() == 2) { - addImageView.setVisibility(View.GONE); - } - imageAdapter.setMediaList(realPaths); - //九宫格点击事件 - imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { - @Override - public void onClick(int position) { - OtherUtils.showBigImage(context, position, realPaths); - } - }); - //删除按钮点击事件 - imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { - @Override - public void onClick(int position) { - mediaList.remove(position); - realPaths.remove(position); - imageAdapter.setMediaList(realPaths); - if (realPaths.size() != 2) { - addImageView.setVisibility(View.VISIBLE); - } - } - }); - } else { - ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); - } - } - } - - @Override - public void obtainUploadVideoResult(ActionResultBean resultBean) { - - } -} diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java index 2ae9aa6..5dcf237 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java @@ -24,13 +24,13 @@ import com.casic.dcms.ui.CaseOnMapActivity; import com.casic.dcms.ui.CaseSearchActivity; import com.casic.dcms.ui.CaseUploadActivity; +import com.casic.dcms.ui.CaseUploadPackageActivity; import com.casic.dcms.ui.CaseUploadQuicklyActivity; import com.casic.dcms.ui.CaseVerifyActivity; import com.casic.dcms.ui.DataAnalysisActivity; import com.casic.dcms.ui.OvertimeCaseActivity; import com.casic.dcms.ui.PersonOnlineActivity; import com.casic.dcms.ui.PublicToiletActivity; -import com.casic.dcms.ui.ThreePackageUploadActivity; import com.casic.dcms.ui.UrgentCaseActivity; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -119,7 +119,7 @@ intent.setClass(context, CaseUploadQuicklyActivity.class); break; case "三包上报": - intent.setClass(context, ThreePackageUploadActivity.class); + intent.setClass(context, CaseUploadPackageActivity.class); break; case "案卷核实": intent.setClass(context, CaseVerifyActivity.class); diff --git a/app/src/main/java/com/casic/dcms/utils/Constant.java b/app/src/main/java/com/casic/dcms/utils/Constant.java index d948e35..036f762 100644 --- a/app/src/main/java/com/casic/dcms/utils/Constant.java +++ b/app/src/main/java/com/casic/dcms/utils/Constant.java @@ -40,6 +40,9 @@ public static final int REQUEST_REFRESH_CODE = 9002; public static final int PAGE_LIMIT = 15; + public static final int BITRATE = 200 * 360 * 30; + public static final int DEFAULT_WIDTH = 720; + public static final int DEFAULT_HEIGHT = 1280; public static final int CASE_HANDLE = 0; public static final int CASE_VERIFY = 1; diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index c07978f..315a587 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -2,7 +2,6 @@ import android.annotation.SuppressLint; import android.content.Context; -import android.os.Environment; import android.util.Log; import java.io.File; @@ -19,6 +18,7 @@ private static File imageDir; private static File waterImageDir; private static File downloadDir; + private static File videoDir; public static void initFileConfig(Context context) { FileUtils.context = context; @@ -57,6 +57,13 @@ Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); } } + videoDir = new File(parentDir, "CompressVideoFile"); + if (!videoDir.exists()) { + boolean mkVideoDir = videoDir.mkdir(); + if (mkVideoDir) { + Log.d(TAG, "initFileConfig: 创建CompressVideoFile文件夹"); + } + } } static File getOutputAudioFile() { @@ -160,7 +167,32 @@ return downloadDir.toString(); } - public static String getVideoCompressPath() { - return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); + public static String getOutputVideoFile() { + if (videoDir == null) { + File parentDir = new File(context.getFilesDir().getAbsolutePath(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "getOutputVideoFile: 创建Casic文件夹"); + } + } + videoDir = new File(parentDir, "CompressVideoFile"); + if (!videoDir.exists()) { + boolean mkVideoDir = videoDir.mkdir(); + if (mkVideoDir) { + Log.d(TAG, "getOutputVideoFile: 创建CompressVideoFile文件夹"); + } + } + } + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); + File videoFile = new File(videoDir + File.separator + "VID_" + timeStamp + ".mp4"); + if (!videoFile.exists()) { + try { + videoFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return videoFile.getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java b/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java new file mode 100644 index 0000000..b82c57d --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java @@ -0,0 +1,320 @@ +package com.casic.dcms.utils; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.net.Uri; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; +import android.view.Surface; + +import com.casic.dcms.R; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.DefaultLoadControl; +import com.google.android.exoplayer2.DefaultRenderersFactory; +import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.LoadControl; +import com.google.android.exoplayer2.PlaybackParameters; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.RenderersFactory; +import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.source.MediaSource; +import com.google.android.exoplayer2.source.ProgressiveMediaSource; +import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.source.hls.HlsMediaSource; +import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; +import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.trackselection.TrackSelector; +import com.google.android.exoplayer2.upstream.BandwidthMeter; +import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DefaultAllocator; +import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; +import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.util.Util; +import com.google.android.exoplayer2.video.VideoListener; + +import org.jetbrains.annotations.NotNull; + +import cn.jzvd.JZMediaInterface; +import cn.jzvd.Jzvd; + +public class JzExoMedia extends JZMediaInterface implements Player.EventListener, VideoListener { + + private static final String TAG = "JzExoMedia"; + private SimpleExoPlayer simpleExoPlayer; + private long previousSeek = 0; + private Runnable callback; + + public JzExoMedia(Jzvd jzvd) { + super(jzvd); + } + + @Override + public void start() { + simpleExoPlayer.setPlayWhenReady(true); + } + + @Override + public void prepare() { + Context context = jzvd.getContext(); + release(); + mMediaHandlerThread = new HandlerThread("JZVD"); + mMediaHandlerThread.start(); + mMediaHandler = new Handler(context.getMainLooper());//主线程还是非主线程,就在这里 + handler = new Handler(); + mMediaHandler.post(() -> { + AdaptiveTrackSelection.Factory factory = new AdaptiveTrackSelection.Factory(); + TrackSelector trackSelector = new DefaultTrackSelector(context, factory); + + LoadControl loadControl = new DefaultLoadControl.Builder() + .setAllocator(new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE)) + .setBufferDurationsMs(360000, 600000, 1000, 5000) + .setPrioritizeTimeOverSizeThresholds(false) + .setTargetBufferBytes(C.LENGTH_UNSET) + .createDefaultLoadControl(); + + BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder(context).build(); + // 2. Create the player + + RenderersFactory renderersFactory = new DefaultRenderersFactory(context); + simpleExoPlayer = new SimpleExoPlayer.Builder(context, renderersFactory) + .setTrackSelector(trackSelector) + .setLoadControl(loadControl) + .setBandwidthMeter(bandwidthMeter) + .build(); + // Produces DataSource instances through which media data is loaded. + DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, + Util.getUserAgent(context, context.getResources().getString(R.string.app_name))); + + String currUrl = jzvd.jzDataSource.getCurrentUrl().toString(); + MediaSource videoSource; + if (currUrl.contains(".m3u8")) { + videoSource = new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(currUrl)); + //addEventListener 这里只有两个参数都要传入值才可以成功设置 + // 否者会被断言 Assertions.checkArgument(handler != null && eventListener != null); + // 并且报错 IllegalArgumentException() 所以不需要添加监听器时 注释掉 + // videoSource .addEventListener( handler, null); + } else { + videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(currUrl)); + } + simpleExoPlayer.addVideoListener(this); + Log.e(TAG, "URL Link = " + currUrl); + + simpleExoPlayer.addListener(this); + boolean isLoop = jzvd.jzDataSource.looping; + if (isLoop) { + simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_ONE); + } else { + simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_OFF); + } + simpleExoPlayer.prepare(videoSource); + simpleExoPlayer.setPlayWhenReady(true); + callback = new onBufferingUpdate(); + if (jzvd.textureView != null) { + SurfaceTexture surfaceTexture = jzvd.textureView.getSurfaceTexture(); + if (surfaceTexture != null) { + simpleExoPlayer.setVideoSurface(new Surface(surfaceTexture)); + } + } + }); + } + + @Override + public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) { + handler.post(() -> jzvd.onVideoSizeChanged((int) (width * pixelWidthHeightRatio), height)); + } + + @Override + public void onRenderedFirstFrame() { + + } + + @Override + public void pause() { + simpleExoPlayer.setPlayWhenReady(false); + } + + @Override + public boolean isPlaying() { + return simpleExoPlayer.getPlayWhenReady(); + } + + @Override + public void seekTo(long time) { + if (simpleExoPlayer == null) { + return; + } + if (time != previousSeek) { + if (time >= simpleExoPlayer.getBufferedPosition()) { + jzvd.onStatePreparingPlaying(); + } + simpleExoPlayer.seekTo(time); + previousSeek = time; + jzvd.seekToInAdvance = time; + } + } + + @Override + public void release() { + if (mMediaHandler != null && mMediaHandlerThread != null && simpleExoPlayer != null) { + HandlerThread tmpHandlerThread = mMediaHandlerThread; + SimpleExoPlayer tmpMediaPlayer = simpleExoPlayer; + JZMediaInterface.SAVED_SURFACE = null; + mMediaHandler.post(() -> { + tmpMediaPlayer.release();//release就不能放到主线程里,界面会卡顿 + tmpHandlerThread.quit(); + }); + simpleExoPlayer = null; + } + } + + @Override + public long getCurrentPosition() { + if (simpleExoPlayer != null) + return simpleExoPlayer.getCurrentPosition(); + else return 0; + } + + @Override + public long getDuration() { + if (simpleExoPlayer != null) + return simpleExoPlayer.getDuration(); + else return 0; + } + + @Override + public void setVolume(float leftVolume, float rightVolume) { + simpleExoPlayer.setVolume(leftVolume); + simpleExoPlayer.setVolume(rightVolume); + } + + @Override + public void setSpeed(float speed) { + PlaybackParameters playbackParameters = new PlaybackParameters(speed, 1.0F); + simpleExoPlayer.setPlaybackParameters(playbackParameters); + } + + @Override + public void onTimelineChanged(final Timeline timeline, Object manifest, final int reason) { + + } + + @Override + public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { + + } + + @Override + public void onLoadingChanged(boolean isLoading) { + + } + + @Override + public void onPlayerStateChanged(final boolean playWhenReady, final int playbackState) { + Log.e(TAG, "onPlayerStateChanged" + playbackState + "/ready=" + playWhenReady); + handler.post(() -> { + switch (playbackState) { + case Player.STATE_IDLE: { + } + break; + case Player.STATE_BUFFERING: { + jzvd.onStatePreparingPlaying(); + handler.post(callback); + } + break; + case Player.STATE_READY: { + if (playWhenReady) { + jzvd.onStatePlaying(); + } + } + break; + case Player.STATE_ENDED: { + jzvd.onCompletion(); + } + break; + } + }); + } + + @Override + public void onRepeatModeChanged(int repeatMode) { + + } + + @Override + public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { + + } + + @Override + public void onPlayerError(ExoPlaybackException error) { + Log.e(TAG, "onPlayerError" + error.toString()); + handler.post(() -> jzvd.onError(1000, 1000)); + } + + @Override + public void onPositionDiscontinuity(int reason) { + + } + + @Override + public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { + + } + + @Override + public void onSeekProcessed() { + handler.post(() -> jzvd.onSeekComplete()); + } + + @Override + public void setSurface(Surface surface) { + if (simpleExoPlayer != null) { + simpleExoPlayer.setVideoSurface(surface); + } else { + Log.e("AGVideo", "simpleExoPlayer为空"); + } + } + + @Override + public void onSurfaceTextureAvailable(@NotNull SurfaceTexture surface, int width, int height) { + if (SAVED_SURFACE == null) { + SAVED_SURFACE = surface; + prepare(); + } else { + jzvd.textureView.setSurfaceTexture(SAVED_SURFACE); + } + } + + @Override + public void onSurfaceTextureSizeChanged(@NotNull SurfaceTexture surface, int width, int height) { + + } + + @Override + public boolean onSurfaceTextureDestroyed(@NotNull SurfaceTexture surface) { + return false; + } + + @Override + public void onSurfaceTextureUpdated(@NotNull SurfaceTexture surface) { + + } + + private class onBufferingUpdate implements Runnable { + @Override + public void run() { + if (simpleExoPlayer != null) { + final int percent = simpleExoPlayer.getBufferedPercentage(); + handler.post(() -> jzvd.setBufferProgress(percent)); + if (percent < 100) { + handler.postDelayed(callback, 300); + } else { + handler.removeCallbacks(callback); + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java b/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java deleted file mode 100644 index 4683201..0000000 --- a/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.dcms.utils; - -import androidx.core.content.FileProvider; - -public class VersionUpgradeFileProvider extends FileProvider { -} diff --git a/app/src/main/java/com/casic/dcms/utils/WaterImageFileProvider.java b/app/src/main/java/com/casic/dcms/utils/WaterImageFileProvider.java deleted file mode 100644 index 4102901..0000000 --- a/app/src/main/java/com/casic/dcms/utils/WaterImageFileProvider.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.dcms.utils; - -import androidx.core.content.FileProvider; - -public class WaterImageFileProvider extends FileProvider { -} diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index b1adeb9..75ac52e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -1,14 +1,15 @@ package com.casic.dcms.ui; import android.annotation.SuppressLint; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; +import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -18,7 +19,6 @@ import android.widget.PopupWindow; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -47,12 +47,13 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.TimeOrDateUtil; import com.casic.dcms.utils.ToastHelper; import com.casic.dcms.widgets.VoicePlayView; -import com.iceteck.silicompressorr.SiliCompressor; +import com.google.gson.Gson; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; @@ -65,10 +66,10 @@ import com.qmuiteam.qmui.widget.popup.QMUIPopup; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import com.zolad.videoslimmer.VideoSlimmer; import java.io.File; import java.io.IOException; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ public class CaseUploadActivity extends BaseCaseActivity implements View.OnClickListener, View.OnTouchListener, ICaseLargeClassView, ICaseSmallClassView, ICaseSubmitCaseView, IUploadFileView { - private Context context = this; @BindView(R.id.caseLayout) LinearLayout caseLayout; @BindView(R.id.caseClassView) @@ -116,12 +116,15 @@ @BindView(R.id.submitButton) QMUIRoundButton submitButton; + private static final String TAG = "CaseUploadActivity"; + private Context context = this; private CaseLargeClassPresenterImpl caseLargeClassPresenter; private CaseSmallClassPresenterImpl caseSmallClassPresenter; private CaseSubmitPresenterImpl caseSubmitPresenter; private List largeClassBeans; private List smallClassBeans; - private QMUITipDialog submitDialog, qmuiTipDialog; + private QMUITipDialog submitDialog; + private ProgressDialog progressDialog; private UploadImagePresenterImpl uploadImagePresenter; private List imageList = new ArrayList<>();//服务器返回的拍照数据集 private ArrayList realPaths = new ArrayList<>();//真是图片路径 @@ -136,7 +139,6 @@ private String audioUrl, videoUrl; private AudioRecodeHelper audioRecodeHelper; private PopupWindow popWindow; - private static WeakReferenceHandler weakReferenceHandler; private boolean isFirstEnter = true; @Override @@ -156,15 +158,18 @@ caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord("提交中,请稍后") .create(); - qmuiTipDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("视频压缩中,请稍后") - .create(); - weakReferenceHandler = new WeakReferenceHandler(this); + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("视频压缩中..."); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCancelable(false); + progressDialog.setCanceledOnTouchOutside(false); + uploadImagePresenter = new UploadImagePresenterImpl(this); uploadAudioPresenter = new UploadAudioPresenterImpl(this); uploadVideoPresenter = new UploadVideoPresenterImpl(this); @@ -179,7 +184,6 @@ public void initEvent() { voiceView.setOnTouchListener(this); submitButton.setChangeAlphaWhenPress(true); - //录音相关 View view = View.inflate(this, R.layout.popu_microphone, null); int popWidth = (int) (QMUIDisplayHelper.getScreenWidth(this) * 0.35); @@ -340,6 +344,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -378,29 +383,25 @@ case PictureConfig.PREVIEW_VIDEO_CODE: LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0); //"realPath":"/storage/emulated/0/Movies/VID_20210426_17552226.mp4" + Log.d(TAG, "onActivityResult: " + new Gson().toJson(media)); //需要手动压缩视频 String mediaRealPath = media.getRealPath(); + if (TextUtils.isEmpty(mediaRealPath)) { + //部分手机getRealPath可能为空,需要备用路径 + mediaRealPath = media.getPath(); + } + if (TextUtils.isEmpty(mediaRealPath) || mediaRealPath.equals("")) { + //如果默认和备用路径还是为空,则不压缩上传 + ToastHelper.showToast("操作失败,无法获取有效的视频文件", ToastHelper.ERROR); + return; + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(mediaRealPath); + String defaultRotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + String defaultBitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - qmuiTipDialog.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - /** - * 视频压缩 - * 第一个参数:视频源文件路径 - * 第二个参数:压缩后视频保存的路径 - */ - String comPressPath = SiliCompressor.with(context).compressVideo(mediaRealPath, FileUtils.getVideoCompressPath()); - Message message = weakReferenceHandler.obtainMessage(); - message.what = 20210427; - message.obj = comPressPath; - weakReferenceHandler.sendMessage(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); + assert defaultRotation != null; + compressVideo(mediaRealPath, defaultRotation, defaultBitrate); break; case Constant.REQUEST_MAP_CODE: if (data == null) { @@ -421,27 +422,46 @@ } } - private static class WeakReferenceHandler extends Handler { - private WeakReference reference; - - private WeakReferenceHandler(CaseUploadActivity activity) { - reference = new WeakReference<>(activity); + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = Constant.DEFAULT_WIDTH / 2; + height = Constant.DEFAULT_HEIGHT / 2; + } else { + width = Constant.DEFAULT_HEIGHT / 2; + height = Constant.DEFAULT_WIDTH / 2; } - - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - CaseUploadActivity caseUploadActivity = reference.get(); - if (msg.what == 20210427) { - caseUploadActivity.qmuiTipDialog.dismiss(); - String comPressPath = (String) msg.obj; - if (!TextUtils.isEmpty(comPressPath)) { - caseUploadActivity.uploadVideoPresenter.onReadyRetrofitRequest(new File(comPressPath)); - } else { - ToastHelper.showToast("案卷视频上传失败", ToastHelper.ERROR); - } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = Constant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, Constant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); } - } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadVideoPresenter.onReadyRetrofitRequest(new File(outputVideoFile)); + } else { + ToastHelper.showToast("压缩失败", ToastHelper.ERROR); + } + progressDialog.dismiss(); + } + }); } /** @@ -614,7 +634,7 @@ videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); String completeURL = StringHelper.appendCompleteURL(videoUrl); - videoPlayerView.setUp(completeURL, ""); + videoPlayerView.setUp(completeURL, "", Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java new file mode 100644 index 0000000..10bfc1b --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java @@ -0,0 +1,332 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseCaseActivity; +import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.OtherUtils; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CaseUploadPackageActivity extends BaseCaseActivity implements View.OnClickListener, + IUploadFileView, ICaseSubmitCaseView { + + private Context context = CaseUploadPackageActivity.this; + @BindView(R.id.shopView) + TextView shopView; + @BindView(R.id.communityView) + EditText communityView; + @BindView(R.id.longitudeView) + TextView longitudeView; + @BindView(R.id.latitudeView) + TextView latitudeView; + @BindView(R.id.shopKeeperView) + EditText shopKeeperView; + @BindView(R.id.phoneNumberView) + EditText phoneNumberView; + @BindView(R.id.caseLocationView) + EditText caseLocationView; + @BindView(R.id.caseDetailEditView) + EditText caseDetailEditView; + @BindView(R.id.selectedResultView) + RecyclerView selectedResultView; + @BindView(R.id.addImageView) + ImageView addImageView; + @BindView(R.id.submitButton) + QMUIRoundButton submitButton; + + private UploadImagePresenterImpl uploadImagePresenter; + private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; + private ImageRecycleViewAdapter imageAdapter; + private QMUITipDialog submitDialog; + private ArrayList realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private String gridId, shopID; + + @Override + public int initLayoutView() { + return R.layout.activity_package; + } + + @Override + protected String setTitleName() { + return "三包上报"; + } + + @Override + public void initData() { + uploadImagePresenter = new UploadImagePresenterImpl(this); + shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + imageAdapter = new ImageRecycleViewAdapter(this); + selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); + selectedResultView.addItemDecoration(new ItemDecorationSpace()); + selectedResultView.setAdapter(imageAdapter); + } + + @Override + public void initEvent() { + submitButton.setChangeAlphaWhenPress(true); + } + + @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.shopLayout: + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", "三包上报"); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .setCanceledOnTouchOutside(false) + .create().show(); + break; + case R.id.submitButton: + submitCase(); + break; + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } + double longitude = data.getDoubleExtra("longitude", 0); + double latitude = data.getDoubleExtra("latitude", 0); + gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String shopName = data.getStringExtra("shopName"); + shopID = data.getStringExtra("shopID"); + + longitudeView.setText(String.valueOf(longitude)); + latitudeView.setText(String.valueOf(latitude)); + communityView.setText(community); + shopView.setText(shopName); + break; + default: + break; + } + } + } + + /** + * 案卷提交 + */ + private void submitCase() { + String longitude = longitudeView.getText().toString(); + String latitude = latitudeView.getText().toString(); + if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { + ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); + return; + } + String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(shopKeeper)) { + ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); + return; + } + String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(phoneNumber)) { + ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); + return; + } + if (StringHelper.isPhoneNumber(phoneNumber)) { + String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(fieldIntro)) { + ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); + return; + } + String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(description)) { + ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); + return; + } + if (imageAdapter.getItemCount() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } + shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, + "2", "1", + gridId.substring(0, 6), + gridId.substring(0, 9), + gridId.substring(0, 12), + gridId, description, fieldIntro, + StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); + } else { + ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.dismiss(); + } + + @Override + public void obtainSubmitResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); + finish(); + } else { + ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); + } + } + + @Override + public void obtainDataFail() { + ToastHelper.showToast("操作失败", ToastHelper.ERROR); + } + + @Override + public void obtainUploadAudioResult(ActionResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 2) { + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + imageAdapter.setMediaList(realPaths); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + OtherUtils.showBigImage(context, position, realPaths); + } + }); + //删除按钮点击事件 + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + mediaList.remove(position); + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } else { + ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); + } + } + } + + @Override + public void obtainUploadVideoResult(ActionResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java index 67a0340..7750f8a 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java @@ -242,6 +242,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java index e27a310..d364d7c 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -179,7 +180,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java index f0e437a..d28d4b2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -44,6 +44,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -285,7 +286,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -518,6 +519,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java deleted file mode 100644 index 1ba1d5b..0000000 --- a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java +++ /dev/null @@ -1,331 +0,0 @@ -package com.casic.dcms.ui; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.text.TextUtils; -import android.view.View; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.ImageRecycleViewAdapter; -import com.casic.dcms.base.BaseCaseActivity; -import com.casic.dcms.bean.ActionResultBean; -import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; -import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; -import com.casic.dcms.mvp.view.ICaseSubmitCaseView; -import com.casic.dcms.mvp.view.IUploadFileView; -import com.casic.dcms.utils.Constant; -import com.casic.dcms.utils.FileUtils; -import com.casic.dcms.utils.GlideLoadEngine; -import com.casic.dcms.utils.ItemDecorationSpace; -import com.casic.dcms.utils.OtherUtils; -import com.casic.dcms.utils.StringHelper; -import com.casic.dcms.utils.ToastHelper; -import com.luck.picture.lib.PictureSelector; -import com.luck.picture.lib.config.PictureConfig; -import com.luck.picture.lib.config.PictureMimeType; -import com.luck.picture.lib.entity.LocalMedia; -import com.luck.picture.lib.tools.PictureFileUtils; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; -import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.OnClick; - -public class ThreePackageUploadActivity extends BaseCaseActivity implements View.OnClickListener, - IUploadFileView, ICaseSubmitCaseView { - - private Context context = ThreePackageUploadActivity.this; - @BindView(R.id.shopView) - TextView shopView; - @BindView(R.id.communityView) - EditText communityView; - @BindView(R.id.longitudeView) - TextView longitudeView; - @BindView(R.id.latitudeView) - TextView latitudeView; - @BindView(R.id.shopKeeperView) - EditText shopKeeperView; - @BindView(R.id.phoneNumberView) - EditText phoneNumberView; - @BindView(R.id.caseLocationView) - EditText caseLocationView; - @BindView(R.id.caseDetailEditView) - EditText caseDetailEditView; - @BindView(R.id.selectedResultView) - RecyclerView selectedResultView; - @BindView(R.id.addImageView) - ImageView addImageView; - @BindView(R.id.submitButton) - QMUIRoundButton submitButton; - - private UploadImagePresenterImpl uploadImagePresenter; - private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; - private ImageRecycleViewAdapter imageAdapter; - private QMUITipDialog submitDialog; - private ArrayList realPaths = new ArrayList<>();//真是图片路径 - private List mediaList = new ArrayList<>();//上传到服务器的数据集 - private String gridId, shopID; - - @Override - public int initLayoutView() { - return R.layout.activity_package; - } - - @Override - protected String setTitleName() { - return "三包上报"; - } - - @Override - public void initData() { - uploadImagePresenter = new UploadImagePresenterImpl(this); - shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); - submitDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("提交中,请稍后") - .create(); - imageAdapter = new ImageRecycleViewAdapter(this); - selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); - selectedResultView.addItemDecoration(new ItemDecorationSpace()); - selectedResultView.setAdapter(imageAdapter); - } - - @Override - public void initEvent() { - submitButton.setChangeAlphaWhenPress(true); - } - - @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.shopLayout: - Intent intent = new Intent(this, ArcGISMapActivity.class); - intent.putExtra("type", "三包上报"); - startActivityForResult(intent, Constant.REQUEST_MAP_CODE); - break; - case R.id.addImageView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("相册中选取", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //选图 - selectPicture(); - } - }) - .addItem("相机拍照", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //拍照 - takePicture(); - } - }) - .setCanceledOnTouchOutside(false) - .create().show(); - break; - case R.id.submitButton: - submitCase(); - break; - } - } - - private void selectPicture() { - PictureSelector.create(this) - .openGallery(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(2) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.CHOOSE_REQUEST); - } - - private void takePicture() { - PictureSelector.create(this) - .openCamera(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(1) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.REQUEST_CAMERA); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK) { - switch (requestCode) { - case PictureConfig.CHOOSE_REQUEST: - List selectList = PictureSelector.obtainMultipleResult(data); - for (LocalMedia media : selectList) { - String mediaCompressPath = media.getCompressPath(); - uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); - } - break; - case PictureConfig.REQUEST_CAMERA: - LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); - uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); - break; - case Constant.REQUEST_MAP_CODE: - if (data == null) { - return; - } - double longitude = data.getDoubleExtra("longitude", 0); - double latitude = data.getDoubleExtra("latitude", 0); - gridId = data.getStringExtra("gridId"); - String community = data.getStringExtra("community"); - String shopName = data.getStringExtra("shopName"); - shopID = data.getStringExtra("shopID"); - - longitudeView.setText(String.valueOf(longitude)); - latitudeView.setText(String.valueOf(latitude)); - communityView.setText(community); - shopView.setText(shopName); - break; - default: - break; - } - } - } - - /** - * 案卷提交 - */ - private void submitCase() { - String longitude = longitudeView.getText().toString(); - String latitude = latitudeView.getText().toString(); - if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { - ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); - return; - } - String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(shopKeeper)) { - ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); - return; - } - String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(phoneNumber)) { - ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); - return; - } - if (StringHelper.isPhoneNumber(phoneNumber)) { - String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(fieldIntro)) { - ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); - return; - } - String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(description)) { - ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); - return; - } - if (imageAdapter.getItemCount() != 2) { - ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); - return; - } - shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, - "2", "1", - gridId.substring(0, 6), - gridId.substring(0, 9), - gridId.substring(0, 12), - gridId, description, fieldIntro, - StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); - } else { - ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); - } - } - - @Override - public void showProgress() { - submitDialog.show(); - } - - @Override - public void hideProgress() { - submitDialog.dismiss(); - } - - @Override - public void obtainSubmitResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); - finish(); - } else { - ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); - } - } - - @Override - public void obtainDataFail() { - ToastHelper.showToast("操作失败", ToastHelper.ERROR); - } - - @Override - public void obtainUploadAudioResult(ActionResultBean resultBean) { - - } - - @Override - public void obtainUploadImageResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - PictureFileUtils.deleteAllCacheDirFile(this); - /** - * 系统路径static拼接图片返回路径 - * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg - */ - //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg - int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 2) { - String url = resultBean.getData(); - mediaList.add(url); - realPaths.add(StringHelper.appendCompleteURL(url)); - if (realPaths.size() == 2) { - addImageView.setVisibility(View.GONE); - } - imageAdapter.setMediaList(realPaths); - //九宫格点击事件 - imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { - @Override - public void onClick(int position) { - OtherUtils.showBigImage(context, position, realPaths); - } - }); - //删除按钮点击事件 - imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { - @Override - public void onClick(int position) { - mediaList.remove(position); - realPaths.remove(position); - imageAdapter.setMediaList(realPaths); - if (realPaths.size() != 2) { - addImageView.setVisibility(View.VISIBLE); - } - } - }); - } else { - ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); - } - } - } - - @Override - public void obtainUploadVideoResult(ActionResultBean resultBean) { - - } -} diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java index 2ae9aa6..5dcf237 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java @@ -24,13 +24,13 @@ import com.casic.dcms.ui.CaseOnMapActivity; import com.casic.dcms.ui.CaseSearchActivity; import com.casic.dcms.ui.CaseUploadActivity; +import com.casic.dcms.ui.CaseUploadPackageActivity; import com.casic.dcms.ui.CaseUploadQuicklyActivity; import com.casic.dcms.ui.CaseVerifyActivity; import com.casic.dcms.ui.DataAnalysisActivity; import com.casic.dcms.ui.OvertimeCaseActivity; import com.casic.dcms.ui.PersonOnlineActivity; import com.casic.dcms.ui.PublicToiletActivity; -import com.casic.dcms.ui.ThreePackageUploadActivity; import com.casic.dcms.ui.UrgentCaseActivity; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -119,7 +119,7 @@ intent.setClass(context, CaseUploadQuicklyActivity.class); break; case "三包上报": - intent.setClass(context, ThreePackageUploadActivity.class); + intent.setClass(context, CaseUploadPackageActivity.class); break; case "案卷核实": intent.setClass(context, CaseVerifyActivity.class); diff --git a/app/src/main/java/com/casic/dcms/utils/Constant.java b/app/src/main/java/com/casic/dcms/utils/Constant.java index d948e35..036f762 100644 --- a/app/src/main/java/com/casic/dcms/utils/Constant.java +++ b/app/src/main/java/com/casic/dcms/utils/Constant.java @@ -40,6 +40,9 @@ public static final int REQUEST_REFRESH_CODE = 9002; public static final int PAGE_LIMIT = 15; + public static final int BITRATE = 200 * 360 * 30; + public static final int DEFAULT_WIDTH = 720; + public static final int DEFAULT_HEIGHT = 1280; public static final int CASE_HANDLE = 0; public static final int CASE_VERIFY = 1; diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index c07978f..315a587 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -2,7 +2,6 @@ import android.annotation.SuppressLint; import android.content.Context; -import android.os.Environment; import android.util.Log; import java.io.File; @@ -19,6 +18,7 @@ private static File imageDir; private static File waterImageDir; private static File downloadDir; + private static File videoDir; public static void initFileConfig(Context context) { FileUtils.context = context; @@ -57,6 +57,13 @@ Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); } } + videoDir = new File(parentDir, "CompressVideoFile"); + if (!videoDir.exists()) { + boolean mkVideoDir = videoDir.mkdir(); + if (mkVideoDir) { + Log.d(TAG, "initFileConfig: 创建CompressVideoFile文件夹"); + } + } } static File getOutputAudioFile() { @@ -160,7 +167,32 @@ return downloadDir.toString(); } - public static String getVideoCompressPath() { - return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); + public static String getOutputVideoFile() { + if (videoDir == null) { + File parentDir = new File(context.getFilesDir().getAbsolutePath(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "getOutputVideoFile: 创建Casic文件夹"); + } + } + videoDir = new File(parentDir, "CompressVideoFile"); + if (!videoDir.exists()) { + boolean mkVideoDir = videoDir.mkdir(); + if (mkVideoDir) { + Log.d(TAG, "getOutputVideoFile: 创建CompressVideoFile文件夹"); + } + } + } + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); + File videoFile = new File(videoDir + File.separator + "VID_" + timeStamp + ".mp4"); + if (!videoFile.exists()) { + try { + videoFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return videoFile.getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java b/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java new file mode 100644 index 0000000..b82c57d --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java @@ -0,0 +1,320 @@ +package com.casic.dcms.utils; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.net.Uri; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; +import android.view.Surface; + +import com.casic.dcms.R; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.DefaultLoadControl; +import com.google.android.exoplayer2.DefaultRenderersFactory; +import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.LoadControl; +import com.google.android.exoplayer2.PlaybackParameters; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.RenderersFactory; +import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.source.MediaSource; +import com.google.android.exoplayer2.source.ProgressiveMediaSource; +import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.source.hls.HlsMediaSource; +import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; +import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.trackselection.TrackSelector; +import com.google.android.exoplayer2.upstream.BandwidthMeter; +import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DefaultAllocator; +import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; +import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.util.Util; +import com.google.android.exoplayer2.video.VideoListener; + +import org.jetbrains.annotations.NotNull; + +import cn.jzvd.JZMediaInterface; +import cn.jzvd.Jzvd; + +public class JzExoMedia extends JZMediaInterface implements Player.EventListener, VideoListener { + + private static final String TAG = "JzExoMedia"; + private SimpleExoPlayer simpleExoPlayer; + private long previousSeek = 0; + private Runnable callback; + + public JzExoMedia(Jzvd jzvd) { + super(jzvd); + } + + @Override + public void start() { + simpleExoPlayer.setPlayWhenReady(true); + } + + @Override + public void prepare() { + Context context = jzvd.getContext(); + release(); + mMediaHandlerThread = new HandlerThread("JZVD"); + mMediaHandlerThread.start(); + mMediaHandler = new Handler(context.getMainLooper());//主线程还是非主线程,就在这里 + handler = new Handler(); + mMediaHandler.post(() -> { + AdaptiveTrackSelection.Factory factory = new AdaptiveTrackSelection.Factory(); + TrackSelector trackSelector = new DefaultTrackSelector(context, factory); + + LoadControl loadControl = new DefaultLoadControl.Builder() + .setAllocator(new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE)) + .setBufferDurationsMs(360000, 600000, 1000, 5000) + .setPrioritizeTimeOverSizeThresholds(false) + .setTargetBufferBytes(C.LENGTH_UNSET) + .createDefaultLoadControl(); + + BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder(context).build(); + // 2. Create the player + + RenderersFactory renderersFactory = new DefaultRenderersFactory(context); + simpleExoPlayer = new SimpleExoPlayer.Builder(context, renderersFactory) + .setTrackSelector(trackSelector) + .setLoadControl(loadControl) + .setBandwidthMeter(bandwidthMeter) + .build(); + // Produces DataSource instances through which media data is loaded. + DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, + Util.getUserAgent(context, context.getResources().getString(R.string.app_name))); + + String currUrl = jzvd.jzDataSource.getCurrentUrl().toString(); + MediaSource videoSource; + if (currUrl.contains(".m3u8")) { + videoSource = new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(currUrl)); + //addEventListener 这里只有两个参数都要传入值才可以成功设置 + // 否者会被断言 Assertions.checkArgument(handler != null && eventListener != null); + // 并且报错 IllegalArgumentException() 所以不需要添加监听器时 注释掉 + // videoSource .addEventListener( handler, null); + } else { + videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(currUrl)); + } + simpleExoPlayer.addVideoListener(this); + Log.e(TAG, "URL Link = " + currUrl); + + simpleExoPlayer.addListener(this); + boolean isLoop = jzvd.jzDataSource.looping; + if (isLoop) { + simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_ONE); + } else { + simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_OFF); + } + simpleExoPlayer.prepare(videoSource); + simpleExoPlayer.setPlayWhenReady(true); + callback = new onBufferingUpdate(); + if (jzvd.textureView != null) { + SurfaceTexture surfaceTexture = jzvd.textureView.getSurfaceTexture(); + if (surfaceTexture != null) { + simpleExoPlayer.setVideoSurface(new Surface(surfaceTexture)); + } + } + }); + } + + @Override + public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) { + handler.post(() -> jzvd.onVideoSizeChanged((int) (width * pixelWidthHeightRatio), height)); + } + + @Override + public void onRenderedFirstFrame() { + + } + + @Override + public void pause() { + simpleExoPlayer.setPlayWhenReady(false); + } + + @Override + public boolean isPlaying() { + return simpleExoPlayer.getPlayWhenReady(); + } + + @Override + public void seekTo(long time) { + if (simpleExoPlayer == null) { + return; + } + if (time != previousSeek) { + if (time >= simpleExoPlayer.getBufferedPosition()) { + jzvd.onStatePreparingPlaying(); + } + simpleExoPlayer.seekTo(time); + previousSeek = time; + jzvd.seekToInAdvance = time; + } + } + + @Override + public void release() { + if (mMediaHandler != null && mMediaHandlerThread != null && simpleExoPlayer != null) { + HandlerThread tmpHandlerThread = mMediaHandlerThread; + SimpleExoPlayer tmpMediaPlayer = simpleExoPlayer; + JZMediaInterface.SAVED_SURFACE = null; + mMediaHandler.post(() -> { + tmpMediaPlayer.release();//release就不能放到主线程里,界面会卡顿 + tmpHandlerThread.quit(); + }); + simpleExoPlayer = null; + } + } + + @Override + public long getCurrentPosition() { + if (simpleExoPlayer != null) + return simpleExoPlayer.getCurrentPosition(); + else return 0; + } + + @Override + public long getDuration() { + if (simpleExoPlayer != null) + return simpleExoPlayer.getDuration(); + else return 0; + } + + @Override + public void setVolume(float leftVolume, float rightVolume) { + simpleExoPlayer.setVolume(leftVolume); + simpleExoPlayer.setVolume(rightVolume); + } + + @Override + public void setSpeed(float speed) { + PlaybackParameters playbackParameters = new PlaybackParameters(speed, 1.0F); + simpleExoPlayer.setPlaybackParameters(playbackParameters); + } + + @Override + public void onTimelineChanged(final Timeline timeline, Object manifest, final int reason) { + + } + + @Override + public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { + + } + + @Override + public void onLoadingChanged(boolean isLoading) { + + } + + @Override + public void onPlayerStateChanged(final boolean playWhenReady, final int playbackState) { + Log.e(TAG, "onPlayerStateChanged" + playbackState + "/ready=" + playWhenReady); + handler.post(() -> { + switch (playbackState) { + case Player.STATE_IDLE: { + } + break; + case Player.STATE_BUFFERING: { + jzvd.onStatePreparingPlaying(); + handler.post(callback); + } + break; + case Player.STATE_READY: { + if (playWhenReady) { + jzvd.onStatePlaying(); + } + } + break; + case Player.STATE_ENDED: { + jzvd.onCompletion(); + } + break; + } + }); + } + + @Override + public void onRepeatModeChanged(int repeatMode) { + + } + + @Override + public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { + + } + + @Override + public void onPlayerError(ExoPlaybackException error) { + Log.e(TAG, "onPlayerError" + error.toString()); + handler.post(() -> jzvd.onError(1000, 1000)); + } + + @Override + public void onPositionDiscontinuity(int reason) { + + } + + @Override + public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { + + } + + @Override + public void onSeekProcessed() { + handler.post(() -> jzvd.onSeekComplete()); + } + + @Override + public void setSurface(Surface surface) { + if (simpleExoPlayer != null) { + simpleExoPlayer.setVideoSurface(surface); + } else { + Log.e("AGVideo", "simpleExoPlayer为空"); + } + } + + @Override + public void onSurfaceTextureAvailable(@NotNull SurfaceTexture surface, int width, int height) { + if (SAVED_SURFACE == null) { + SAVED_SURFACE = surface; + prepare(); + } else { + jzvd.textureView.setSurfaceTexture(SAVED_SURFACE); + } + } + + @Override + public void onSurfaceTextureSizeChanged(@NotNull SurfaceTexture surface, int width, int height) { + + } + + @Override + public boolean onSurfaceTextureDestroyed(@NotNull SurfaceTexture surface) { + return false; + } + + @Override + public void onSurfaceTextureUpdated(@NotNull SurfaceTexture surface) { + + } + + private class onBufferingUpdate implements Runnable { + @Override + public void run() { + if (simpleExoPlayer != null) { + final int percent = simpleExoPlayer.getBufferedPercentage(); + handler.post(() -> jzvd.setBufferProgress(percent)); + if (percent < 100) { + handler.postDelayed(callback, 300); + } else { + handler.removeCallbacks(callback); + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java b/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java deleted file mode 100644 index 4683201..0000000 --- a/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.dcms.utils; - -import androidx.core.content.FileProvider; - -public class VersionUpgradeFileProvider extends FileProvider { -} diff --git a/app/src/main/java/com/casic/dcms/utils/WaterImageFileProvider.java b/app/src/main/java/com/casic/dcms/utils/WaterImageFileProvider.java deleted file mode 100644 index 4102901..0000000 --- a/app/src/main/java/com/casic/dcms/utils/WaterImageFileProvider.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.dcms.utils; - -import androidx.core.content.FileProvider; - -public class WaterImageFileProvider extends FileProvider { -} diff --git a/app/src/main/java/com/casic/dcms/utils/provider/CompressVideoFileProvider.java b/app/src/main/java/com/casic/dcms/utils/provider/CompressVideoFileProvider.java new file mode 100644 index 0000000..a0329b5 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/provider/CompressVideoFileProvider.java @@ -0,0 +1,6 @@ +package com.casic.dcms.utils.provider; + +import androidx.core.content.FileProvider; + +public class CompressVideoFileProvider extends FileProvider { +} diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index b1adeb9..75ac52e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -1,14 +1,15 @@ package com.casic.dcms.ui; import android.annotation.SuppressLint; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; +import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -18,7 +19,6 @@ import android.widget.PopupWindow; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -47,12 +47,13 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.TimeOrDateUtil; import com.casic.dcms.utils.ToastHelper; import com.casic.dcms.widgets.VoicePlayView; -import com.iceteck.silicompressorr.SiliCompressor; +import com.google.gson.Gson; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; @@ -65,10 +66,10 @@ import com.qmuiteam.qmui.widget.popup.QMUIPopup; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import com.zolad.videoslimmer.VideoSlimmer; import java.io.File; import java.io.IOException; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ public class CaseUploadActivity extends BaseCaseActivity implements View.OnClickListener, View.OnTouchListener, ICaseLargeClassView, ICaseSmallClassView, ICaseSubmitCaseView, IUploadFileView { - private Context context = this; @BindView(R.id.caseLayout) LinearLayout caseLayout; @BindView(R.id.caseClassView) @@ -116,12 +116,15 @@ @BindView(R.id.submitButton) QMUIRoundButton submitButton; + private static final String TAG = "CaseUploadActivity"; + private Context context = this; private CaseLargeClassPresenterImpl caseLargeClassPresenter; private CaseSmallClassPresenterImpl caseSmallClassPresenter; private CaseSubmitPresenterImpl caseSubmitPresenter; private List largeClassBeans; private List smallClassBeans; - private QMUITipDialog submitDialog, qmuiTipDialog; + private QMUITipDialog submitDialog; + private ProgressDialog progressDialog; private UploadImagePresenterImpl uploadImagePresenter; private List imageList = new ArrayList<>();//服务器返回的拍照数据集 private ArrayList realPaths = new ArrayList<>();//真是图片路径 @@ -136,7 +139,6 @@ private String audioUrl, videoUrl; private AudioRecodeHelper audioRecodeHelper; private PopupWindow popWindow; - private static WeakReferenceHandler weakReferenceHandler; private boolean isFirstEnter = true; @Override @@ -156,15 +158,18 @@ caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord("提交中,请稍后") .create(); - qmuiTipDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("视频压缩中,请稍后") - .create(); - weakReferenceHandler = new WeakReferenceHandler(this); + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("视频压缩中..."); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCancelable(false); + progressDialog.setCanceledOnTouchOutside(false); + uploadImagePresenter = new UploadImagePresenterImpl(this); uploadAudioPresenter = new UploadAudioPresenterImpl(this); uploadVideoPresenter = new UploadVideoPresenterImpl(this); @@ -179,7 +184,6 @@ public void initEvent() { voiceView.setOnTouchListener(this); submitButton.setChangeAlphaWhenPress(true); - //录音相关 View view = View.inflate(this, R.layout.popu_microphone, null); int popWidth = (int) (QMUIDisplayHelper.getScreenWidth(this) * 0.35); @@ -340,6 +344,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -378,29 +383,25 @@ case PictureConfig.PREVIEW_VIDEO_CODE: LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0); //"realPath":"/storage/emulated/0/Movies/VID_20210426_17552226.mp4" + Log.d(TAG, "onActivityResult: " + new Gson().toJson(media)); //需要手动压缩视频 String mediaRealPath = media.getRealPath(); + if (TextUtils.isEmpty(mediaRealPath)) { + //部分手机getRealPath可能为空,需要备用路径 + mediaRealPath = media.getPath(); + } + if (TextUtils.isEmpty(mediaRealPath) || mediaRealPath.equals("")) { + //如果默认和备用路径还是为空,则不压缩上传 + ToastHelper.showToast("操作失败,无法获取有效的视频文件", ToastHelper.ERROR); + return; + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(mediaRealPath); + String defaultRotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + String defaultBitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - qmuiTipDialog.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - /** - * 视频压缩 - * 第一个参数:视频源文件路径 - * 第二个参数:压缩后视频保存的路径 - */ - String comPressPath = SiliCompressor.with(context).compressVideo(mediaRealPath, FileUtils.getVideoCompressPath()); - Message message = weakReferenceHandler.obtainMessage(); - message.what = 20210427; - message.obj = comPressPath; - weakReferenceHandler.sendMessage(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); + assert defaultRotation != null; + compressVideo(mediaRealPath, defaultRotation, defaultBitrate); break; case Constant.REQUEST_MAP_CODE: if (data == null) { @@ -421,27 +422,46 @@ } } - private static class WeakReferenceHandler extends Handler { - private WeakReference reference; - - private WeakReferenceHandler(CaseUploadActivity activity) { - reference = new WeakReference<>(activity); + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = Constant.DEFAULT_WIDTH / 2; + height = Constant.DEFAULT_HEIGHT / 2; + } else { + width = Constant.DEFAULT_HEIGHT / 2; + height = Constant.DEFAULT_WIDTH / 2; } - - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - CaseUploadActivity caseUploadActivity = reference.get(); - if (msg.what == 20210427) { - caseUploadActivity.qmuiTipDialog.dismiss(); - String comPressPath = (String) msg.obj; - if (!TextUtils.isEmpty(comPressPath)) { - caseUploadActivity.uploadVideoPresenter.onReadyRetrofitRequest(new File(comPressPath)); - } else { - ToastHelper.showToast("案卷视频上传失败", ToastHelper.ERROR); - } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = Constant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, Constant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); } - } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadVideoPresenter.onReadyRetrofitRequest(new File(outputVideoFile)); + } else { + ToastHelper.showToast("压缩失败", ToastHelper.ERROR); + } + progressDialog.dismiss(); + } + }); } /** @@ -614,7 +634,7 @@ videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); String completeURL = StringHelper.appendCompleteURL(videoUrl); - videoPlayerView.setUp(completeURL, ""); + videoPlayerView.setUp(completeURL, "", Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java new file mode 100644 index 0000000..10bfc1b --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java @@ -0,0 +1,332 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseCaseActivity; +import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.OtherUtils; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CaseUploadPackageActivity extends BaseCaseActivity implements View.OnClickListener, + IUploadFileView, ICaseSubmitCaseView { + + private Context context = CaseUploadPackageActivity.this; + @BindView(R.id.shopView) + TextView shopView; + @BindView(R.id.communityView) + EditText communityView; + @BindView(R.id.longitudeView) + TextView longitudeView; + @BindView(R.id.latitudeView) + TextView latitudeView; + @BindView(R.id.shopKeeperView) + EditText shopKeeperView; + @BindView(R.id.phoneNumberView) + EditText phoneNumberView; + @BindView(R.id.caseLocationView) + EditText caseLocationView; + @BindView(R.id.caseDetailEditView) + EditText caseDetailEditView; + @BindView(R.id.selectedResultView) + RecyclerView selectedResultView; + @BindView(R.id.addImageView) + ImageView addImageView; + @BindView(R.id.submitButton) + QMUIRoundButton submitButton; + + private UploadImagePresenterImpl uploadImagePresenter; + private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; + private ImageRecycleViewAdapter imageAdapter; + private QMUITipDialog submitDialog; + private ArrayList realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private String gridId, shopID; + + @Override + public int initLayoutView() { + return R.layout.activity_package; + } + + @Override + protected String setTitleName() { + return "三包上报"; + } + + @Override + public void initData() { + uploadImagePresenter = new UploadImagePresenterImpl(this); + shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + imageAdapter = new ImageRecycleViewAdapter(this); + selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); + selectedResultView.addItemDecoration(new ItemDecorationSpace()); + selectedResultView.setAdapter(imageAdapter); + } + + @Override + public void initEvent() { + submitButton.setChangeAlphaWhenPress(true); + } + + @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.shopLayout: + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", "三包上报"); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .setCanceledOnTouchOutside(false) + .create().show(); + break; + case R.id.submitButton: + submitCase(); + break; + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } + double longitude = data.getDoubleExtra("longitude", 0); + double latitude = data.getDoubleExtra("latitude", 0); + gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String shopName = data.getStringExtra("shopName"); + shopID = data.getStringExtra("shopID"); + + longitudeView.setText(String.valueOf(longitude)); + latitudeView.setText(String.valueOf(latitude)); + communityView.setText(community); + shopView.setText(shopName); + break; + default: + break; + } + } + } + + /** + * 案卷提交 + */ + private void submitCase() { + String longitude = longitudeView.getText().toString(); + String latitude = latitudeView.getText().toString(); + if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { + ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); + return; + } + String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(shopKeeper)) { + ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); + return; + } + String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(phoneNumber)) { + ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); + return; + } + if (StringHelper.isPhoneNumber(phoneNumber)) { + String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(fieldIntro)) { + ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); + return; + } + String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(description)) { + ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); + return; + } + if (imageAdapter.getItemCount() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } + shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, + "2", "1", + gridId.substring(0, 6), + gridId.substring(0, 9), + gridId.substring(0, 12), + gridId, description, fieldIntro, + StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); + } else { + ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.dismiss(); + } + + @Override + public void obtainSubmitResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); + finish(); + } else { + ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); + } + } + + @Override + public void obtainDataFail() { + ToastHelper.showToast("操作失败", ToastHelper.ERROR); + } + + @Override + public void obtainUploadAudioResult(ActionResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 2) { + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + imageAdapter.setMediaList(realPaths); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + OtherUtils.showBigImage(context, position, realPaths); + } + }); + //删除按钮点击事件 + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + mediaList.remove(position); + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } else { + ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); + } + } + } + + @Override + public void obtainUploadVideoResult(ActionResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java index 67a0340..7750f8a 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java @@ -242,6 +242,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java index e27a310..d364d7c 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -179,7 +180,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java index f0e437a..d28d4b2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -44,6 +44,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -285,7 +286,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -518,6 +519,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java deleted file mode 100644 index 1ba1d5b..0000000 --- a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java +++ /dev/null @@ -1,331 +0,0 @@ -package com.casic.dcms.ui; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.text.TextUtils; -import android.view.View; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.ImageRecycleViewAdapter; -import com.casic.dcms.base.BaseCaseActivity; -import com.casic.dcms.bean.ActionResultBean; -import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; -import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; -import com.casic.dcms.mvp.view.ICaseSubmitCaseView; -import com.casic.dcms.mvp.view.IUploadFileView; -import com.casic.dcms.utils.Constant; -import com.casic.dcms.utils.FileUtils; -import com.casic.dcms.utils.GlideLoadEngine; -import com.casic.dcms.utils.ItemDecorationSpace; -import com.casic.dcms.utils.OtherUtils; -import com.casic.dcms.utils.StringHelper; -import com.casic.dcms.utils.ToastHelper; -import com.luck.picture.lib.PictureSelector; -import com.luck.picture.lib.config.PictureConfig; -import com.luck.picture.lib.config.PictureMimeType; -import com.luck.picture.lib.entity.LocalMedia; -import com.luck.picture.lib.tools.PictureFileUtils; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; -import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.OnClick; - -public class ThreePackageUploadActivity extends BaseCaseActivity implements View.OnClickListener, - IUploadFileView, ICaseSubmitCaseView { - - private Context context = ThreePackageUploadActivity.this; - @BindView(R.id.shopView) - TextView shopView; - @BindView(R.id.communityView) - EditText communityView; - @BindView(R.id.longitudeView) - TextView longitudeView; - @BindView(R.id.latitudeView) - TextView latitudeView; - @BindView(R.id.shopKeeperView) - EditText shopKeeperView; - @BindView(R.id.phoneNumberView) - EditText phoneNumberView; - @BindView(R.id.caseLocationView) - EditText caseLocationView; - @BindView(R.id.caseDetailEditView) - EditText caseDetailEditView; - @BindView(R.id.selectedResultView) - RecyclerView selectedResultView; - @BindView(R.id.addImageView) - ImageView addImageView; - @BindView(R.id.submitButton) - QMUIRoundButton submitButton; - - private UploadImagePresenterImpl uploadImagePresenter; - private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; - private ImageRecycleViewAdapter imageAdapter; - private QMUITipDialog submitDialog; - private ArrayList realPaths = new ArrayList<>();//真是图片路径 - private List mediaList = new ArrayList<>();//上传到服务器的数据集 - private String gridId, shopID; - - @Override - public int initLayoutView() { - return R.layout.activity_package; - } - - @Override - protected String setTitleName() { - return "三包上报"; - } - - @Override - public void initData() { - uploadImagePresenter = new UploadImagePresenterImpl(this); - shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); - submitDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("提交中,请稍后") - .create(); - imageAdapter = new ImageRecycleViewAdapter(this); - selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); - selectedResultView.addItemDecoration(new ItemDecorationSpace()); - selectedResultView.setAdapter(imageAdapter); - } - - @Override - public void initEvent() { - submitButton.setChangeAlphaWhenPress(true); - } - - @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.shopLayout: - Intent intent = new Intent(this, ArcGISMapActivity.class); - intent.putExtra("type", "三包上报"); - startActivityForResult(intent, Constant.REQUEST_MAP_CODE); - break; - case R.id.addImageView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("相册中选取", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //选图 - selectPicture(); - } - }) - .addItem("相机拍照", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //拍照 - takePicture(); - } - }) - .setCanceledOnTouchOutside(false) - .create().show(); - break; - case R.id.submitButton: - submitCase(); - break; - } - } - - private void selectPicture() { - PictureSelector.create(this) - .openGallery(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(2) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.CHOOSE_REQUEST); - } - - private void takePicture() { - PictureSelector.create(this) - .openCamera(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(1) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.REQUEST_CAMERA); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK) { - switch (requestCode) { - case PictureConfig.CHOOSE_REQUEST: - List selectList = PictureSelector.obtainMultipleResult(data); - for (LocalMedia media : selectList) { - String mediaCompressPath = media.getCompressPath(); - uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); - } - break; - case PictureConfig.REQUEST_CAMERA: - LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); - uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); - break; - case Constant.REQUEST_MAP_CODE: - if (data == null) { - return; - } - double longitude = data.getDoubleExtra("longitude", 0); - double latitude = data.getDoubleExtra("latitude", 0); - gridId = data.getStringExtra("gridId"); - String community = data.getStringExtra("community"); - String shopName = data.getStringExtra("shopName"); - shopID = data.getStringExtra("shopID"); - - longitudeView.setText(String.valueOf(longitude)); - latitudeView.setText(String.valueOf(latitude)); - communityView.setText(community); - shopView.setText(shopName); - break; - default: - break; - } - } - } - - /** - * 案卷提交 - */ - private void submitCase() { - String longitude = longitudeView.getText().toString(); - String latitude = latitudeView.getText().toString(); - if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { - ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); - return; - } - String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(shopKeeper)) { - ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); - return; - } - String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(phoneNumber)) { - ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); - return; - } - if (StringHelper.isPhoneNumber(phoneNumber)) { - String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(fieldIntro)) { - ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); - return; - } - String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(description)) { - ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); - return; - } - if (imageAdapter.getItemCount() != 2) { - ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); - return; - } - shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, - "2", "1", - gridId.substring(0, 6), - gridId.substring(0, 9), - gridId.substring(0, 12), - gridId, description, fieldIntro, - StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); - } else { - ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); - } - } - - @Override - public void showProgress() { - submitDialog.show(); - } - - @Override - public void hideProgress() { - submitDialog.dismiss(); - } - - @Override - public void obtainSubmitResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); - finish(); - } else { - ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); - } - } - - @Override - public void obtainDataFail() { - ToastHelper.showToast("操作失败", ToastHelper.ERROR); - } - - @Override - public void obtainUploadAudioResult(ActionResultBean resultBean) { - - } - - @Override - public void obtainUploadImageResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - PictureFileUtils.deleteAllCacheDirFile(this); - /** - * 系统路径static拼接图片返回路径 - * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg - */ - //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg - int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 2) { - String url = resultBean.getData(); - mediaList.add(url); - realPaths.add(StringHelper.appendCompleteURL(url)); - if (realPaths.size() == 2) { - addImageView.setVisibility(View.GONE); - } - imageAdapter.setMediaList(realPaths); - //九宫格点击事件 - imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { - @Override - public void onClick(int position) { - OtherUtils.showBigImage(context, position, realPaths); - } - }); - //删除按钮点击事件 - imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { - @Override - public void onClick(int position) { - mediaList.remove(position); - realPaths.remove(position); - imageAdapter.setMediaList(realPaths); - if (realPaths.size() != 2) { - addImageView.setVisibility(View.VISIBLE); - } - } - }); - } else { - ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); - } - } - } - - @Override - public void obtainUploadVideoResult(ActionResultBean resultBean) { - - } -} diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java index 2ae9aa6..5dcf237 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java @@ -24,13 +24,13 @@ import com.casic.dcms.ui.CaseOnMapActivity; import com.casic.dcms.ui.CaseSearchActivity; import com.casic.dcms.ui.CaseUploadActivity; +import com.casic.dcms.ui.CaseUploadPackageActivity; import com.casic.dcms.ui.CaseUploadQuicklyActivity; import com.casic.dcms.ui.CaseVerifyActivity; import com.casic.dcms.ui.DataAnalysisActivity; import com.casic.dcms.ui.OvertimeCaseActivity; import com.casic.dcms.ui.PersonOnlineActivity; import com.casic.dcms.ui.PublicToiletActivity; -import com.casic.dcms.ui.ThreePackageUploadActivity; import com.casic.dcms.ui.UrgentCaseActivity; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -119,7 +119,7 @@ intent.setClass(context, CaseUploadQuicklyActivity.class); break; case "三包上报": - intent.setClass(context, ThreePackageUploadActivity.class); + intent.setClass(context, CaseUploadPackageActivity.class); break; case "案卷核实": intent.setClass(context, CaseVerifyActivity.class); diff --git a/app/src/main/java/com/casic/dcms/utils/Constant.java b/app/src/main/java/com/casic/dcms/utils/Constant.java index d948e35..036f762 100644 --- a/app/src/main/java/com/casic/dcms/utils/Constant.java +++ b/app/src/main/java/com/casic/dcms/utils/Constant.java @@ -40,6 +40,9 @@ public static final int REQUEST_REFRESH_CODE = 9002; public static final int PAGE_LIMIT = 15; + public static final int BITRATE = 200 * 360 * 30; + public static final int DEFAULT_WIDTH = 720; + public static final int DEFAULT_HEIGHT = 1280; public static final int CASE_HANDLE = 0; public static final int CASE_VERIFY = 1; diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index c07978f..315a587 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -2,7 +2,6 @@ import android.annotation.SuppressLint; import android.content.Context; -import android.os.Environment; import android.util.Log; import java.io.File; @@ -19,6 +18,7 @@ private static File imageDir; private static File waterImageDir; private static File downloadDir; + private static File videoDir; public static void initFileConfig(Context context) { FileUtils.context = context; @@ -57,6 +57,13 @@ Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); } } + videoDir = new File(parentDir, "CompressVideoFile"); + if (!videoDir.exists()) { + boolean mkVideoDir = videoDir.mkdir(); + if (mkVideoDir) { + Log.d(TAG, "initFileConfig: 创建CompressVideoFile文件夹"); + } + } } static File getOutputAudioFile() { @@ -160,7 +167,32 @@ return downloadDir.toString(); } - public static String getVideoCompressPath() { - return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); + public static String getOutputVideoFile() { + if (videoDir == null) { + File parentDir = new File(context.getFilesDir().getAbsolutePath(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "getOutputVideoFile: 创建Casic文件夹"); + } + } + videoDir = new File(parentDir, "CompressVideoFile"); + if (!videoDir.exists()) { + boolean mkVideoDir = videoDir.mkdir(); + if (mkVideoDir) { + Log.d(TAG, "getOutputVideoFile: 创建CompressVideoFile文件夹"); + } + } + } + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); + File videoFile = new File(videoDir + File.separator + "VID_" + timeStamp + ".mp4"); + if (!videoFile.exists()) { + try { + videoFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return videoFile.getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java b/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java new file mode 100644 index 0000000..b82c57d --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java @@ -0,0 +1,320 @@ +package com.casic.dcms.utils; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.net.Uri; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; +import android.view.Surface; + +import com.casic.dcms.R; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.DefaultLoadControl; +import com.google.android.exoplayer2.DefaultRenderersFactory; +import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.LoadControl; +import com.google.android.exoplayer2.PlaybackParameters; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.RenderersFactory; +import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.source.MediaSource; +import com.google.android.exoplayer2.source.ProgressiveMediaSource; +import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.source.hls.HlsMediaSource; +import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; +import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.trackselection.TrackSelector; +import com.google.android.exoplayer2.upstream.BandwidthMeter; +import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DefaultAllocator; +import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; +import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.util.Util; +import com.google.android.exoplayer2.video.VideoListener; + +import org.jetbrains.annotations.NotNull; + +import cn.jzvd.JZMediaInterface; +import cn.jzvd.Jzvd; + +public class JzExoMedia extends JZMediaInterface implements Player.EventListener, VideoListener { + + private static final String TAG = "JzExoMedia"; + private SimpleExoPlayer simpleExoPlayer; + private long previousSeek = 0; + private Runnable callback; + + public JzExoMedia(Jzvd jzvd) { + super(jzvd); + } + + @Override + public void start() { + simpleExoPlayer.setPlayWhenReady(true); + } + + @Override + public void prepare() { + Context context = jzvd.getContext(); + release(); + mMediaHandlerThread = new HandlerThread("JZVD"); + mMediaHandlerThread.start(); + mMediaHandler = new Handler(context.getMainLooper());//主线程还是非主线程,就在这里 + handler = new Handler(); + mMediaHandler.post(() -> { + AdaptiveTrackSelection.Factory factory = new AdaptiveTrackSelection.Factory(); + TrackSelector trackSelector = new DefaultTrackSelector(context, factory); + + LoadControl loadControl = new DefaultLoadControl.Builder() + .setAllocator(new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE)) + .setBufferDurationsMs(360000, 600000, 1000, 5000) + .setPrioritizeTimeOverSizeThresholds(false) + .setTargetBufferBytes(C.LENGTH_UNSET) + .createDefaultLoadControl(); + + BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder(context).build(); + // 2. Create the player + + RenderersFactory renderersFactory = new DefaultRenderersFactory(context); + simpleExoPlayer = new SimpleExoPlayer.Builder(context, renderersFactory) + .setTrackSelector(trackSelector) + .setLoadControl(loadControl) + .setBandwidthMeter(bandwidthMeter) + .build(); + // Produces DataSource instances through which media data is loaded. + DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, + Util.getUserAgent(context, context.getResources().getString(R.string.app_name))); + + String currUrl = jzvd.jzDataSource.getCurrentUrl().toString(); + MediaSource videoSource; + if (currUrl.contains(".m3u8")) { + videoSource = new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(currUrl)); + //addEventListener 这里只有两个参数都要传入值才可以成功设置 + // 否者会被断言 Assertions.checkArgument(handler != null && eventListener != null); + // 并且报错 IllegalArgumentException() 所以不需要添加监听器时 注释掉 + // videoSource .addEventListener( handler, null); + } else { + videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(currUrl)); + } + simpleExoPlayer.addVideoListener(this); + Log.e(TAG, "URL Link = " + currUrl); + + simpleExoPlayer.addListener(this); + boolean isLoop = jzvd.jzDataSource.looping; + if (isLoop) { + simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_ONE); + } else { + simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_OFF); + } + simpleExoPlayer.prepare(videoSource); + simpleExoPlayer.setPlayWhenReady(true); + callback = new onBufferingUpdate(); + if (jzvd.textureView != null) { + SurfaceTexture surfaceTexture = jzvd.textureView.getSurfaceTexture(); + if (surfaceTexture != null) { + simpleExoPlayer.setVideoSurface(new Surface(surfaceTexture)); + } + } + }); + } + + @Override + public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) { + handler.post(() -> jzvd.onVideoSizeChanged((int) (width * pixelWidthHeightRatio), height)); + } + + @Override + public void onRenderedFirstFrame() { + + } + + @Override + public void pause() { + simpleExoPlayer.setPlayWhenReady(false); + } + + @Override + public boolean isPlaying() { + return simpleExoPlayer.getPlayWhenReady(); + } + + @Override + public void seekTo(long time) { + if (simpleExoPlayer == null) { + return; + } + if (time != previousSeek) { + if (time >= simpleExoPlayer.getBufferedPosition()) { + jzvd.onStatePreparingPlaying(); + } + simpleExoPlayer.seekTo(time); + previousSeek = time; + jzvd.seekToInAdvance = time; + } + } + + @Override + public void release() { + if (mMediaHandler != null && mMediaHandlerThread != null && simpleExoPlayer != null) { + HandlerThread tmpHandlerThread = mMediaHandlerThread; + SimpleExoPlayer tmpMediaPlayer = simpleExoPlayer; + JZMediaInterface.SAVED_SURFACE = null; + mMediaHandler.post(() -> { + tmpMediaPlayer.release();//release就不能放到主线程里,界面会卡顿 + tmpHandlerThread.quit(); + }); + simpleExoPlayer = null; + } + } + + @Override + public long getCurrentPosition() { + if (simpleExoPlayer != null) + return simpleExoPlayer.getCurrentPosition(); + else return 0; + } + + @Override + public long getDuration() { + if (simpleExoPlayer != null) + return simpleExoPlayer.getDuration(); + else return 0; + } + + @Override + public void setVolume(float leftVolume, float rightVolume) { + simpleExoPlayer.setVolume(leftVolume); + simpleExoPlayer.setVolume(rightVolume); + } + + @Override + public void setSpeed(float speed) { + PlaybackParameters playbackParameters = new PlaybackParameters(speed, 1.0F); + simpleExoPlayer.setPlaybackParameters(playbackParameters); + } + + @Override + public void onTimelineChanged(final Timeline timeline, Object manifest, final int reason) { + + } + + @Override + public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { + + } + + @Override + public void onLoadingChanged(boolean isLoading) { + + } + + @Override + public void onPlayerStateChanged(final boolean playWhenReady, final int playbackState) { + Log.e(TAG, "onPlayerStateChanged" + playbackState + "/ready=" + playWhenReady); + handler.post(() -> { + switch (playbackState) { + case Player.STATE_IDLE: { + } + break; + case Player.STATE_BUFFERING: { + jzvd.onStatePreparingPlaying(); + handler.post(callback); + } + break; + case Player.STATE_READY: { + if (playWhenReady) { + jzvd.onStatePlaying(); + } + } + break; + case Player.STATE_ENDED: { + jzvd.onCompletion(); + } + break; + } + }); + } + + @Override + public void onRepeatModeChanged(int repeatMode) { + + } + + @Override + public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { + + } + + @Override + public void onPlayerError(ExoPlaybackException error) { + Log.e(TAG, "onPlayerError" + error.toString()); + handler.post(() -> jzvd.onError(1000, 1000)); + } + + @Override + public void onPositionDiscontinuity(int reason) { + + } + + @Override + public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { + + } + + @Override + public void onSeekProcessed() { + handler.post(() -> jzvd.onSeekComplete()); + } + + @Override + public void setSurface(Surface surface) { + if (simpleExoPlayer != null) { + simpleExoPlayer.setVideoSurface(surface); + } else { + Log.e("AGVideo", "simpleExoPlayer为空"); + } + } + + @Override + public void onSurfaceTextureAvailable(@NotNull SurfaceTexture surface, int width, int height) { + if (SAVED_SURFACE == null) { + SAVED_SURFACE = surface; + prepare(); + } else { + jzvd.textureView.setSurfaceTexture(SAVED_SURFACE); + } + } + + @Override + public void onSurfaceTextureSizeChanged(@NotNull SurfaceTexture surface, int width, int height) { + + } + + @Override + public boolean onSurfaceTextureDestroyed(@NotNull SurfaceTexture surface) { + return false; + } + + @Override + public void onSurfaceTextureUpdated(@NotNull SurfaceTexture surface) { + + } + + private class onBufferingUpdate implements Runnable { + @Override + public void run() { + if (simpleExoPlayer != null) { + final int percent = simpleExoPlayer.getBufferedPercentage(); + handler.post(() -> jzvd.setBufferProgress(percent)); + if (percent < 100) { + handler.postDelayed(callback, 300); + } else { + handler.removeCallbacks(callback); + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java b/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java deleted file mode 100644 index 4683201..0000000 --- a/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.dcms.utils; - -import androidx.core.content.FileProvider; - -public class VersionUpgradeFileProvider extends FileProvider { -} diff --git a/app/src/main/java/com/casic/dcms/utils/WaterImageFileProvider.java b/app/src/main/java/com/casic/dcms/utils/WaterImageFileProvider.java deleted file mode 100644 index 4102901..0000000 --- a/app/src/main/java/com/casic/dcms/utils/WaterImageFileProvider.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.dcms.utils; - -import androidx.core.content.FileProvider; - -public class WaterImageFileProvider extends FileProvider { -} diff --git a/app/src/main/java/com/casic/dcms/utils/provider/CompressVideoFileProvider.java b/app/src/main/java/com/casic/dcms/utils/provider/CompressVideoFileProvider.java new file mode 100644 index 0000000..a0329b5 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/provider/CompressVideoFileProvider.java @@ -0,0 +1,6 @@ +package com.casic.dcms.utils.provider; + +import androidx.core.content.FileProvider; + +public class CompressVideoFileProvider extends FileProvider { +} diff --git a/app/src/main/java/com/casic/dcms/utils/provider/VersionUpgradeFileProvider.java b/app/src/main/java/com/casic/dcms/utils/provider/VersionUpgradeFileProvider.java new file mode 100644 index 0000000..7f2aa50 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/provider/VersionUpgradeFileProvider.java @@ -0,0 +1,6 @@ +package com.casic.dcms.utils.provider; + +import androidx.core.content.FileProvider; + +public class VersionUpgradeFileProvider extends FileProvider { +} diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index b1adeb9..75ac52e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -1,14 +1,15 @@ package com.casic.dcms.ui; import android.annotation.SuppressLint; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; +import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -18,7 +19,6 @@ import android.widget.PopupWindow; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -47,12 +47,13 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.TimeOrDateUtil; import com.casic.dcms.utils.ToastHelper; import com.casic.dcms.widgets.VoicePlayView; -import com.iceteck.silicompressorr.SiliCompressor; +import com.google.gson.Gson; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; @@ -65,10 +66,10 @@ import com.qmuiteam.qmui.widget.popup.QMUIPopup; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import com.zolad.videoslimmer.VideoSlimmer; import java.io.File; import java.io.IOException; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ public class CaseUploadActivity extends BaseCaseActivity implements View.OnClickListener, View.OnTouchListener, ICaseLargeClassView, ICaseSmallClassView, ICaseSubmitCaseView, IUploadFileView { - private Context context = this; @BindView(R.id.caseLayout) LinearLayout caseLayout; @BindView(R.id.caseClassView) @@ -116,12 +116,15 @@ @BindView(R.id.submitButton) QMUIRoundButton submitButton; + private static final String TAG = "CaseUploadActivity"; + private Context context = this; private CaseLargeClassPresenterImpl caseLargeClassPresenter; private CaseSmallClassPresenterImpl caseSmallClassPresenter; private CaseSubmitPresenterImpl caseSubmitPresenter; private List largeClassBeans; private List smallClassBeans; - private QMUITipDialog submitDialog, qmuiTipDialog; + private QMUITipDialog submitDialog; + private ProgressDialog progressDialog; private UploadImagePresenterImpl uploadImagePresenter; private List imageList = new ArrayList<>();//服务器返回的拍照数据集 private ArrayList realPaths = new ArrayList<>();//真是图片路径 @@ -136,7 +139,6 @@ private String audioUrl, videoUrl; private AudioRecodeHelper audioRecodeHelper; private PopupWindow popWindow; - private static WeakReferenceHandler weakReferenceHandler; private boolean isFirstEnter = true; @Override @@ -156,15 +158,18 @@ caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord("提交中,请稍后") .create(); - qmuiTipDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("视频压缩中,请稍后") - .create(); - weakReferenceHandler = new WeakReferenceHandler(this); + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("视频压缩中..."); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCancelable(false); + progressDialog.setCanceledOnTouchOutside(false); + uploadImagePresenter = new UploadImagePresenterImpl(this); uploadAudioPresenter = new UploadAudioPresenterImpl(this); uploadVideoPresenter = new UploadVideoPresenterImpl(this); @@ -179,7 +184,6 @@ public void initEvent() { voiceView.setOnTouchListener(this); submitButton.setChangeAlphaWhenPress(true); - //录音相关 View view = View.inflate(this, R.layout.popu_microphone, null); int popWidth = (int) (QMUIDisplayHelper.getScreenWidth(this) * 0.35); @@ -340,6 +344,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -378,29 +383,25 @@ case PictureConfig.PREVIEW_VIDEO_CODE: LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0); //"realPath":"/storage/emulated/0/Movies/VID_20210426_17552226.mp4" + Log.d(TAG, "onActivityResult: " + new Gson().toJson(media)); //需要手动压缩视频 String mediaRealPath = media.getRealPath(); + if (TextUtils.isEmpty(mediaRealPath)) { + //部分手机getRealPath可能为空,需要备用路径 + mediaRealPath = media.getPath(); + } + if (TextUtils.isEmpty(mediaRealPath) || mediaRealPath.equals("")) { + //如果默认和备用路径还是为空,则不压缩上传 + ToastHelper.showToast("操作失败,无法获取有效的视频文件", ToastHelper.ERROR); + return; + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(mediaRealPath); + String defaultRotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + String defaultBitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - qmuiTipDialog.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - /** - * 视频压缩 - * 第一个参数:视频源文件路径 - * 第二个参数:压缩后视频保存的路径 - */ - String comPressPath = SiliCompressor.with(context).compressVideo(mediaRealPath, FileUtils.getVideoCompressPath()); - Message message = weakReferenceHandler.obtainMessage(); - message.what = 20210427; - message.obj = comPressPath; - weakReferenceHandler.sendMessage(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); + assert defaultRotation != null; + compressVideo(mediaRealPath, defaultRotation, defaultBitrate); break; case Constant.REQUEST_MAP_CODE: if (data == null) { @@ -421,27 +422,46 @@ } } - private static class WeakReferenceHandler extends Handler { - private WeakReference reference; - - private WeakReferenceHandler(CaseUploadActivity activity) { - reference = new WeakReference<>(activity); + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = Constant.DEFAULT_WIDTH / 2; + height = Constant.DEFAULT_HEIGHT / 2; + } else { + width = Constant.DEFAULT_HEIGHT / 2; + height = Constant.DEFAULT_WIDTH / 2; } - - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - CaseUploadActivity caseUploadActivity = reference.get(); - if (msg.what == 20210427) { - caseUploadActivity.qmuiTipDialog.dismiss(); - String comPressPath = (String) msg.obj; - if (!TextUtils.isEmpty(comPressPath)) { - caseUploadActivity.uploadVideoPresenter.onReadyRetrofitRequest(new File(comPressPath)); - } else { - ToastHelper.showToast("案卷视频上传失败", ToastHelper.ERROR); - } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = Constant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, Constant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); } - } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadVideoPresenter.onReadyRetrofitRequest(new File(outputVideoFile)); + } else { + ToastHelper.showToast("压缩失败", ToastHelper.ERROR); + } + progressDialog.dismiss(); + } + }); } /** @@ -614,7 +634,7 @@ videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); String completeURL = StringHelper.appendCompleteURL(videoUrl); - videoPlayerView.setUp(completeURL, ""); + videoPlayerView.setUp(completeURL, "", Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java new file mode 100644 index 0000000..10bfc1b --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java @@ -0,0 +1,332 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseCaseActivity; +import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.OtherUtils; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CaseUploadPackageActivity extends BaseCaseActivity implements View.OnClickListener, + IUploadFileView, ICaseSubmitCaseView { + + private Context context = CaseUploadPackageActivity.this; + @BindView(R.id.shopView) + TextView shopView; + @BindView(R.id.communityView) + EditText communityView; + @BindView(R.id.longitudeView) + TextView longitudeView; + @BindView(R.id.latitudeView) + TextView latitudeView; + @BindView(R.id.shopKeeperView) + EditText shopKeeperView; + @BindView(R.id.phoneNumberView) + EditText phoneNumberView; + @BindView(R.id.caseLocationView) + EditText caseLocationView; + @BindView(R.id.caseDetailEditView) + EditText caseDetailEditView; + @BindView(R.id.selectedResultView) + RecyclerView selectedResultView; + @BindView(R.id.addImageView) + ImageView addImageView; + @BindView(R.id.submitButton) + QMUIRoundButton submitButton; + + private UploadImagePresenterImpl uploadImagePresenter; + private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; + private ImageRecycleViewAdapter imageAdapter; + private QMUITipDialog submitDialog; + private ArrayList realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private String gridId, shopID; + + @Override + public int initLayoutView() { + return R.layout.activity_package; + } + + @Override + protected String setTitleName() { + return "三包上报"; + } + + @Override + public void initData() { + uploadImagePresenter = new UploadImagePresenterImpl(this); + shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + imageAdapter = new ImageRecycleViewAdapter(this); + selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); + selectedResultView.addItemDecoration(new ItemDecorationSpace()); + selectedResultView.setAdapter(imageAdapter); + } + + @Override + public void initEvent() { + submitButton.setChangeAlphaWhenPress(true); + } + + @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.shopLayout: + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", "三包上报"); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .setCanceledOnTouchOutside(false) + .create().show(); + break; + case R.id.submitButton: + submitCase(); + break; + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } + double longitude = data.getDoubleExtra("longitude", 0); + double latitude = data.getDoubleExtra("latitude", 0); + gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String shopName = data.getStringExtra("shopName"); + shopID = data.getStringExtra("shopID"); + + longitudeView.setText(String.valueOf(longitude)); + latitudeView.setText(String.valueOf(latitude)); + communityView.setText(community); + shopView.setText(shopName); + break; + default: + break; + } + } + } + + /** + * 案卷提交 + */ + private void submitCase() { + String longitude = longitudeView.getText().toString(); + String latitude = latitudeView.getText().toString(); + if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { + ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); + return; + } + String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(shopKeeper)) { + ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); + return; + } + String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(phoneNumber)) { + ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); + return; + } + if (StringHelper.isPhoneNumber(phoneNumber)) { + String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(fieldIntro)) { + ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); + return; + } + String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(description)) { + ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); + return; + } + if (imageAdapter.getItemCount() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } + shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, + "2", "1", + gridId.substring(0, 6), + gridId.substring(0, 9), + gridId.substring(0, 12), + gridId, description, fieldIntro, + StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); + } else { + ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.dismiss(); + } + + @Override + public void obtainSubmitResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); + finish(); + } else { + ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); + } + } + + @Override + public void obtainDataFail() { + ToastHelper.showToast("操作失败", ToastHelper.ERROR); + } + + @Override + public void obtainUploadAudioResult(ActionResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 2) { + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + imageAdapter.setMediaList(realPaths); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + OtherUtils.showBigImage(context, position, realPaths); + } + }); + //删除按钮点击事件 + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + mediaList.remove(position); + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } else { + ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); + } + } + } + + @Override + public void obtainUploadVideoResult(ActionResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java index 67a0340..7750f8a 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java @@ -242,6 +242,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java index e27a310..d364d7c 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -179,7 +180,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java index f0e437a..d28d4b2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -44,6 +44,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -285,7 +286,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -518,6 +519,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java deleted file mode 100644 index 1ba1d5b..0000000 --- a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java +++ /dev/null @@ -1,331 +0,0 @@ -package com.casic.dcms.ui; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.text.TextUtils; -import android.view.View; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.ImageRecycleViewAdapter; -import com.casic.dcms.base.BaseCaseActivity; -import com.casic.dcms.bean.ActionResultBean; -import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; -import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; -import com.casic.dcms.mvp.view.ICaseSubmitCaseView; -import com.casic.dcms.mvp.view.IUploadFileView; -import com.casic.dcms.utils.Constant; -import com.casic.dcms.utils.FileUtils; -import com.casic.dcms.utils.GlideLoadEngine; -import com.casic.dcms.utils.ItemDecorationSpace; -import com.casic.dcms.utils.OtherUtils; -import com.casic.dcms.utils.StringHelper; -import com.casic.dcms.utils.ToastHelper; -import com.luck.picture.lib.PictureSelector; -import com.luck.picture.lib.config.PictureConfig; -import com.luck.picture.lib.config.PictureMimeType; -import com.luck.picture.lib.entity.LocalMedia; -import com.luck.picture.lib.tools.PictureFileUtils; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; -import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.OnClick; - -public class ThreePackageUploadActivity extends BaseCaseActivity implements View.OnClickListener, - IUploadFileView, ICaseSubmitCaseView { - - private Context context = ThreePackageUploadActivity.this; - @BindView(R.id.shopView) - TextView shopView; - @BindView(R.id.communityView) - EditText communityView; - @BindView(R.id.longitudeView) - TextView longitudeView; - @BindView(R.id.latitudeView) - TextView latitudeView; - @BindView(R.id.shopKeeperView) - EditText shopKeeperView; - @BindView(R.id.phoneNumberView) - EditText phoneNumberView; - @BindView(R.id.caseLocationView) - EditText caseLocationView; - @BindView(R.id.caseDetailEditView) - EditText caseDetailEditView; - @BindView(R.id.selectedResultView) - RecyclerView selectedResultView; - @BindView(R.id.addImageView) - ImageView addImageView; - @BindView(R.id.submitButton) - QMUIRoundButton submitButton; - - private UploadImagePresenterImpl uploadImagePresenter; - private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; - private ImageRecycleViewAdapter imageAdapter; - private QMUITipDialog submitDialog; - private ArrayList realPaths = new ArrayList<>();//真是图片路径 - private List mediaList = new ArrayList<>();//上传到服务器的数据集 - private String gridId, shopID; - - @Override - public int initLayoutView() { - return R.layout.activity_package; - } - - @Override - protected String setTitleName() { - return "三包上报"; - } - - @Override - public void initData() { - uploadImagePresenter = new UploadImagePresenterImpl(this); - shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); - submitDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("提交中,请稍后") - .create(); - imageAdapter = new ImageRecycleViewAdapter(this); - selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); - selectedResultView.addItemDecoration(new ItemDecorationSpace()); - selectedResultView.setAdapter(imageAdapter); - } - - @Override - public void initEvent() { - submitButton.setChangeAlphaWhenPress(true); - } - - @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.shopLayout: - Intent intent = new Intent(this, ArcGISMapActivity.class); - intent.putExtra("type", "三包上报"); - startActivityForResult(intent, Constant.REQUEST_MAP_CODE); - break; - case R.id.addImageView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("相册中选取", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //选图 - selectPicture(); - } - }) - .addItem("相机拍照", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //拍照 - takePicture(); - } - }) - .setCanceledOnTouchOutside(false) - .create().show(); - break; - case R.id.submitButton: - submitCase(); - break; - } - } - - private void selectPicture() { - PictureSelector.create(this) - .openGallery(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(2) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.CHOOSE_REQUEST); - } - - private void takePicture() { - PictureSelector.create(this) - .openCamera(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(1) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.REQUEST_CAMERA); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK) { - switch (requestCode) { - case PictureConfig.CHOOSE_REQUEST: - List selectList = PictureSelector.obtainMultipleResult(data); - for (LocalMedia media : selectList) { - String mediaCompressPath = media.getCompressPath(); - uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); - } - break; - case PictureConfig.REQUEST_CAMERA: - LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); - uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); - break; - case Constant.REQUEST_MAP_CODE: - if (data == null) { - return; - } - double longitude = data.getDoubleExtra("longitude", 0); - double latitude = data.getDoubleExtra("latitude", 0); - gridId = data.getStringExtra("gridId"); - String community = data.getStringExtra("community"); - String shopName = data.getStringExtra("shopName"); - shopID = data.getStringExtra("shopID"); - - longitudeView.setText(String.valueOf(longitude)); - latitudeView.setText(String.valueOf(latitude)); - communityView.setText(community); - shopView.setText(shopName); - break; - default: - break; - } - } - } - - /** - * 案卷提交 - */ - private void submitCase() { - String longitude = longitudeView.getText().toString(); - String latitude = latitudeView.getText().toString(); - if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { - ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); - return; - } - String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(shopKeeper)) { - ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); - return; - } - String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(phoneNumber)) { - ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); - return; - } - if (StringHelper.isPhoneNumber(phoneNumber)) { - String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(fieldIntro)) { - ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); - return; - } - String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(description)) { - ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); - return; - } - if (imageAdapter.getItemCount() != 2) { - ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); - return; - } - shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, - "2", "1", - gridId.substring(0, 6), - gridId.substring(0, 9), - gridId.substring(0, 12), - gridId, description, fieldIntro, - StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); - } else { - ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); - } - } - - @Override - public void showProgress() { - submitDialog.show(); - } - - @Override - public void hideProgress() { - submitDialog.dismiss(); - } - - @Override - public void obtainSubmitResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); - finish(); - } else { - ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); - } - } - - @Override - public void obtainDataFail() { - ToastHelper.showToast("操作失败", ToastHelper.ERROR); - } - - @Override - public void obtainUploadAudioResult(ActionResultBean resultBean) { - - } - - @Override - public void obtainUploadImageResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - PictureFileUtils.deleteAllCacheDirFile(this); - /** - * 系统路径static拼接图片返回路径 - * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg - */ - //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg - int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 2) { - String url = resultBean.getData(); - mediaList.add(url); - realPaths.add(StringHelper.appendCompleteURL(url)); - if (realPaths.size() == 2) { - addImageView.setVisibility(View.GONE); - } - imageAdapter.setMediaList(realPaths); - //九宫格点击事件 - imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { - @Override - public void onClick(int position) { - OtherUtils.showBigImage(context, position, realPaths); - } - }); - //删除按钮点击事件 - imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { - @Override - public void onClick(int position) { - mediaList.remove(position); - realPaths.remove(position); - imageAdapter.setMediaList(realPaths); - if (realPaths.size() != 2) { - addImageView.setVisibility(View.VISIBLE); - } - } - }); - } else { - ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); - } - } - } - - @Override - public void obtainUploadVideoResult(ActionResultBean resultBean) { - - } -} diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java index 2ae9aa6..5dcf237 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java @@ -24,13 +24,13 @@ import com.casic.dcms.ui.CaseOnMapActivity; import com.casic.dcms.ui.CaseSearchActivity; import com.casic.dcms.ui.CaseUploadActivity; +import com.casic.dcms.ui.CaseUploadPackageActivity; import com.casic.dcms.ui.CaseUploadQuicklyActivity; import com.casic.dcms.ui.CaseVerifyActivity; import com.casic.dcms.ui.DataAnalysisActivity; import com.casic.dcms.ui.OvertimeCaseActivity; import com.casic.dcms.ui.PersonOnlineActivity; import com.casic.dcms.ui.PublicToiletActivity; -import com.casic.dcms.ui.ThreePackageUploadActivity; import com.casic.dcms.ui.UrgentCaseActivity; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -119,7 +119,7 @@ intent.setClass(context, CaseUploadQuicklyActivity.class); break; case "三包上报": - intent.setClass(context, ThreePackageUploadActivity.class); + intent.setClass(context, CaseUploadPackageActivity.class); break; case "案卷核实": intent.setClass(context, CaseVerifyActivity.class); diff --git a/app/src/main/java/com/casic/dcms/utils/Constant.java b/app/src/main/java/com/casic/dcms/utils/Constant.java index d948e35..036f762 100644 --- a/app/src/main/java/com/casic/dcms/utils/Constant.java +++ b/app/src/main/java/com/casic/dcms/utils/Constant.java @@ -40,6 +40,9 @@ public static final int REQUEST_REFRESH_CODE = 9002; public static final int PAGE_LIMIT = 15; + public static final int BITRATE = 200 * 360 * 30; + public static final int DEFAULT_WIDTH = 720; + public static final int DEFAULT_HEIGHT = 1280; public static final int CASE_HANDLE = 0; public static final int CASE_VERIFY = 1; diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index c07978f..315a587 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -2,7 +2,6 @@ import android.annotation.SuppressLint; import android.content.Context; -import android.os.Environment; import android.util.Log; import java.io.File; @@ -19,6 +18,7 @@ private static File imageDir; private static File waterImageDir; private static File downloadDir; + private static File videoDir; public static void initFileConfig(Context context) { FileUtils.context = context; @@ -57,6 +57,13 @@ Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); } } + videoDir = new File(parentDir, "CompressVideoFile"); + if (!videoDir.exists()) { + boolean mkVideoDir = videoDir.mkdir(); + if (mkVideoDir) { + Log.d(TAG, "initFileConfig: 创建CompressVideoFile文件夹"); + } + } } static File getOutputAudioFile() { @@ -160,7 +167,32 @@ return downloadDir.toString(); } - public static String getVideoCompressPath() { - return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); + public static String getOutputVideoFile() { + if (videoDir == null) { + File parentDir = new File(context.getFilesDir().getAbsolutePath(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "getOutputVideoFile: 创建Casic文件夹"); + } + } + videoDir = new File(parentDir, "CompressVideoFile"); + if (!videoDir.exists()) { + boolean mkVideoDir = videoDir.mkdir(); + if (mkVideoDir) { + Log.d(TAG, "getOutputVideoFile: 创建CompressVideoFile文件夹"); + } + } + } + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); + File videoFile = new File(videoDir + File.separator + "VID_" + timeStamp + ".mp4"); + if (!videoFile.exists()) { + try { + videoFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return videoFile.getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java b/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java new file mode 100644 index 0000000..b82c57d --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java @@ -0,0 +1,320 @@ +package com.casic.dcms.utils; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.net.Uri; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; +import android.view.Surface; + +import com.casic.dcms.R; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.DefaultLoadControl; +import com.google.android.exoplayer2.DefaultRenderersFactory; +import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.LoadControl; +import com.google.android.exoplayer2.PlaybackParameters; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.RenderersFactory; +import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.source.MediaSource; +import com.google.android.exoplayer2.source.ProgressiveMediaSource; +import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.source.hls.HlsMediaSource; +import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; +import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.trackselection.TrackSelector; +import com.google.android.exoplayer2.upstream.BandwidthMeter; +import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DefaultAllocator; +import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; +import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.util.Util; +import com.google.android.exoplayer2.video.VideoListener; + +import org.jetbrains.annotations.NotNull; + +import cn.jzvd.JZMediaInterface; +import cn.jzvd.Jzvd; + +public class JzExoMedia extends JZMediaInterface implements Player.EventListener, VideoListener { + + private static final String TAG = "JzExoMedia"; + private SimpleExoPlayer simpleExoPlayer; + private long previousSeek = 0; + private Runnable callback; + + public JzExoMedia(Jzvd jzvd) { + super(jzvd); + } + + @Override + public void start() { + simpleExoPlayer.setPlayWhenReady(true); + } + + @Override + public void prepare() { + Context context = jzvd.getContext(); + release(); + mMediaHandlerThread = new HandlerThread("JZVD"); + mMediaHandlerThread.start(); + mMediaHandler = new Handler(context.getMainLooper());//主线程还是非主线程,就在这里 + handler = new Handler(); + mMediaHandler.post(() -> { + AdaptiveTrackSelection.Factory factory = new AdaptiveTrackSelection.Factory(); + TrackSelector trackSelector = new DefaultTrackSelector(context, factory); + + LoadControl loadControl = new DefaultLoadControl.Builder() + .setAllocator(new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE)) + .setBufferDurationsMs(360000, 600000, 1000, 5000) + .setPrioritizeTimeOverSizeThresholds(false) + .setTargetBufferBytes(C.LENGTH_UNSET) + .createDefaultLoadControl(); + + BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder(context).build(); + // 2. Create the player + + RenderersFactory renderersFactory = new DefaultRenderersFactory(context); + simpleExoPlayer = new SimpleExoPlayer.Builder(context, renderersFactory) + .setTrackSelector(trackSelector) + .setLoadControl(loadControl) + .setBandwidthMeter(bandwidthMeter) + .build(); + // Produces DataSource instances through which media data is loaded. + DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, + Util.getUserAgent(context, context.getResources().getString(R.string.app_name))); + + String currUrl = jzvd.jzDataSource.getCurrentUrl().toString(); + MediaSource videoSource; + if (currUrl.contains(".m3u8")) { + videoSource = new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(currUrl)); + //addEventListener 这里只有两个参数都要传入值才可以成功设置 + // 否者会被断言 Assertions.checkArgument(handler != null && eventListener != null); + // 并且报错 IllegalArgumentException() 所以不需要添加监听器时 注释掉 + // videoSource .addEventListener( handler, null); + } else { + videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(currUrl)); + } + simpleExoPlayer.addVideoListener(this); + Log.e(TAG, "URL Link = " + currUrl); + + simpleExoPlayer.addListener(this); + boolean isLoop = jzvd.jzDataSource.looping; + if (isLoop) { + simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_ONE); + } else { + simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_OFF); + } + simpleExoPlayer.prepare(videoSource); + simpleExoPlayer.setPlayWhenReady(true); + callback = new onBufferingUpdate(); + if (jzvd.textureView != null) { + SurfaceTexture surfaceTexture = jzvd.textureView.getSurfaceTexture(); + if (surfaceTexture != null) { + simpleExoPlayer.setVideoSurface(new Surface(surfaceTexture)); + } + } + }); + } + + @Override + public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) { + handler.post(() -> jzvd.onVideoSizeChanged((int) (width * pixelWidthHeightRatio), height)); + } + + @Override + public void onRenderedFirstFrame() { + + } + + @Override + public void pause() { + simpleExoPlayer.setPlayWhenReady(false); + } + + @Override + public boolean isPlaying() { + return simpleExoPlayer.getPlayWhenReady(); + } + + @Override + public void seekTo(long time) { + if (simpleExoPlayer == null) { + return; + } + if (time != previousSeek) { + if (time >= simpleExoPlayer.getBufferedPosition()) { + jzvd.onStatePreparingPlaying(); + } + simpleExoPlayer.seekTo(time); + previousSeek = time; + jzvd.seekToInAdvance = time; + } + } + + @Override + public void release() { + if (mMediaHandler != null && mMediaHandlerThread != null && simpleExoPlayer != null) { + HandlerThread tmpHandlerThread = mMediaHandlerThread; + SimpleExoPlayer tmpMediaPlayer = simpleExoPlayer; + JZMediaInterface.SAVED_SURFACE = null; + mMediaHandler.post(() -> { + tmpMediaPlayer.release();//release就不能放到主线程里,界面会卡顿 + tmpHandlerThread.quit(); + }); + simpleExoPlayer = null; + } + } + + @Override + public long getCurrentPosition() { + if (simpleExoPlayer != null) + return simpleExoPlayer.getCurrentPosition(); + else return 0; + } + + @Override + public long getDuration() { + if (simpleExoPlayer != null) + return simpleExoPlayer.getDuration(); + else return 0; + } + + @Override + public void setVolume(float leftVolume, float rightVolume) { + simpleExoPlayer.setVolume(leftVolume); + simpleExoPlayer.setVolume(rightVolume); + } + + @Override + public void setSpeed(float speed) { + PlaybackParameters playbackParameters = new PlaybackParameters(speed, 1.0F); + simpleExoPlayer.setPlaybackParameters(playbackParameters); + } + + @Override + public void onTimelineChanged(final Timeline timeline, Object manifest, final int reason) { + + } + + @Override + public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { + + } + + @Override + public void onLoadingChanged(boolean isLoading) { + + } + + @Override + public void onPlayerStateChanged(final boolean playWhenReady, final int playbackState) { + Log.e(TAG, "onPlayerStateChanged" + playbackState + "/ready=" + playWhenReady); + handler.post(() -> { + switch (playbackState) { + case Player.STATE_IDLE: { + } + break; + case Player.STATE_BUFFERING: { + jzvd.onStatePreparingPlaying(); + handler.post(callback); + } + break; + case Player.STATE_READY: { + if (playWhenReady) { + jzvd.onStatePlaying(); + } + } + break; + case Player.STATE_ENDED: { + jzvd.onCompletion(); + } + break; + } + }); + } + + @Override + public void onRepeatModeChanged(int repeatMode) { + + } + + @Override + public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { + + } + + @Override + public void onPlayerError(ExoPlaybackException error) { + Log.e(TAG, "onPlayerError" + error.toString()); + handler.post(() -> jzvd.onError(1000, 1000)); + } + + @Override + public void onPositionDiscontinuity(int reason) { + + } + + @Override + public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { + + } + + @Override + public void onSeekProcessed() { + handler.post(() -> jzvd.onSeekComplete()); + } + + @Override + public void setSurface(Surface surface) { + if (simpleExoPlayer != null) { + simpleExoPlayer.setVideoSurface(surface); + } else { + Log.e("AGVideo", "simpleExoPlayer为空"); + } + } + + @Override + public void onSurfaceTextureAvailable(@NotNull SurfaceTexture surface, int width, int height) { + if (SAVED_SURFACE == null) { + SAVED_SURFACE = surface; + prepare(); + } else { + jzvd.textureView.setSurfaceTexture(SAVED_SURFACE); + } + } + + @Override + public void onSurfaceTextureSizeChanged(@NotNull SurfaceTexture surface, int width, int height) { + + } + + @Override + public boolean onSurfaceTextureDestroyed(@NotNull SurfaceTexture surface) { + return false; + } + + @Override + public void onSurfaceTextureUpdated(@NotNull SurfaceTexture surface) { + + } + + private class onBufferingUpdate implements Runnable { + @Override + public void run() { + if (simpleExoPlayer != null) { + final int percent = simpleExoPlayer.getBufferedPercentage(); + handler.post(() -> jzvd.setBufferProgress(percent)); + if (percent < 100) { + handler.postDelayed(callback, 300); + } else { + handler.removeCallbacks(callback); + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java b/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java deleted file mode 100644 index 4683201..0000000 --- a/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.dcms.utils; - -import androidx.core.content.FileProvider; - -public class VersionUpgradeFileProvider extends FileProvider { -} diff --git a/app/src/main/java/com/casic/dcms/utils/WaterImageFileProvider.java b/app/src/main/java/com/casic/dcms/utils/WaterImageFileProvider.java deleted file mode 100644 index 4102901..0000000 --- a/app/src/main/java/com/casic/dcms/utils/WaterImageFileProvider.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.dcms.utils; - -import androidx.core.content.FileProvider; - -public class WaterImageFileProvider extends FileProvider { -} diff --git a/app/src/main/java/com/casic/dcms/utils/provider/CompressVideoFileProvider.java b/app/src/main/java/com/casic/dcms/utils/provider/CompressVideoFileProvider.java new file mode 100644 index 0000000..a0329b5 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/provider/CompressVideoFileProvider.java @@ -0,0 +1,6 @@ +package com.casic.dcms.utils.provider; + +import androidx.core.content.FileProvider; + +public class CompressVideoFileProvider extends FileProvider { +} diff --git a/app/src/main/java/com/casic/dcms/utils/provider/VersionUpgradeFileProvider.java b/app/src/main/java/com/casic/dcms/utils/provider/VersionUpgradeFileProvider.java new file mode 100644 index 0000000..7f2aa50 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/provider/VersionUpgradeFileProvider.java @@ -0,0 +1,6 @@ +package com.casic.dcms.utils.provider; + +import androidx.core.content.FileProvider; + +public class VersionUpgradeFileProvider extends FileProvider { +} diff --git a/app/src/main/java/com/casic/dcms/utils/provider/WaterImageFileProvider.java b/app/src/main/java/com/casic/dcms/utils/provider/WaterImageFileProvider.java new file mode 100644 index 0000000..afa4fe2 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/provider/WaterImageFileProvider.java @@ -0,0 +1,6 @@ +package com.casic.dcms.utils.provider; + +import androidx.core.content.FileProvider; + +public class WaterImageFileProvider extends FileProvider { +} diff --git a/app/build.gradle b/app/build.gradle index b8c1a8b..f5edb66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ applicationId "com.casic.dcms" minSdkVersion 21 targetSdkVersion 30 - versionCode 14 - versionName "v1.0.0.6" + versionCode 15 + versionName "v1.0.0.7" ndk { abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86" } @@ -90,8 +90,9 @@ //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //视频压缩 - implementation 'com.iceteck.silicompressorr:silicompressor:2.2.4' - implementation 'com.googlecode.mp4parser:isoparser:1.1.22' + implementation 'com.zolad:videoslimmer:1.0.0' + //exo播放内核 + implementation 'com.google.android.exoplayer:exoplayer:2.13.2' //问题跟踪 implementation 'com.tencent.bugly:crashreport:3.3.92' //ZBar扫一扫(综合Java和C++扫码) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c6eb1..28822e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ - + @@ -135,7 +135,7 @@ @@ -144,9 +144,20 @@ android:resource="@xml/file_paths" /> + + + + + diff --git a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java index fbee6b8..f37457c 100644 --- a/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/BigImageActivity.java @@ -75,7 +75,7 @@ }); } - static class BigImageAdapter extends PagerAdapter { + class BigImageAdapter extends PagerAdapter { private Context context; private List data; @@ -103,6 +103,8 @@ Glide.with(context).load(data.get(position)).into(photoView); photoView.setScaleType(ImageView.ScaleType.FIT_XY); container.addView(view); + //点击大图取消预览 + photoView.setOnClickListener(v -> BigImageActivity.this.finish()); return view; } diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java index 1d99092..f69c6cf 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckDetailActivity.java @@ -36,6 +36,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -231,6 +232,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -342,7 +344,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java index a3b11d0..1ab5c16 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseCheckedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -256,7 +257,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java index 339e71f..2be4a4e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseDetailActivity.java @@ -22,6 +22,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -232,7 +233,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java index 72b2ccf..62413d2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandleDetailActivity.java @@ -40,6 +40,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -238,7 +239,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -363,6 +364,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java index a5be957..e2bbe6d 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -200,7 +201,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java index ff4eef3..c844e22 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoDetailActivity.java @@ -29,6 +29,7 @@ import com.casic.dcms.ui.fragment.overtime.CaseTodoFragment; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -230,7 +231,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java index a4dae85..6ac7b43 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseTodoHandledDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -176,7 +177,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java index b1adeb9..75ac52e 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadActivity.java @@ -1,14 +1,15 @@ package com.casic.dcms.ui; import android.annotation.SuppressLint; +import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.AudioManager; +import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -18,7 +19,6 @@ import android.widget.PopupWindow; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -47,12 +47,13 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.TimeOrDateUtil; import com.casic.dcms.utils.ToastHelper; import com.casic.dcms.widgets.VoicePlayView; -import com.iceteck.silicompressorr.SiliCompressor; +import com.google.gson.Gson; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; @@ -65,10 +66,10 @@ import com.qmuiteam.qmui.widget.popup.QMUIPopup; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; +import com.zolad.videoslimmer.VideoSlimmer; import java.io.File; import java.io.IOException; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -80,7 +81,6 @@ public class CaseUploadActivity extends BaseCaseActivity implements View.OnClickListener, View.OnTouchListener, ICaseLargeClassView, ICaseSmallClassView, ICaseSubmitCaseView, IUploadFileView { - private Context context = this; @BindView(R.id.caseLayout) LinearLayout caseLayout; @BindView(R.id.caseClassView) @@ -116,12 +116,15 @@ @BindView(R.id.submitButton) QMUIRoundButton submitButton; + private static final String TAG = "CaseUploadActivity"; + private Context context = this; private CaseLargeClassPresenterImpl caseLargeClassPresenter; private CaseSmallClassPresenterImpl caseSmallClassPresenter; private CaseSubmitPresenterImpl caseSubmitPresenter; private List largeClassBeans; private List smallClassBeans; - private QMUITipDialog submitDialog, qmuiTipDialog; + private QMUITipDialog submitDialog; + private ProgressDialog progressDialog; private UploadImagePresenterImpl uploadImagePresenter; private List imageList = new ArrayList<>();//服务器返回的拍照数据集 private ArrayList realPaths = new ArrayList<>();//真是图片路径 @@ -136,7 +139,6 @@ private String audioUrl, videoUrl; private AudioRecodeHelper audioRecodeHelper; private PopupWindow popWindow; - private static WeakReferenceHandler weakReferenceHandler; private boolean isFirstEnter = true; @Override @@ -156,15 +158,18 @@ caseLargeClassPresenter = new CaseLargeClassPresenterImpl(this); caseSmallClassPresenter = new CaseSmallClassPresenterImpl(this); caseSubmitPresenter = new CaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord("提交中,请稍后") .create(); - qmuiTipDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("视频压缩中,请稍后") - .create(); - weakReferenceHandler = new WeakReferenceHandler(this); + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("视频压缩中..."); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setProgressDrawable(getResources().getDrawable(R.drawable.bg_progress)); + progressDialog.setCancelable(false); + progressDialog.setCanceledOnTouchOutside(false); + uploadImagePresenter = new UploadImagePresenterImpl(this); uploadAudioPresenter = new UploadAudioPresenterImpl(this); uploadVideoPresenter = new UploadVideoPresenterImpl(this); @@ -179,7 +184,6 @@ public void initEvent() { voiceView.setOnTouchListener(this); submitButton.setChangeAlphaWhenPress(true); - //录音相关 View view = View.inflate(this, R.layout.popu_microphone, null); int popWidth = (int) (QMUIDisplayHelper.getScreenWidth(this) * 0.35); @@ -340,6 +344,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) @@ -378,29 +383,25 @@ case PictureConfig.PREVIEW_VIDEO_CODE: LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0); //"realPath":"/storage/emulated/0/Movies/VID_20210426_17552226.mp4" + Log.d(TAG, "onActivityResult: " + new Gson().toJson(media)); //需要手动压缩视频 String mediaRealPath = media.getRealPath(); + if (TextUtils.isEmpty(mediaRealPath)) { + //部分手机getRealPath可能为空,需要备用路径 + mediaRealPath = media.getPath(); + } + if (TextUtils.isEmpty(mediaRealPath) || mediaRealPath.equals("")) { + //如果默认和备用路径还是为空,则不压缩上传 + ToastHelper.showToast("操作失败,无法获取有效的视频文件", ToastHelper.ERROR); + return; + } + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(mediaRealPath); + String defaultRotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + String defaultBitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - qmuiTipDialog.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - /** - * 视频压缩 - * 第一个参数:视频源文件路径 - * 第二个参数:压缩后视频保存的路径 - */ - String comPressPath = SiliCompressor.with(context).compressVideo(mediaRealPath, FileUtils.getVideoCompressPath()); - Message message = weakReferenceHandler.obtainMessage(); - message.what = 20210427; - message.obj = comPressPath; - weakReferenceHandler.sendMessage(message); - } catch (Exception e) { - e.printStackTrace(); - } - } - }).start(); + assert defaultRotation != null; + compressVideo(mediaRealPath, defaultRotation, defaultBitrate); break; case Constant.REQUEST_MAP_CODE: if (data == null) { @@ -421,27 +422,46 @@ } } - private static class WeakReferenceHandler extends Handler { - private WeakReference reference; - - private WeakReferenceHandler(CaseUploadActivity activity) { - reference = new WeakReference<>(activity); + /** + * 6.0以上视频压缩 + */ + private void compressVideo(String mediaRealPath, String defaultRotation, String defaultBitrate) { + Log.d(TAG, "defaultRotation: " + defaultRotation + ", defaultBitrate: " + defaultBitrate); + String outputVideoFile = FileUtils.getOutputVideoFile(); + int width, height, bitrate; + if (defaultRotation.equals("90")) {//视频为竖屏,0为横屏 + width = Constant.DEFAULT_WIDTH / 2; + height = Constant.DEFAULT_HEIGHT / 2; + } else { + width = Constant.DEFAULT_HEIGHT / 2; + height = Constant.DEFAULT_WIDTH / 2; } - - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - CaseUploadActivity caseUploadActivity = reference.get(); - if (msg.what == 20210427) { - caseUploadActivity.qmuiTipDialog.dismiss(); - String comPressPath = (String) msg.obj; - if (!TextUtils.isEmpty(comPressPath)) { - caseUploadActivity.uploadVideoPresenter.onReadyRetrofitRequest(new File(comPressPath)); - } else { - ToastHelper.showToast("案卷视频上传失败", ToastHelper.ERROR); - } + if (TextUtils.isEmpty(defaultBitrate) || defaultBitrate.equals("")) { + bitrate = Constant.BITRATE; + } else { + bitrate = Integer.parseInt(defaultBitrate) / 2; + } + VideoSlimmer.convertVideo(mediaRealPath, outputVideoFile, width, height, Constant.BITRATE, new VideoSlimmer.ProgressListener() { + @Override + public void onStart() { + progressDialog.show(); } - } + + @Override + public void onProgress(float percent) { + progressDialog.setProgress((int) percent); + } + + @Override + public void onFinish(boolean result) { + if (result) { + uploadVideoPresenter.onReadyRetrofitRequest(new File(outputVideoFile)); + } else { + ToastHelper.showToast("压缩失败", ToastHelper.ERROR); + } + progressDialog.dismiss(); + } + }); } /** @@ -614,7 +634,7 @@ videoPlayerView.setVisibility(View.VISIBLE); videoUrl = resultBean.getData(); String completeURL = StringHelper.appendCompleteURL(videoUrl); - videoPlayerView.setUp(completeURL, ""); + videoPlayerView.setUp(completeURL, "", Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(context) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java new file mode 100644 index 0000000..10bfc1b --- /dev/null +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadPackageActivity.java @@ -0,0 +1,332 @@ +package com.casic.dcms.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.dcms.R; +import com.casic.dcms.adapter.ImageRecycleViewAdapter; +import com.casic.dcms.base.BaseCaseActivity; +import com.casic.dcms.bean.ActionResultBean; +import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; +import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; +import com.casic.dcms.mvp.view.ICaseSubmitCaseView; +import com.casic.dcms.mvp.view.IUploadFileView; +import com.casic.dcms.utils.Constant; +import com.casic.dcms.utils.FileUtils; +import com.casic.dcms.utils.GlideLoadEngine; +import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.OtherUtils; +import com.casic.dcms.utils.StringHelper; +import com.casic.dcms.utils.ToastHelper; +import com.luck.picture.lib.PictureSelector; +import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.tools.PictureFileUtils; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CaseUploadPackageActivity extends BaseCaseActivity implements View.OnClickListener, + IUploadFileView, ICaseSubmitCaseView { + + private Context context = CaseUploadPackageActivity.this; + @BindView(R.id.shopView) + TextView shopView; + @BindView(R.id.communityView) + EditText communityView; + @BindView(R.id.longitudeView) + TextView longitudeView; + @BindView(R.id.latitudeView) + TextView latitudeView; + @BindView(R.id.shopKeeperView) + EditText shopKeeperView; + @BindView(R.id.phoneNumberView) + EditText phoneNumberView; + @BindView(R.id.caseLocationView) + EditText caseLocationView; + @BindView(R.id.caseDetailEditView) + EditText caseDetailEditView; + @BindView(R.id.selectedResultView) + RecyclerView selectedResultView; + @BindView(R.id.addImageView) + ImageView addImageView; + @BindView(R.id.submitButton) + QMUIRoundButton submitButton; + + private UploadImagePresenterImpl uploadImagePresenter; + private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; + private ImageRecycleViewAdapter imageAdapter; + private QMUITipDialog submitDialog; + private ArrayList realPaths = new ArrayList<>();//真是图片路径 + private List mediaList = new ArrayList<>();//上传到服务器的数据集 + private String gridId, shopID; + + @Override + public int initLayoutView() { + return R.layout.activity_package; + } + + @Override + protected String setTitleName() { + return "三包上报"; + } + + @Override + public void initData() { + uploadImagePresenter = new UploadImagePresenterImpl(this); + shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); + submitDialog = new QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord("提交中,请稍后") + .create(); + imageAdapter = new ImageRecycleViewAdapter(this); + selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); + selectedResultView.addItemDecoration(new ItemDecorationSpace()); + selectedResultView.setAdapter(imageAdapter); + } + + @Override + public void initEvent() { + submitButton.setChangeAlphaWhenPress(true); + } + + @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.shopLayout: + Intent intent = new Intent(this, ArcGISMapActivity.class); + intent.putExtra("type", "三包上报"); + startActivityForResult(intent, Constant.REQUEST_MAP_CODE); + break; + case R.id.addImageView: + new QMUIDialog.MenuDialogBuilder(this) + .addItem("相册中选取", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //选图 + selectPicture(); + } + }) + .addItem("相机拍照", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + //拍照 + takePicture(); + } + }) + .setCanceledOnTouchOutside(false) + .create().show(); + break; + case R.id.submitButton: + submitCase(); + break; + } + } + + private void selectPicture() { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(2) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.CHOOSE_REQUEST); + } + + private void takePicture() { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(1) + .isCompress(true) + .compressQuality(80) + .compressSavePath(FileUtils.getImageCompressPath()) + .forResult(PictureConfig.REQUEST_CAMERA); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PictureConfig.CHOOSE_REQUEST: + List selectList = PictureSelector.obtainMultipleResult(data); + for (LocalMedia media : selectList) { + String mediaCompressPath = media.getCompressPath(); + uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); + } + break; + case PictureConfig.REQUEST_CAMERA: + LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); + uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); + break; + case Constant.REQUEST_MAP_CODE: + if (data == null) { + return; + } + double longitude = data.getDoubleExtra("longitude", 0); + double latitude = data.getDoubleExtra("latitude", 0); + gridId = data.getStringExtra("gridId"); + String community = data.getStringExtra("community"); + String shopName = data.getStringExtra("shopName"); + shopID = data.getStringExtra("shopID"); + + longitudeView.setText(String.valueOf(longitude)); + latitudeView.setText(String.valueOf(latitude)); + communityView.setText(community); + shopView.setText(shopName); + break; + default: + break; + } + } + } + + /** + * 案卷提交 + */ + private void submitCase() { + String longitude = longitudeView.getText().toString(); + String latitude = latitudeView.getText().toString(); + if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { + ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); + return; + } + String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(shopKeeper)) { + ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); + return; + } + String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(phoneNumber)) { + ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); + return; + } + if (StringHelper.isPhoneNumber(phoneNumber)) { + String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(fieldIntro)) { + ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); + return; + } + String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); + if (TextUtils.isEmpty(description)) { + ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); + return; + } + if (imageAdapter.getItemCount() != 2) { + ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); + return; + } + shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, + "2", "1", + gridId.substring(0, 6), + gridId.substring(0, 9), + gridId.substring(0, 12), + gridId, description, fieldIntro, + StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); + } else { + ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); + } + } + + @Override + public void showProgress() { + submitDialog.show(); + } + + @Override + public void hideProgress() { + submitDialog.dismiss(); + } + + @Override + public void obtainSubmitResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); + finish(); + } else { + ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); + } + } + + @Override + public void obtainDataFail() { + ToastHelper.showToast("操作失败", ToastHelper.ERROR); + } + + @Override + public void obtainUploadAudioResult(ActionResultBean resultBean) { + + } + + @Override + public void obtainUploadImageResult(ActionResultBean resultBean) { + if (resultBean.isSuccess()) { + PictureFileUtils.deleteAllCacheDirFile(this); + /** + * 系统路径static拼接图片返回路径 + * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg + */ + //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg + int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 2) { + String url = resultBean.getData(); + mediaList.add(url); + realPaths.add(StringHelper.appendCompleteURL(url)); + if (realPaths.size() == 2) { + addImageView.setVisibility(View.GONE); + } + imageAdapter.setMediaList(realPaths); + //九宫格点击事件 + imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { + @Override + public void onClick(int position) { + OtherUtils.showBigImage(context, position, realPaths); + } + }); + //删除按钮点击事件 + imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { + @Override + public void onClick(int position) { + mediaList.remove(position); + realPaths.remove(position); + imageAdapter.setMediaList(realPaths); + if (realPaths.size() != 2) { + addImageView.setVisibility(View.VISIBLE); + } + } + }); + } else { + ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); + } + } + } + + @Override + public void obtainUploadVideoResult(ActionResultBean resultBean) { + + } +} diff --git a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java index 67a0340..7750f8a 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseUploadQuicklyActivity.java @@ -242,6 +242,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java index e27a310..d364d7c 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifiedDetailActivity.java @@ -21,6 +21,7 @@ import com.casic.dcms.mvp.presenter.CaseDetailPresenterImpl; import com.casic.dcms.mvp.view.ICaseDetailView; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -179,7 +180,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) diff --git a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java index f0e437a..d28d4b2 100644 --- a/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/CaseVerifyDetailActivity.java @@ -44,6 +44,7 @@ import com.casic.dcms.utils.FileUtils; import com.casic.dcms.utils.GlideLoadEngine; import com.casic.dcms.utils.ItemDecorationSpace; +import com.casic.dcms.utils.JzExoMedia; import com.casic.dcms.utils.OtherUtils; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -285,7 +286,7 @@ if (!TextUtils.isEmpty(videoFile)) { videoPlayerView.setVisibility(View.VISIBLE); String videoUrl = StringHelper.appendCompleteURL(videoFile); - videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription())); + videoPlayerView.setUp(videoUrl, StringHelper.filterString(data.getDescription()), Jzvd.SCREEN_NORMAL, JzExoMedia.class); //设置第一帧为封面 Glide.with(this) .setDefaultRequestOptions(new RequestOptions().frame(4000000)) @@ -518,6 +519,7 @@ private void selectPicture() { PictureSelector.create(this) .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) .imageEngine(GlideLoadEngine.createGlideEngine()) .maxSelectNum(2) .isCompress(true) diff --git a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java b/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java deleted file mode 100644 index 1ba1d5b..0000000 --- a/app/src/main/java/com/casic/dcms/ui/ThreePackageUploadActivity.java +++ /dev/null @@ -1,331 +0,0 @@ -package com.casic.dcms.ui; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.text.TextUtils; -import android.view.View; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.adapter.ImageRecycleViewAdapter; -import com.casic.dcms.base.BaseCaseActivity; -import com.casic.dcms.bean.ActionResultBean; -import com.casic.dcms.mvp.presenter.ShopCaseSubmitPresenterImpl; -import com.casic.dcms.mvp.presenter.UploadImagePresenterImpl; -import com.casic.dcms.mvp.view.ICaseSubmitCaseView; -import com.casic.dcms.mvp.view.IUploadFileView; -import com.casic.dcms.utils.Constant; -import com.casic.dcms.utils.FileUtils; -import com.casic.dcms.utils.GlideLoadEngine; -import com.casic.dcms.utils.ItemDecorationSpace; -import com.casic.dcms.utils.OtherUtils; -import com.casic.dcms.utils.StringHelper; -import com.casic.dcms.utils.ToastHelper; -import com.luck.picture.lib.PictureSelector; -import com.luck.picture.lib.config.PictureConfig; -import com.luck.picture.lib.config.PictureMimeType; -import com.luck.picture.lib.entity.LocalMedia; -import com.luck.picture.lib.tools.PictureFileUtils; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; -import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.OnClick; - -public class ThreePackageUploadActivity extends BaseCaseActivity implements View.OnClickListener, - IUploadFileView, ICaseSubmitCaseView { - - private Context context = ThreePackageUploadActivity.this; - @BindView(R.id.shopView) - TextView shopView; - @BindView(R.id.communityView) - EditText communityView; - @BindView(R.id.longitudeView) - TextView longitudeView; - @BindView(R.id.latitudeView) - TextView latitudeView; - @BindView(R.id.shopKeeperView) - EditText shopKeeperView; - @BindView(R.id.phoneNumberView) - EditText phoneNumberView; - @BindView(R.id.caseLocationView) - EditText caseLocationView; - @BindView(R.id.caseDetailEditView) - EditText caseDetailEditView; - @BindView(R.id.selectedResultView) - RecyclerView selectedResultView; - @BindView(R.id.addImageView) - ImageView addImageView; - @BindView(R.id.submitButton) - QMUIRoundButton submitButton; - - private UploadImagePresenterImpl uploadImagePresenter; - private ShopCaseSubmitPresenterImpl shopCaseSubmitPresenter; - private ImageRecycleViewAdapter imageAdapter; - private QMUITipDialog submitDialog; - private ArrayList realPaths = new ArrayList<>();//真是图片路径 - private List mediaList = new ArrayList<>();//上传到服务器的数据集 - private String gridId, shopID; - - @Override - public int initLayoutView() { - return R.layout.activity_package; - } - - @Override - protected String setTitleName() { - return "三包上报"; - } - - @Override - public void initData() { - uploadImagePresenter = new UploadImagePresenterImpl(this); - shopCaseSubmitPresenter = new ShopCaseSubmitPresenterImpl(this); - submitDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("提交中,请稍后") - .create(); - imageAdapter = new ImageRecycleViewAdapter(this); - selectedResultView.setLayoutManager(new GridLayoutManager(this, 2)); - selectedResultView.addItemDecoration(new ItemDecorationSpace()); - selectedResultView.setAdapter(imageAdapter); - } - - @Override - public void initEvent() { - submitButton.setChangeAlphaWhenPress(true); - } - - @OnClick({R.id.shopLayout, R.id.addImageView, R.id.submitButton}) - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.shopLayout: - Intent intent = new Intent(this, ArcGISMapActivity.class); - intent.putExtra("type", "三包上报"); - startActivityForResult(intent, Constant.REQUEST_MAP_CODE); - break; - case R.id.addImageView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("相册中选取", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //选图 - selectPicture(); - } - }) - .addItem("相机拍照", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - //拍照 - takePicture(); - } - }) - .setCanceledOnTouchOutside(false) - .create().show(); - break; - case R.id.submitButton: - submitCase(); - break; - } - } - - private void selectPicture() { - PictureSelector.create(this) - .openGallery(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(2) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.CHOOSE_REQUEST); - } - - private void takePicture() { - PictureSelector.create(this) - .openCamera(PictureMimeType.ofImage()) - .imageEngine(GlideLoadEngine.createGlideEngine()) - .maxSelectNum(1) - .isCompress(true) - .compressQuality(80) - .compressSavePath(FileUtils.getImageCompressPath()) - .forResult(PictureConfig.REQUEST_CAMERA); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK) { - switch (requestCode) { - case PictureConfig.CHOOSE_REQUEST: - List selectList = PictureSelector.obtainMultipleResult(data); - for (LocalMedia media : selectList) { - String mediaCompressPath = media.getCompressPath(); - uploadImagePresenter.onReadyRetrofitRequest(new File(mediaCompressPath)); - } - break; - case PictureConfig.REQUEST_CAMERA: - LocalMedia localMedia = PictureSelector.obtainMultipleResult(data).get(0); - uploadImagePresenter.onReadyRetrofitRequest(new File(localMedia.getCompressPath())); - break; - case Constant.REQUEST_MAP_CODE: - if (data == null) { - return; - } - double longitude = data.getDoubleExtra("longitude", 0); - double latitude = data.getDoubleExtra("latitude", 0); - gridId = data.getStringExtra("gridId"); - String community = data.getStringExtra("community"); - String shopName = data.getStringExtra("shopName"); - shopID = data.getStringExtra("shopID"); - - longitudeView.setText(String.valueOf(longitude)); - latitudeView.setText(String.valueOf(latitude)); - communityView.setText(community); - shopView.setText(shopName); - break; - default: - break; - } - } - } - - /** - * 案卷提交 - */ - private void submitCase() { - String longitude = longitudeView.getText().toString(); - String latitude = latitudeView.getText().toString(); - if (longitude.equals("0") || latitude.equals("0") || TextUtils.isEmpty(longitude) || TextUtils.isEmpty(latitude)) { - ToastHelper.showToast("经纬度异常,请重新选择位置", ToastHelper.WARING); - return; - } - String shopKeeper = shopKeeperView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(shopKeeper)) { - ToastHelper.showToast("店主名还未填写", ToastHelper.WARING); - return; - } - String phoneNumber = phoneNumberView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(phoneNumber)) { - ToastHelper.showToast("电话号码还未填写", ToastHelper.WARING); - return; - } - if (StringHelper.isPhoneNumber(phoneNumber)) { - String fieldIntro = caseLocationView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(fieldIntro)) { - ToastHelper.showToast("案卷地点还未填写", ToastHelper.WARING); - return; - } - String description = caseDetailEditView.getText().toString().trim().replace(" ", ""); - if (TextUtils.isEmpty(description)) { - ToastHelper.showToast("案卷情况还未填写", ToastHelper.WARING); - return; - } - if (imageAdapter.getItemCount() != 2) { - ToastHelper.showToast("必须选择两张图片", ToastHelper.WARING); - return; - } - shopCaseSubmitPresenter.onReadyRetrofitRequest("0", "0", longitude, latitude, - "2", "1", - gridId.substring(0, 6), - gridId.substring(0, 9), - gridId.substring(0, 12), - gridId, description, fieldIntro, - StringHelper.reformatURL(mediaList), 0, 0, shopID, shopKeeper, phoneNumber); - } else { - ToastHelper.showToast("电话号码格式不对", ToastHelper.WARING); - } - } - - @Override - public void showProgress() { - submitDialog.show(); - } - - @Override - public void hideProgress() { - submitDialog.dismiss(); - } - - @Override - public void obtainSubmitResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - ToastHelper.showToast("提交成功", ToastHelper.SUCCESS); - finish(); - } else { - ToastHelper.showToast("提交失败,请重试", ToastHelper.ERROR); - } - } - - @Override - public void obtainDataFail() { - ToastHelper.showToast("操作失败", ToastHelper.ERROR); - } - - @Override - public void obtainUploadAudioResult(ActionResultBean resultBean) { - - } - - @Override - public void obtainUploadImageResult(ActionResultBean resultBean) { - if (resultBean.isSuccess()) { - PictureFileUtils.deleteAllCacheDirFile(this); - /** - * 系统路径static拼接图片返回路径 - * http://111.198.10.15:11409/static/2021-04/000bcf78345f4c1c86484efa3f9d68a2.jpeg - */ - //2021-04\\000bcf78345f4c1c86484efa3f9d68a2.jpeg - int sumItemCount = imageAdapter.getItemCount() + 1;//每上传一张图片,图片总数都是在原有的基础上+1 - if (sumItemCount <= 2) { - String url = resultBean.getData(); - mediaList.add(url); - realPaths.add(StringHelper.appendCompleteURL(url)); - if (realPaths.size() == 2) { - addImageView.setVisibility(View.GONE); - } - imageAdapter.setMediaList(realPaths); - //九宫格点击事件 - imageAdapter.setOnItemClickListener(new ImageRecycleViewAdapter.OnItemClickListener() { - @Override - public void onClick(int position) { - OtherUtils.showBigImage(context, position, realPaths); - } - }); - //删除按钮点击事件 - imageAdapter.setOnDeleteClickListener(new ImageRecycleViewAdapter.OnDeleteItemClickListener() { - @Override - public void onClick(int position) { - mediaList.remove(position); - realPaths.remove(position); - imageAdapter.setMediaList(realPaths); - if (realPaths.size() != 2) { - addImageView.setVisibility(View.VISIBLE); - } - } - }); - } else { - ToastHelper.showToast("最多只能上传2张图片", ToastHelper.WARING); - } - } - } - - @Override - public void obtainUploadVideoResult(ActionResultBean resultBean) { - - } -} diff --git a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java index 2ae9aa6..5dcf237 100644 --- a/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java +++ b/app/src/main/java/com/casic/dcms/ui/fragment/HomePageFragment.java @@ -24,13 +24,13 @@ import com.casic.dcms.ui.CaseOnMapActivity; import com.casic.dcms.ui.CaseSearchActivity; import com.casic.dcms.ui.CaseUploadActivity; +import com.casic.dcms.ui.CaseUploadPackageActivity; import com.casic.dcms.ui.CaseUploadQuicklyActivity; import com.casic.dcms.ui.CaseVerifyActivity; import com.casic.dcms.ui.DataAnalysisActivity; import com.casic.dcms.ui.OvertimeCaseActivity; import com.casic.dcms.ui.PersonOnlineActivity; import com.casic.dcms.ui.PublicToiletActivity; -import com.casic.dcms.ui.ThreePackageUploadActivity; import com.casic.dcms.ui.UrgentCaseActivity; import com.casic.dcms.utils.StringHelper; import com.casic.dcms.utils.ToastHelper; @@ -119,7 +119,7 @@ intent.setClass(context, CaseUploadQuicklyActivity.class); break; case "三包上报": - intent.setClass(context, ThreePackageUploadActivity.class); + intent.setClass(context, CaseUploadPackageActivity.class); break; case "案卷核实": intent.setClass(context, CaseVerifyActivity.class); diff --git a/app/src/main/java/com/casic/dcms/utils/Constant.java b/app/src/main/java/com/casic/dcms/utils/Constant.java index d948e35..036f762 100644 --- a/app/src/main/java/com/casic/dcms/utils/Constant.java +++ b/app/src/main/java/com/casic/dcms/utils/Constant.java @@ -40,6 +40,9 @@ public static final int REQUEST_REFRESH_CODE = 9002; public static final int PAGE_LIMIT = 15; + public static final int BITRATE = 200 * 360 * 30; + public static final int DEFAULT_WIDTH = 720; + public static final int DEFAULT_HEIGHT = 1280; public static final int CASE_HANDLE = 0; public static final int CASE_VERIFY = 1; diff --git a/app/src/main/java/com/casic/dcms/utils/FileUtils.java b/app/src/main/java/com/casic/dcms/utils/FileUtils.java index c07978f..315a587 100644 --- a/app/src/main/java/com/casic/dcms/utils/FileUtils.java +++ b/app/src/main/java/com/casic/dcms/utils/FileUtils.java @@ -2,7 +2,6 @@ import android.annotation.SuppressLint; import android.content.Context; -import android.os.Environment; import android.util.Log; import java.io.File; @@ -19,6 +18,7 @@ private static File imageDir; private static File waterImageDir; private static File downloadDir; + private static File videoDir; public static void initFileConfig(Context context) { FileUtils.context = context; @@ -57,6 +57,13 @@ Log.d(TAG, "initFileConfig: 创建DownloadFile文件夹"); } } + videoDir = new File(parentDir, "CompressVideoFile"); + if (!videoDir.exists()) { + boolean mkVideoDir = videoDir.mkdir(); + if (mkVideoDir) { + Log.d(TAG, "initFileConfig: 创建CompressVideoFile文件夹"); + } + } } static File getOutputAudioFile() { @@ -160,7 +167,32 @@ return downloadDir.toString(); } - public static String getVideoCompressPath() { - return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); + public static String getOutputVideoFile() { + if (videoDir == null) { + File parentDir = new File(context.getFilesDir().getAbsolutePath(), "Casic"); + if (!parentDir.exists()) { + boolean mkdir = parentDir.mkdir(); + if (mkdir) { + Log.d(TAG, "getOutputVideoFile: 创建Casic文件夹"); + } + } + videoDir = new File(parentDir, "CompressVideoFile"); + if (!videoDir.exists()) { + boolean mkVideoDir = videoDir.mkdir(); + if (mkVideoDir) { + Log.d(TAG, "getOutputVideoFile: 创建CompressVideoFile文件夹"); + } + } + } + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); + File videoFile = new File(videoDir + File.separator + "VID_" + timeStamp + ".mp4"); + if (!videoFile.exists()) { + try { + videoFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return videoFile.getPath(); } } diff --git a/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java b/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java new file mode 100644 index 0000000..b82c57d --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/JzExoMedia.java @@ -0,0 +1,320 @@ +package com.casic.dcms.utils; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.net.Uri; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; +import android.view.Surface; + +import com.casic.dcms.R; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.DefaultLoadControl; +import com.google.android.exoplayer2.DefaultRenderersFactory; +import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.LoadControl; +import com.google.android.exoplayer2.PlaybackParameters; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.RenderersFactory; +import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.source.MediaSource; +import com.google.android.exoplayer2.source.ProgressiveMediaSource; +import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.source.hls.HlsMediaSource; +import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; +import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.trackselection.TrackSelector; +import com.google.android.exoplayer2.upstream.BandwidthMeter; +import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DefaultAllocator; +import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; +import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.util.Util; +import com.google.android.exoplayer2.video.VideoListener; + +import org.jetbrains.annotations.NotNull; + +import cn.jzvd.JZMediaInterface; +import cn.jzvd.Jzvd; + +public class JzExoMedia extends JZMediaInterface implements Player.EventListener, VideoListener { + + private static final String TAG = "JzExoMedia"; + private SimpleExoPlayer simpleExoPlayer; + private long previousSeek = 0; + private Runnable callback; + + public JzExoMedia(Jzvd jzvd) { + super(jzvd); + } + + @Override + public void start() { + simpleExoPlayer.setPlayWhenReady(true); + } + + @Override + public void prepare() { + Context context = jzvd.getContext(); + release(); + mMediaHandlerThread = new HandlerThread("JZVD"); + mMediaHandlerThread.start(); + mMediaHandler = new Handler(context.getMainLooper());//主线程还是非主线程,就在这里 + handler = new Handler(); + mMediaHandler.post(() -> { + AdaptiveTrackSelection.Factory factory = new AdaptiveTrackSelection.Factory(); + TrackSelector trackSelector = new DefaultTrackSelector(context, factory); + + LoadControl loadControl = new DefaultLoadControl.Builder() + .setAllocator(new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE)) + .setBufferDurationsMs(360000, 600000, 1000, 5000) + .setPrioritizeTimeOverSizeThresholds(false) + .setTargetBufferBytes(C.LENGTH_UNSET) + .createDefaultLoadControl(); + + BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder(context).build(); + // 2. Create the player + + RenderersFactory renderersFactory = new DefaultRenderersFactory(context); + simpleExoPlayer = new SimpleExoPlayer.Builder(context, renderersFactory) + .setTrackSelector(trackSelector) + .setLoadControl(loadControl) + .setBandwidthMeter(bandwidthMeter) + .build(); + // Produces DataSource instances through which media data is loaded. + DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, + Util.getUserAgent(context, context.getResources().getString(R.string.app_name))); + + String currUrl = jzvd.jzDataSource.getCurrentUrl().toString(); + MediaSource videoSource; + if (currUrl.contains(".m3u8")) { + videoSource = new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(currUrl)); + //addEventListener 这里只有两个参数都要传入值才可以成功设置 + // 否者会被断言 Assertions.checkArgument(handler != null && eventListener != null); + // 并且报错 IllegalArgumentException() 所以不需要添加监听器时 注释掉 + // videoSource .addEventListener( handler, null); + } else { + videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(currUrl)); + } + simpleExoPlayer.addVideoListener(this); + Log.e(TAG, "URL Link = " + currUrl); + + simpleExoPlayer.addListener(this); + boolean isLoop = jzvd.jzDataSource.looping; + if (isLoop) { + simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_ONE); + } else { + simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_OFF); + } + simpleExoPlayer.prepare(videoSource); + simpleExoPlayer.setPlayWhenReady(true); + callback = new onBufferingUpdate(); + if (jzvd.textureView != null) { + SurfaceTexture surfaceTexture = jzvd.textureView.getSurfaceTexture(); + if (surfaceTexture != null) { + simpleExoPlayer.setVideoSurface(new Surface(surfaceTexture)); + } + } + }); + } + + @Override + public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) { + handler.post(() -> jzvd.onVideoSizeChanged((int) (width * pixelWidthHeightRatio), height)); + } + + @Override + public void onRenderedFirstFrame() { + + } + + @Override + public void pause() { + simpleExoPlayer.setPlayWhenReady(false); + } + + @Override + public boolean isPlaying() { + return simpleExoPlayer.getPlayWhenReady(); + } + + @Override + public void seekTo(long time) { + if (simpleExoPlayer == null) { + return; + } + if (time != previousSeek) { + if (time >= simpleExoPlayer.getBufferedPosition()) { + jzvd.onStatePreparingPlaying(); + } + simpleExoPlayer.seekTo(time); + previousSeek = time; + jzvd.seekToInAdvance = time; + } + } + + @Override + public void release() { + if (mMediaHandler != null && mMediaHandlerThread != null && simpleExoPlayer != null) { + HandlerThread tmpHandlerThread = mMediaHandlerThread; + SimpleExoPlayer tmpMediaPlayer = simpleExoPlayer; + JZMediaInterface.SAVED_SURFACE = null; + mMediaHandler.post(() -> { + tmpMediaPlayer.release();//release就不能放到主线程里,界面会卡顿 + tmpHandlerThread.quit(); + }); + simpleExoPlayer = null; + } + } + + @Override + public long getCurrentPosition() { + if (simpleExoPlayer != null) + return simpleExoPlayer.getCurrentPosition(); + else return 0; + } + + @Override + public long getDuration() { + if (simpleExoPlayer != null) + return simpleExoPlayer.getDuration(); + else return 0; + } + + @Override + public void setVolume(float leftVolume, float rightVolume) { + simpleExoPlayer.setVolume(leftVolume); + simpleExoPlayer.setVolume(rightVolume); + } + + @Override + public void setSpeed(float speed) { + PlaybackParameters playbackParameters = new PlaybackParameters(speed, 1.0F); + simpleExoPlayer.setPlaybackParameters(playbackParameters); + } + + @Override + public void onTimelineChanged(final Timeline timeline, Object manifest, final int reason) { + + } + + @Override + public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { + + } + + @Override + public void onLoadingChanged(boolean isLoading) { + + } + + @Override + public void onPlayerStateChanged(final boolean playWhenReady, final int playbackState) { + Log.e(TAG, "onPlayerStateChanged" + playbackState + "/ready=" + playWhenReady); + handler.post(() -> { + switch (playbackState) { + case Player.STATE_IDLE: { + } + break; + case Player.STATE_BUFFERING: { + jzvd.onStatePreparingPlaying(); + handler.post(callback); + } + break; + case Player.STATE_READY: { + if (playWhenReady) { + jzvd.onStatePlaying(); + } + } + break; + case Player.STATE_ENDED: { + jzvd.onCompletion(); + } + break; + } + }); + } + + @Override + public void onRepeatModeChanged(int repeatMode) { + + } + + @Override + public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { + + } + + @Override + public void onPlayerError(ExoPlaybackException error) { + Log.e(TAG, "onPlayerError" + error.toString()); + handler.post(() -> jzvd.onError(1000, 1000)); + } + + @Override + public void onPositionDiscontinuity(int reason) { + + } + + @Override + public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { + + } + + @Override + public void onSeekProcessed() { + handler.post(() -> jzvd.onSeekComplete()); + } + + @Override + public void setSurface(Surface surface) { + if (simpleExoPlayer != null) { + simpleExoPlayer.setVideoSurface(surface); + } else { + Log.e("AGVideo", "simpleExoPlayer为空"); + } + } + + @Override + public void onSurfaceTextureAvailable(@NotNull SurfaceTexture surface, int width, int height) { + if (SAVED_SURFACE == null) { + SAVED_SURFACE = surface; + prepare(); + } else { + jzvd.textureView.setSurfaceTexture(SAVED_SURFACE); + } + } + + @Override + public void onSurfaceTextureSizeChanged(@NotNull SurfaceTexture surface, int width, int height) { + + } + + @Override + public boolean onSurfaceTextureDestroyed(@NotNull SurfaceTexture surface) { + return false; + } + + @Override + public void onSurfaceTextureUpdated(@NotNull SurfaceTexture surface) { + + } + + private class onBufferingUpdate implements Runnable { + @Override + public void run() { + if (simpleExoPlayer != null) { + final int percent = simpleExoPlayer.getBufferedPercentage(); + handler.post(() -> jzvd.setBufferProgress(percent)); + if (percent < 100) { + handler.postDelayed(callback, 300); + } else { + handler.removeCallbacks(callback); + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java b/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java deleted file mode 100644 index 4683201..0000000 --- a/app/src/main/java/com/casic/dcms/utils/VersionUpgradeFileProvider.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.dcms.utils; - -import androidx.core.content.FileProvider; - -public class VersionUpgradeFileProvider extends FileProvider { -} diff --git a/app/src/main/java/com/casic/dcms/utils/WaterImageFileProvider.java b/app/src/main/java/com/casic/dcms/utils/WaterImageFileProvider.java deleted file mode 100644 index 4102901..0000000 --- a/app/src/main/java/com/casic/dcms/utils/WaterImageFileProvider.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.casic.dcms.utils; - -import androidx.core.content.FileProvider; - -public class WaterImageFileProvider extends FileProvider { -} diff --git a/app/src/main/java/com/casic/dcms/utils/provider/CompressVideoFileProvider.java b/app/src/main/java/com/casic/dcms/utils/provider/CompressVideoFileProvider.java new file mode 100644 index 0000000..a0329b5 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/provider/CompressVideoFileProvider.java @@ -0,0 +1,6 @@ +package com.casic.dcms.utils.provider; + +import androidx.core.content.FileProvider; + +public class CompressVideoFileProvider extends FileProvider { +} diff --git a/app/src/main/java/com/casic/dcms/utils/provider/VersionUpgradeFileProvider.java b/app/src/main/java/com/casic/dcms/utils/provider/VersionUpgradeFileProvider.java new file mode 100644 index 0000000..7f2aa50 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/provider/VersionUpgradeFileProvider.java @@ -0,0 +1,6 @@ +package com.casic.dcms.utils.provider; + +import androidx.core.content.FileProvider; + +public class VersionUpgradeFileProvider extends FileProvider { +} diff --git a/app/src/main/java/com/casic/dcms/utils/provider/WaterImageFileProvider.java b/app/src/main/java/com/casic/dcms/utils/provider/WaterImageFileProvider.java new file mode 100644 index 0000000..afa4fe2 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/utils/provider/WaterImageFileProvider.java @@ -0,0 +1,6 @@ +package com.casic.dcms.utils.provider; + +import androidx.core.content.FileProvider; + +public class WaterImageFileProvider extends FileProvider { +} diff --git a/app/src/main/res/xml/file_paths.xml b/app/src/main/res/xml/file_paths.xml index 3fada23..62d2515 100644 --- a/app/src/main/res/xml/file_paths.xml +++ b/app/src/main/res/xml/file_paths.xml @@ -8,6 +8,10 @@ name="image" path="Casic/CompressImageFile" /> + +