fix: 修改摄像模块功能

This commit is contained in:
XiaoYan 2021-08-06 09:31:15 +08:00
parent a136dc0683
commit 1cae1f0252
6 changed files with 142 additions and 41 deletions

View File

@ -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,11 +153,13 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) { // 开始采集设置按钮文字内容为结束采集
if (oratation == 0) { // oratation为0时拍摄视频必须为横屏
// 如果当前手机是竖向则不允许拍摄
if (camera.getVideoSize().getWidth()<camera.getVideoSize().getHeight()) {
Toast.makeText(PictureActivity.this, "不允许竖向拍摄...", Toast.LENGTH_SHORT).show();
return;
}
}
captureVideo.setText("暂停采集");
// stopVideo.setEnabled(false);// 开始采集视频后禁用停止采集的按钮必须暂停采集后才可点击停止采集
@ -299,7 +309,6 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene
// long currentTime = AWMp4ParserHelper.getInstance().getVedioTotalTime(new File(finalVideoPath));
timerTask = new CsvTimerTask(new File(finalVideoPath+".txt"));
timer.schedule(timerTask, 0, period*1000);
// // 开始采集每隔2秒实时记录位置信息视频时间以及设备时间
// if (currentTime == 0) {
// timer.schedule(timerTask, 0, period*1000);
@ -319,10 +328,11 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene
// Toast.makeText(PictureActivity.this, "请先拍照", Toast.LENGTH_SHORT).show();
}
// 一段视频拍摄完成自动将当前拍摄路径加1
int lastSubIndex = finalVideoPath.lastIndexOf("-");
int lastPointIndex= finalVideoPath.lastIndexOf(".mp4");
String videoIndex = finalVideoPath.substring(lastSubIndex+1, lastPointIndex);
finalVideoPath = finalVideoPath.substring(0, lastSubIndex) +"-"+(Integer.parseInt(videoIndex)+1)+".mp4";
File finalVideoFile = new File(finalVideoPath);
if (finalVideoFile.exists()) {
int videoIndex = Integer.parseInt(finalVideoFile.getName().replace(".mp4", ""));
finalVideoPath = finalVideoFile.getParentFile().getAbsolutePath()+"/"+(videoIndex+1)+".mp4";
}
}
});
@ -336,6 +346,14 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene
}
// 将秒转化成小时分钟秒
private String formatMiss(long miss){
String hh=miss/3600>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));
}
};
}

View File

@ -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页面的查重
}

View File

@ -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<File> 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);

View File

@ -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<File>) 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<LatLng> getLineString() {
List<File> videoFileList = (List<File>) fmRoadPic.getTag();
List<LatLng> 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<String> 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<File> 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);

View File

@ -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<File> getVideoFileListByUUID(String uuid) {
List<File> 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<File> 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<LatLng> getLineStringByVideoFileList(List<File> videoFileList) {
List<LatLng> 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<String> 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;
}
}

View File

@ -76,5 +76,17 @@
app:layout_constraintBottom_toBottomOf="@id/capuretVideo"
app:layout_constraintLeft_toRightOf="@id/capuretVideo"
app:layout_constraintRight_toRightOf="parent" />
<TextView
android:id="@+id/video_chronometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:background="@color/whiteAlpha50"
android:padding="@dimen/default_widget_padding"
android:format="00:00:00"
android:layout_marginTop="@dimen/default_widget_padding"></TextView>
</androidx.constraintlayout.widget.ConstraintLayout>