From 1cae1f02524ed59a30bd1429b154b0766d9261c8 Mon Sep 17 00:00:00 2001 From: XiaoYan Date: Fri, 6 Aug 2021 09:31:15 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E6=91=84=E5=83=8F?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../outdoor/activity/PictureActivity.java | 46 +++++++++--- .../com/navinfo/outdoor/api/Constant.java | 1 + .../outdoor/fragment/PoiVideoFragment.java | 11 ++- .../outdoor/fragment/RoadFragment.java | 40 ++++------ .../outdoor/util/AWMp4ParserHelper.java | 73 ++++++++++++++++++- app/src/main/res/layout/activity_picture.xml | 12 +++ 6 files changed, 142 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/com/navinfo/outdoor/activity/PictureActivity.java b/app/src/main/java/com/navinfo/outdoor/activity/PictureActivity.java index 039cb9a..54bd7c0 100644 --- a/app/src/main/java/com/navinfo/outdoor/activity/PictureActivity.java +++ b/app/src/main/java/com/navinfo/outdoor/activity/PictureActivity.java @@ -14,6 +14,7 @@ import android.location.Location; import android.media.MediaMetadataRetriever; import android.os.Looper; import android.os.Message; +import android.os.SystemClock; import android.util.DisplayMetrics; import android.util.Log; import android.view.View; @@ -21,9 +22,11 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.CheckBox; +import android.widget.Chronometer; import android.widget.CompoundButton; import android.widget.FrameLayout; import android.widget.ImageView; +import android.widget.TextView; import android.widget.Toast; import com.github.lazylibrary.util.DensityUtil; @@ -105,6 +108,9 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene private final long period = 1; // 记录csv文件的间隔时间,单位为秒 private ViewGroup layerChange; // 切换地图和相机的父控件 private boolean isFinishActivity = false; // 是否需要关闭当前activity + private TextView videoChronometer; + private long recordingTime = 0;// 记录下来的总时间 + private int oratation = -1; // 是否强制横屏拍摄,默认不强制,0-强制横屏 其他-任意 @Override protected int getLayout() { @@ -120,7 +126,9 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene if (getIntent()!=null) { finalVideoPath = getIntent().getStringExtra(Constant.INTENT_VIDEO_PATH); + oratation = getIntent().getIntExtra(Constant.INTENT_VIDEO_ORATATION, -1); } + videoChronometer = findViewById(R.id.video_chronometer); // if (finalVideoPath == null) { // finalVideoPath = Constant.PICTURE_FOLDER+"/final.mp4"; // } @@ -145,10 +153,12 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { // 开始采集,设置按钮文字内容为“结束采集” - // 如果当前手机是竖向,则不允许拍摄 - if (camera.getVideoSize().getWidth()9?miss/3600+"":"0"+miss/3600; + String mm=(miss % 3600)/60>9?(miss % 3600)/60+"":"0"+(miss % 3600)/60; + String ss=(miss % 3600) % 60>9?(miss % 3600) % 60+"":"0"+(miss % 3600) % 60; + return hh+":"+mm+":"+ss; + } + private void message(String content, Boolean important) { if (important) { LOG.w(content); @@ -380,7 +398,6 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene public void stopVideoAndFinish() { - showLoadingDialog(); if (timerTask!=null){ timerTask.cancel(); Intent intent = new Intent(); @@ -390,6 +407,7 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene Toast.makeText(this, "本段视频没有计时!", Toast.LENGTH_SHORT).show(); } if (camera.isTakingVideo()) { + showLoadingDialog(); isFinishActivity = true; camera.stopVideo(); } else { @@ -581,8 +599,16 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene sb.append("\r\n"); FileUtils.writeFile(csvFile.getAbsolutePath(), sb.toString(), true); currentVideoTime = currentVideoTime+period; // + recordingTime += period; + runOnUiThread(updateTimeRunnable); } } + private Runnable updateTimeRunnable = new Runnable() { + @Override + public void run() { + videoChronometer.setText(formatMiss(recordingTime)); + } + }; } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/outdoor/api/Constant.java b/app/src/main/java/com/navinfo/outdoor/api/Constant.java index a03b11f..33a1184 100644 --- a/app/src/main/java/com/navinfo/outdoor/api/Constant.java +++ b/app/src/main/java/com/navinfo/outdoor/api/Constant.java @@ -109,6 +109,7 @@ public class Constant { public static MapView treasureMap; public static final String INTENT_VIDEO_PATH = "INTENT_VIDEO_PATH"; // 拍照界面指定的视频文件保存位置 + public static final String INTENT_VIDEO_ORATATION = "INTENT_VIDEO_ORATATION"; // 视频拍摄时屏幕方向 0-强制横屏 其他-任意 public static boolean IS_FILTER_LIST_ITEM =true;//poi页面的查重 } diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java index 226aa4b..25fcb29 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java @@ -166,7 +166,7 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick return; } - File finalFile = AWMp4ParserHelper.getInstance().obtainMp4FilePath(showPoiEntity.getId(), fmPoiVideoPic.getTag()); + File finalFile = AWMp4ParserHelper.getInstance().obtainMp4FilePath(new File(Constant.PICTURE_FOLDER, showPoiEntity.getId()).getAbsolutePath()); Intent intent = new Intent(getContext(), PictureActivity.class); intent.putExtra(Constant.INTENT_VIDEO_PATH, finalFile.getAbsolutePath()); startActivityForResult(intent, 0x101); @@ -298,7 +298,7 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick // String videoFormatName = formatter.format(new Date()); Intent intent = new Intent(getContext(), PictureActivity.class); - File finalFile = AWMp4ParserHelper.getInstance().obtainMp4FilePath(showPoiEntity.getId(), fmPoiVideoPic.getTag()); + File finalFile = AWMp4ParserHelper.getInstance().obtainMp4FilePath(new File(Constant.PICTURE_FOLDER, showPoiEntity.getId()).getAbsolutePath()); intent.putExtra(Constant.INTENT_VIDEO_PATH, finalFile.getAbsolutePath()); startActivityForResult(intent, 0x101); break; @@ -636,6 +636,7 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick //根据要保存的数据的类型,调用对应的put方法, PoiEntity poiEntity = new PoiEntity(); + poiEntity.setId(showPoiEntity.getId()); String roadName = etRoadName.getText().toString().trim(); if (roadName != null && !roadName.equals("")) { poiEntity.setName(roadName); @@ -656,7 +657,11 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick poiEntity.setType(3); poiEntity.setTaskStatus(2); poiEntity.setIsLocalData(1); - poiEntity.setPhoto(getPhotoStrFromTag()); + poiEntity.setX(showPoiEntity.getX()); + poiEntity.setY(showPoiEntity.getY()); + List videoFileListByUUID = AWMp4ParserHelper.getInstance().getVideoFileListByUUID(showPoiEntity.getId()); + String photoStr = AWMp4ParserHelper.getInstance().getVideoFileListStr(videoFileListByUUID); + poiEntity.setPhoto(photoStr); String newPoiEntity = new Gson().toJson(poiEntity); //以键值对的形式添加新值。 edit.putString("poiEntity", newPoiEntity); diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java index b1ae1a3..5608ce8 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java @@ -168,9 +168,10 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList return; } - File finalFile = AWMp4ParserHelper.getInstance().obtainMp4FilePath(showPoiEntity.getId(), fmRoadPic.getTag()); + File finalFile = AWMp4ParserHelper.getInstance().obtainMp4FilePath(new File(Constant.PICTURE_FOLDER, showPoiEntity.getId()).getAbsolutePath()); Intent intent = new Intent(getContext(), PictureActivity.class); intent.putExtra(Constant.INTENT_VIDEO_PATH, finalFile.getAbsolutePath()); + intent.putExtra(Constant.INTENT_VIDEO_ORATATION, 0); startActivityForResult(intent, 0x101); } }); @@ -310,8 +311,9 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList // DateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss"); // String videoFormatName = formatter.format(new Date()); Intent intent = new Intent(getContext(), PictureActivity.class); - File finalFile = AWMp4ParserHelper.getInstance().obtainMp4FilePath(showPoiEntity.getId(), fmRoadPic.getTag()); + File finalFile = AWMp4ParserHelper.getInstance().obtainMp4FilePath(new File(Constant.PICTURE_FOLDER, showPoiEntity.getId()).getAbsolutePath()); intent.putExtra(Constant.INTENT_VIDEO_PATH, finalFile.getAbsolutePath()); + intent.putExtra(Constant.INTENT_VIDEO_ORATATION, 0); startActivityForResult(intent, 0x101); break; case R.id.road_upload: @@ -407,7 +409,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList return; } else { - String lineString = GeometryTools.getLineString(getLineString()); + String lineString = GeometryTools.getLineString(AWMp4ParserHelper.getInstance().getLineStringByVideoFileList((List) fmRoadPic.getTag())); String filePathString = getPhotoStrFromTag(); Log.d("TAG", "onGranted: " + lineString); poiEntity.setPhoto(filePathString); @@ -474,30 +476,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList return filePathStringBuilder.toString(); } - private List getLineString() { - List videoFileList = (List) fmRoadPic.getTag(); - List latLngs = new ArrayList<>(); - StringBuilder filePathStringBuilder = new StringBuilder(""); - for (int m = 0; m < videoFileList.size(); m++) { - File videoFile = videoFileList.get(m); - - String path = videoFile.getPath() + ".txt"; - List strings = FileUtils.readFileToList(path, "utf-8"); - for (int i = 0; i < strings.size(); i++) { - String[] split = strings.get(i).split(","); - LatLng latLng = new LatLng(); - latLng.setLatitude(Double.valueOf(split[2])); - latLng.setLongitude(Double.valueOf(split[3])); - latLngs.add(latLng); - } - if (strings.size() == 1) { - LatLng latLng = latLngs.get(0); - latLngs.add(latLng); - } - } - return latLngs; - } private void poiVideoUpload(int body, File fileZip) { if (body == 0) { @@ -631,6 +610,9 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList @Override public boolean onClick(BaseDialog baseDialog, View v) { Intent intentPanorama = new Intent(getActivity(),PictureActivity.class); + File finalFile = AWMp4ParserHelper.getInstance().obtainMp4FilePath(new File(Constant.PICTURE_FOLDER, showPoiEntity.getId()).getAbsolutePath()); + intentPanorama.putExtra(Constant.INTENT_VIDEO_PATH, finalFile.getAbsolutePath()); + intentPanorama.putExtra(Constant.INTENT_VIDEO_ORATATION, 0); startActivityForResult(intentPanorama, 0x101); return false; } @@ -685,6 +667,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList //根据要保存的数据的类型,调用对应的put方法, PoiEntity poiEntity = new PoiEntity(); + poiEntity.setId(showPoiEntity.getId()); String roadName = etRoadName.getText().toString().trim(); if (roadName != null && !roadName.equals("")) { poiEntity.setName(roadName); @@ -710,6 +693,11 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList poiEntity.setType(4); poiEntity.setTaskStatus(2); poiEntity.setIsLocalData(1); + poiEntity.setX(showPoiEntity.getX()); + poiEntity.setY(showPoiEntity.getY()); + List videoFileListByUUID = AWMp4ParserHelper.getInstance().getVideoFileListByUUID(showPoiEntity.getId()); + String photoStr = AWMp4ParserHelper.getInstance().getVideoFileListStr(videoFileListByUUID); + poiEntity.setPhoto(photoStr); String newPoiEntity = new Gson().toJson(poiEntity); //以键值对的形式添加新值。 edit.putString("poiEntity", newPoiEntity); diff --git a/app/src/main/java/com/navinfo/outdoor/util/AWMp4ParserHelper.java b/app/src/main/java/com/navinfo/outdoor/util/AWMp4ParserHelper.java index 13bea8b..75d8650 100644 --- a/app/src/main/java/com/navinfo/outdoor/util/AWMp4ParserHelper.java +++ b/app/src/main/java/com/navinfo/outdoor/util/AWMp4ParserHelper.java @@ -14,6 +14,7 @@ import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; import com.bumptech.glide.load.resource.bitmap.VideoDecoder; import com.bumptech.glide.request.RequestOptions; import com.coremedia.iso.boxes.Container; +import com.github.lazylibrary.util.FileUtils; import com.github.lazylibrary.util.StringUtils; import com.googlecode.mp4parser.authoring.Movie; import com.googlecode.mp4parser.authoring.Track; @@ -21,6 +22,7 @@ import com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder; import com.googlecode.mp4parser.authoring.container.mp4.MovieCreator; import com.googlecode.mp4parser.authoring.tracks.AppendTrack; import com.navinfo.outdoor.api.Constant; +import com.tencent.tencentmap.mapsdk.maps.model.LatLng; import java.io.File; import java.io.FileFilter; @@ -237,7 +239,7 @@ public class AWMp4ParserHelper { } }); if (fileList == null || fileList.length==0) { - return new File(Constant.PICTURE_FOLDER+"/0.mp4"); + return new File(folderPath+"/0.mp4"); } int maxIndex = 0; for (int i = 0; i < fileList.length; i++) { @@ -249,6 +251,73 @@ public class AWMp4ParserHelper { } } } - return new File(Constant.PICTURE_FOLDER+"/"+(maxIndex+1)+".mp4"); + return new File(folderPath+"/"+(maxIndex+1)+".mp4"); + } + + /** + * 根据提供的uuid,获取指定目录下所有的视频文件 + * */ + public List getVideoFileListByUUID(String uuid) { + List videoFileList = new ArrayList<>(); + if (StringUtils.isEmpty(uuid)) { + return videoFileList; + } + File folderFile = new File(Constant.PICTURE_FOLDER+"/"+uuid+"/"); + if (!folderFile.exists()) { + folderFile.mkdirs(); + return videoFileList; + } + for (File videoFile: folderFile.listFiles()) { + videoFileList.add(videoFile); + } + return videoFileList; + } + + public String getVideoFileListStr(List videoFileList) { + StringBuilder resultStrBuilder = new StringBuilder(""); + if (videoFileList == null || videoFileList.size()<=0){ + return resultStrBuilder.toString(); + } + + for (int i = 0; i < videoFileList.size(); i++) { + File f = videoFileList.get(i); + resultStrBuilder.append(f.getAbsolutePath()); + if (i < videoFileList.size() -1) { + resultStrBuilder.append(","); + } + } + return resultStrBuilder.toString(); + } + + /** + * 根据视频文件列表,获取到对应的轨迹数据 + * */ + public List getLineStringByVideoFileList(List videoFileList) { + List latLngs = new ArrayList<>(); + if (videoFileList == null || videoFileList.isEmpty()) { + return latLngs; + } + + StringBuilder filePathStringBuilder = new StringBuilder(""); + for (int m = 0; m < videoFileList.size(); m++) { + File videoFile = videoFileList.get(m); + + String path = videoFile.getPath() + ".txt"; + List strings = FileUtils.readFileToList(path, "utf-8"); + if (strings!=null) { + for (int i = 0; i < strings.size(); i++) { + String[] split = strings.get(i).split(","); + LatLng latLng = new LatLng(); + latLng.setLatitude(Double.valueOf(split[2])); + latLng.setLongitude(Double.valueOf(split[3])); + latLngs.add(latLng); + } + if (strings.size() == 1) { + LatLng latLng = latLngs.get(0); + latLngs.add(latLng); + } + } + } + return latLngs; } } diff --git a/app/src/main/res/layout/activity_picture.xml b/app/src/main/res/layout/activity_picture.xml index 65b3d33..d8db5a4 100644 --- a/app/src/main/res/layout/activity_picture.xml +++ b/app/src/main/res/layout/activity_picture.xml @@ -76,5 +76,17 @@ app:layout_constraintBottom_toBottomOf="@id/capuretVideo" app:layout_constraintLeft_toRightOf="@id/capuretVideo" app:layout_constraintRight_toRightOf="parent" /> + +