From a8e8d7b5d074186c4800056ca88a897e983df180 Mon Sep 17 00:00:00 2001 From: wangdongsheng Date: Fri, 3 Sep 2021 18:35:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E7=9B=B8=E5=86=8C=E5=92=8C?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E9=80=BB=E8=BE=91=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 5 +- app/src/main/AndroidManifest.xml | 2 + .../outdoor/activity/ImageShowActivity.java | 27 ++-- .../outdoor/activity/PictureActivity.java | 10 +- .../outdoor/activity/PicturesActivity.java | 10 +- .../outdoor/activity/VideoActivity.java | 76 +++++++++++ .../navinfo/outdoor/adapter/PhotoAdapter.java | 59 ++++++-- .../navinfo/outdoor/adapter/VideoAdapter.java | 63 +++++++-- .../com/navinfo/outdoor/api/Constant.java | 4 + .../com/navinfo/outdoor/bean/FileBean.java | 38 ++++++ .../outdoor/fragment/PhotoFragment.java | 95 ++++++++++++- .../outdoor/fragment/PoiVideoFragment.java | 126 +++++++++++++----- .../outdoor/fragment/RoadFragment.java | 118 ++++++++++------ .../outdoor/fragment/VideoFragment.java | 92 +++++++++++-- .../outdoor/util/AWMp4ParserHelper.java | 63 ++------- .../navinfo/outdoor/util/PoiSaveUtils.java | 26 ++-- .../res/drawable/ic_baseline_arrow_back.xml | 3 +- .../main/res/drawable/ic_baseline_play.xml | 5 + .../main/res/layout/activity_image_show.xml | 59 ++++---- app/src/main/res/layout/activity_video.xml | 41 ++++++ app/src/main/res/layout/fragment_photo.xml | 38 ++---- app/src/main/res/layout/fragment_road.xml | 10 ++ app/src/main/res/layout/fragment_video.xml | 37 ++--- app/src/main/res/layout/photo_item.xml | 34 ++--- app/src/main/res/layout/video_item.xml | 41 +++--- 25 files changed, 767 insertions(+), 315 deletions(-) create mode 100644 app/src/main/java/com/navinfo/outdoor/activity/VideoActivity.java create mode 100644 app/src/main/java/com/navinfo/outdoor/bean/FileBean.java create mode 100644 app/src/main/res/drawable/ic_baseline_play.xml create mode 100644 app/src/main/res/layout/activity_video.xml diff --git a/app/build.gradle b/app/build.gradle index 1307bc8..0997c7c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 29 buildToolsVersion '29.0.2' - ndkVersion '23.0.7123448' + // ndkVersion '23.0.7123448' defaultConfig { applicationId "com.navinfo.outdoor" @@ -136,4 +136,7 @@ dependencies { implementation 'com.googlecode.mp4parser:isoparser:1.1.21' // Android常用库 https://github.com/l123456789jy/Lazy implementation 'com.github.lazylibrary:lazylibrary:1.0.2' + //饺子播放器 + implementation 'cn.jzvd:jiaozivideoplayer:7.4.2' + } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4eab927..7a21ef3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -96,6 +96,8 @@ + diff --git a/app/src/main/java/com/navinfo/outdoor/activity/ImageShowActivity.java b/app/src/main/java/com/navinfo/outdoor/activity/ImageShowActivity.java index 81e9456..84c95f9 100644 --- a/app/src/main/java/com/navinfo/outdoor/activity/ImageShowActivity.java +++ b/app/src/main/java/com/navinfo/outdoor/activity/ImageShowActivity.java @@ -19,30 +19,24 @@ import java.util.ArrayList; */ public class ImageShowActivity extends BaseActivity implements View.OnClickListener { private ViewPager image_pager; - private TextView page_number; private ArrayList imgUrl; + private int type; @Override protected int getLayout() { return R.layout.activity_image_show; } - @SuppressLint("SetTextI18n") - @Override - protected void initData() { - super.initData(); - imgUrl = getIntent().getStringArrayListExtra("info"); - Log.d("ImageShowActivity", "initData: "+imgUrl); - page_number.setText("1" + "/" + imgUrl.size()); - } - @Override protected void initView() { super.initView(); - image_pager =findViewById(R.id.image_pager); - page_number =findViewById(R.id.page_number); - ImageView download =findViewById(R.id.download); - download.setOnClickListener(this); + imgUrl = getIntent().getStringArrayListExtra("info"); + type = getIntent().getIntExtra("type", 0); + + Log.d("ImageShowActivity", "initData: " + imgUrl); + image_pager = findViewById(R.id.image_pager); + ImageView imageShow = findViewById(R.id.iv_image_show); + imageShow.setOnClickListener(this); initViewPager(); } @@ -51,11 +45,14 @@ public class ImageShowActivity extends BaseActivity implements View.OnClickListe if (imgUrl != null && imgUrl.size() != 0) { ImagePagerAdapter mAdapter = new ImagePagerAdapter(getApplicationContext(), imgUrl); image_pager.setAdapter(mAdapter); + image_pager.setCurrentItem(type); } } @Override public void onClick(View v) { - v.getId(); + if (v.getId() == R.id.iv_image_show) { + finish(); + } } } 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 d8e92a0..a857488 100644 --- a/app/src/main/java/com/navinfo/outdoor/activity/PictureActivity.java +++ b/app/src/main/java/com/navinfo/outdoor/activity/PictureActivity.java @@ -237,11 +237,11 @@ public class PictureActivity extends BaseActivity implements View.OnClickListene // }); removables = new ArrayList<>();//存储轨迹的marker if (poiEntity.getId() != null) { - List videoFileListByUUID = AWMp4ParserHelper.getInstance().getVideoFileListByUUID(poiEntity.getId()); - if (videoFileListByUUID != null) { - List lineStringByVideoFileList = AWMp4ParserHelper.getInstance().getLineStringByVideoFileList(videoFileListByUUID); - for (int i = 0; i < lineStringByVideoFileList.size(); i++) { - LatLng latLng = lineStringByVideoFileList.get(i); + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(poiEntity.getId()); + if (fileListByUUID != null) { + List lineStringByFileList = AWMp4ParserHelper.getInstance().getLineStringByFileList(fileListByUUID); + for (int i = 0; i < lineStringByFileList.size(); i++) { + LatLng latLng = lineStringByFileList.get(i); if (latLng != null) { BitmapDescriptor pileDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.ic_baseline); Marker marker = tencentMap.addMarker(new MarkerOptions(latLng).icon(pileDescriptor).alpha(0.9f) diff --git a/app/src/main/java/com/navinfo/outdoor/activity/PicturesActivity.java b/app/src/main/java/com/navinfo/outdoor/activity/PicturesActivity.java index 8e46a82..80ea7a6 100644 --- a/app/src/main/java/com/navinfo/outdoor/activity/PicturesActivity.java +++ b/app/src/main/java/com/navinfo/outdoor/activity/PicturesActivity.java @@ -184,11 +184,11 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen setLocMarkerStyle(LOCATION_TYPE_LOCATION_ROTATE); initLine(); if (poiEntity.getId() != null) { - List videoFileListByUUID = AWMp4ParserHelper.getInstance().getJPGFileListByUUID(poiEntity.getId()); - if (videoFileListByUUID != null) { - List lineStringByPictureFileList = AWMp4ParserHelper.getInstance().getLineStringByPictureFileList(videoFileListByUUID); - for (int i = 0; i < lineStringByPictureFileList.size(); i++) { - LatLng latLng = lineStringByPictureFileList.get(i); + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(poiEntity.getId()); + if (fileListByUUID != null) { + List lineStringByFileList = AWMp4ParserHelper.getInstance().getLineStringByFileList(fileListByUUID); + for (int i = 0; i < lineStringByFileList.size(); i++) { + LatLng latLng = lineStringByFileList.get(i); if (latLng != null) { BitmapDescriptor pileDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.ic_baseline); Marker marker = tencentMap.addMarker(new MarkerOptions(latLng).icon(pileDescriptor).alpha(0.9f) diff --git a/app/src/main/java/com/navinfo/outdoor/activity/VideoActivity.java b/app/src/main/java/com/navinfo/outdoor/activity/VideoActivity.java new file mode 100644 index 0000000..f31d88e --- /dev/null +++ b/app/src/main/java/com/navinfo/outdoor/activity/VideoActivity.java @@ -0,0 +1,76 @@ +package com.navinfo.outdoor.activity; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.graphics.Bitmap; +import android.media.ThumbnailUtils; +import android.os.Message; +import android.provider.MediaStore; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.viewpager.widget.ViewPager; + +import com.bumptech.glide.Glide; +import com.navinfo.outdoor.R; +import com.navinfo.outdoor.adapter.ImagePagerAdapter; +import com.navinfo.outdoor.api.Constant; +import com.navinfo.outdoor.base.BaseActivity; + +import org.greenrobot.eventbus.EventBus; + +import java.util.ArrayList; +import java.util.Objects; + +import cn.jzvd.Jzvd; +import cn.jzvd.JzvdStd; + +/** + * 点击查看视频 + */ +public class VideoActivity extends BaseActivity implements View.OnClickListener { + + private String videoPath; + private JzvdStd jzvdStd; + + @Override + protected int getLayout() { + return R.layout.activity_video; + } + + @Override + protected void initView() { + super.initView(); + videoPath = getIntent().getStringExtra("video"); + jzvdStd = findViewById(R.id.jz_video); + ImageView imageVideo = findViewById(R.id.iv_video); + imageVideo.setOnClickListener(this); + jzvdStd.setUp(videoPath,"", Jzvd.SCREEN_NORMAL); + Glide.with(this).asDrawable().load(videoPath).into(jzvdStd.posterImageView); //设置图片 + + } + + + @Override + protected void onPause() { + super.onPause(); + Jzvd.releaseAllVideos(); + + } + @Override + public void onBackPressed() { + if (Jzvd.backPress()){ + return; + } + super.onBackPressed(); + } + + @Override + public void onClick(View v) { + if (v.getId() == R.id.iv_video) { + finish(); + } + } +} diff --git a/app/src/main/java/com/navinfo/outdoor/adapter/PhotoAdapter.java b/app/src/main/java/com/navinfo/outdoor/adapter/PhotoAdapter.java index 5e0a122..bf8decb 100644 --- a/app/src/main/java/com/navinfo/outdoor/adapter/PhotoAdapter.java +++ b/app/src/main/java/com/navinfo/outdoor/adapter/PhotoAdapter.java @@ -1,6 +1,7 @@ package com.navinfo.outdoor.adapter; import android.content.Context; +import android.content.Intent; import android.net.Uri; import android.view.LayoutInflater; import android.view.View; @@ -13,11 +14,15 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.navinfo.outdoor.R; +import com.navinfo.outdoor.activity.ImageShowActivity; +import com.navinfo.outdoor.activity.VideoActivity; +import com.navinfo.outdoor.bean.FileBean; import com.navinfo.outdoor.util.AWMp4ParserHelper; import org.jetbrains.annotations.NotNull; import java.io.File; +import java.util.ArrayList; import java.util.List; /** @@ -25,13 +30,31 @@ import java.util.List; */ public class PhotoAdapter extends RecyclerView.Adapter { - private List files ; + private List fileBeans; private Context context; - public PhotoAdapter(List files, Context context) { - this.files = files; + public PhotoAdapter(List files, Context context) { + this.fileBeans = files; this.context = context; } + + public void deleteFile(FileBean fileBeanList) { + for (int i = 0; i < fileBeans.size(); i++) { + String path = fileBeans.get(i).getFile().getPath(); + if (fileBeanList.getFile().getPath().equals(path)) { + fileBeans.set(i,fileBeanList); + } + } + for (int i = 0; i < fileBeans.size(); i++) { + boolean check = fileBeans.get(i).isCheck(); + if (check){ + fileBeans.get(i).getFile().delete(); + fileBeans.remove(fileBeans.get(i)); + notifyDataSetChanged(); + } + } + } + @NotNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -40,23 +63,43 @@ public class PhotoAdapter extends RecyclerView.Adapter } @Override - public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - File file= files.get(position); + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + FileBean fileBean = fileBeans.get(position); + File file = fileBean.getFile(); if (file.exists()) { AWMp4ParserHelper.getInstance().loadFirstWithGlide(context, Uri.fromFile(file).toString(), holder.ivPhoto, 500); } + holder.ivPhoto.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ArrayList arrayList = new ArrayList<>(); + for (int i = 0; i < fileBeans.size(); i++) { + arrayList.add(fileBeans.get(i).getFile().getPath()); + } + Intent intent = new Intent(context, ImageShowActivity.class); + intent.putExtra("info", arrayList); + intent.putExtra("type",position); + + context.startActivity(intent); + } + }); + holder.cbPhoto.setChecked(fileBean.isCheck()); holder.cbPhoto.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - + if (photoClickItem != null) { + fileBean.setCheck(isChecked); + photoClickItem.item(isChecked, fileBean); + } } }); } + @Override public int getItemCount() { - return files.size(); + return fileBeans.size(); } static class ViewHolder extends RecyclerView.ViewHolder { @@ -77,7 +120,7 @@ public class PhotoAdapter extends RecyclerView.Adapter } public interface photoClickItem { - void item(int aInt); + void item(boolean isBoolean, FileBean fileBean); } diff --git a/app/src/main/java/com/navinfo/outdoor/adapter/VideoAdapter.java b/app/src/main/java/com/navinfo/outdoor/adapter/VideoAdapter.java index 5e20f3b..762fad6 100644 --- a/app/src/main/java/com/navinfo/outdoor/adapter/VideoAdapter.java +++ b/app/src/main/java/com/navinfo/outdoor/adapter/VideoAdapter.java @@ -1,6 +1,7 @@ package com.navinfo.outdoor.adapter; import android.content.Context; +import android.content.Intent; import android.net.Uri; import android.view.LayoutInflater; import android.view.View; @@ -13,11 +14,14 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.navinfo.outdoor.R; +import com.navinfo.outdoor.activity.VideoActivity; +import com.navinfo.outdoor.bean.FileBean; import com.navinfo.outdoor.util.AWMp4ParserHelper; import org.jetbrains.annotations.NotNull; import java.io.File; +import java.util.ArrayList; import java.util.List; /** @@ -25,14 +29,45 @@ import java.util.List; */ public class VideoAdapter extends RecyclerView.Adapter { - private List files ; + private List fileBeans; private Context context; + private List textFile=new ArrayList<>(); - public VideoAdapter(List files, Context context) { - this.files = files; + public VideoAdapter(List files, Context context) { + this.fileBeans = files; this.context = context; } + public void setTextFile(List textFile) { + this.textFile.addAll(textFile); + notifyDataSetChanged(); + } + + public void deleteFile(FileBean fileBeanList) { + for (int i = 0; i < fileBeans.size(); i++) { + String path = fileBeans.get(i).getFile().getPath(); + if (fileBeanList.getFile().getPath().equals(path)) { + fileBeans.set(i,fileBeanList); + } + } + for (int i = 0; i < fileBeans.size(); i++) { + boolean check = fileBeans.get(i).isCheck(); + if (check){ + fileBeans.get(i).getFile().delete(); + if (textFile!=null){ + for (int i1 = 0; i1 < textFile.size(); i1++) { + if (textFile.get(i).getPath().contains(fileBeans.get(i).getFile().getPath())){ + textFile.get(i).delete(); + } + } + } + fileBeans.remove(fileBeans.get(i)); + notifyDataSetChanged(); + } + } + } + + @NotNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -42,21 +77,33 @@ public class VideoAdapter extends RecyclerView.Adapter @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - File file= files.get(position); + FileBean fileBean = fileBeans.get(position); + File file = fileBean.getFile(); if (file.exists()) { AWMp4ParserHelper.getInstance().loadFirstWithGlide(context, Uri.fromFile(file).toString(), holder.ivVideo, 500); } - + holder.ivVideo.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(context, VideoActivity.class); + intent.putExtra("video",fileBean.getFile().getPath()); + context.startActivity(intent); + } + }); + holder.cbVideo.setChecked(fileBean.isCheck()); holder.cbVideo.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - + if (photoClickItem != null) { + fileBean.setCheck(isChecked); + photoClickItem.item(isChecked, fileBean); + } } }); } @Override public int getItemCount() { - return files.size(); + return fileBeans.size(); } class ViewHolder extends RecyclerView.ViewHolder { @@ -77,7 +124,7 @@ public class VideoAdapter extends RecyclerView.Adapter } public interface photoClickItem { - void item(int aInt); + void item(boolean isBoolean, FileBean fileBean); } 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 a68d867..612ae1c 100644 --- a/app/src/main/java/com/navinfo/outdoor/api/Constant.java +++ b/app/src/main/java/com/navinfo/outdoor/api/Constant.java @@ -144,6 +144,10 @@ public class Constant { public static final int PICTURE_VIDEO_WORD = 48; //视频页面崩溃后发给poi录像和道路 public static final int REGISTER_WORD = 46; //注册的返回 + public static final int VIDEO_FINISH_ROAD = 47;//录像视频列表的返回 + public static final int PHOTO_FINISH_VIDEO = 49;//拍照列表的返回 + + public static int NUMBER = 200; //任务个数 public static int LIMIT_TYPE = -1; //权限类型,普通任务-0,专属任务-1 diff --git a/app/src/main/java/com/navinfo/outdoor/bean/FileBean.java b/app/src/main/java/com/navinfo/outdoor/bean/FileBean.java new file mode 100644 index 0000000..47f36e2 --- /dev/null +++ b/app/src/main/java/com/navinfo/outdoor/bean/FileBean.java @@ -0,0 +1,38 @@ +package com.navinfo.outdoor.bean; + +import java.io.File; + +public class FileBean { + private File file; + private boolean isCheck; + private File txtFile; + + public FileBean(File file, boolean isCheck) { + this.file = file; + this.isCheck = isCheck; + } + + public File getTxtFile() { + return txtFile; + } + + public void setTxtFile(File txtFile) { + this.txtFile = txtFile; + } + + public File getFile() { + return file; + } + + public void setFile(File file) { + this.file = file; + } + + public boolean isCheck() { + return isCheck; + } + + public void setCheck(boolean check) { + isCheck = check; + } +} diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/PhotoFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/PhotoFragment.java index 1c2b550..59e8dad 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/PhotoFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/PhotoFragment.java @@ -1,9 +1,12 @@ package com.navinfo.outdoor.fragment; import android.os.Bundle; +import android.os.Message; +import android.view.KeyEvent; import android.view.View; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -11,10 +14,15 @@ import androidx.recyclerview.widget.RecyclerView; import com.jcodecraeer.xrecyclerview.XRecyclerView; import com.navinfo.outdoor.R; import com.navinfo.outdoor.adapter.PhotoAdapter; +import com.navinfo.outdoor.api.Constant; import com.navinfo.outdoor.base.BaseFragment; +import com.navinfo.outdoor.bean.FileBean; import com.navinfo.outdoor.room.PoiEntity; import com.navinfo.outdoor.util.AWMp4ParserHelper; +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; + import java.io.File; import java.util.ArrayList; import java.util.List; @@ -26,46 +34,93 @@ import java.util.Objects; public class PhotoFragment extends BaseFragment implements View.OnClickListener { - private List fileArrayList; + private ArrayList fileBeans; + private ArrayList deleteFiles; + private PhotoAdapter photoAdapter; public static PhotoFragment newInstance(Bundle bundle) { PhotoFragment fragment = new PhotoFragment(); fragment.setArguments(bundle); return fragment; } + @Override + public void onStart() { + super.onStart(); + if (!EventBus.getDefault().isRegistered(this)) {//加上判断 + EventBus.getDefault().register(this); + } + } @Override protected int getLayout() { return R.layout.fragment_photo; } + @Override + public void onResume() { + super.onResume(); + getFocus(); + } + //主界面获取焦点 + private void getFocus() { + Objects.requireNonNull(getView()).setFocusableInTouchMode(true); + getView().requestFocus(); + getView().setOnKeyListener(new View.OnKeyListener() { + @Override + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { + Message message = new Message(); + message.what= Constant.PHOTO_FINISH_VIDEO; + EventBus.getDefault().post(message); + Objects.requireNonNull(getActivity()).finish(); + return true; + } + return false; + } + }); + } @Override protected void initView() { super.initView(); PoiEntity showPoiEntity = (PoiEntity) Objects.requireNonNull(getActivity()).getIntent().getSerializableExtra("showPoiEntity"); + deleteFiles = new ArrayList<>(); if (showPoiEntity!=null){ String id = showPoiEntity.getId(); if (showPoiEntity.getRecord_way()==2){//連拍 - fileArrayList = new ArrayList<>(); - List fileListByUUID = AWMp4ParserHelper.getInstance().getVideoFileListByUUID(id); + fileBeans = new ArrayList<>(); + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(id); for (int i = 0; i < fileListByUUID.size(); i++) { if (!fileListByUUID.get(i).getPath().contains(".txt")){ - fileArrayList.add(fileListByUUID.get(i)); + fileBeans.add(new FileBean(fileListByUUID.get(i),false)); } } } } ImageView ivPhotoFinal = (ImageView) findViewById(R.id.iv_photo_final); ivPhotoFinal.setOnClickListener(this); - TextView tvPhotoChoose = (TextView) findViewById(R.id.tv_photo_choose); - tvPhotoChoose.setOnClickListener(this); TextView tvPhotoAlbumDelete = (TextView) findViewById(R.id.tv_photo_album_delete); tvPhotoAlbumDelete.setOnClickListener(this); RecyclerView photoRecycler = findViewById(R.id.photo_album_recycler); photoRecycler.setLayoutManager(new GridLayoutManager(getContext(),2)); - PhotoAdapter photoAdapter = new PhotoAdapter(fileArrayList, getContext()); + photoAdapter = new PhotoAdapter(fileBeans, getContext()); photoRecycler.setAdapter(photoAdapter); + photoAdapter.setPhotoClickItem(new PhotoAdapter.photoClickItem() { + @Override + public void item(boolean isChecked, FileBean fileBean) { + if (isChecked){ + deleteFiles.add(fileBean); + }else { + if (deleteFiles!=null){ + for (int i = 0; i < deleteFiles.size(); i++) { + if (fileBean.getFile().getPath().equals(deleteFiles.get(i).getFile().getPath())){ + deleteFiles.remove(fileBean); + } + } + } + } + } + }); } @Override @@ -73,13 +128,39 @@ public class PhotoFragment extends BaseFragment implements View.OnClickListener super.initData(); } + + @Subscribe + public void onEvent(Message data) { + + } + @Override public void onClick(View v) { switch (v.getId()){ case R.id.iv_photo_final: + Message message = new Message(); + message.what= Constant.PHOTO_FINISH_VIDEO; + EventBus.getDefault().post(message); Objects.requireNonNull(getActivity()).finish(); break; + case R.id.tv_photo_album_delete: + if (fileBeans!=null){ + for (int i = 0; i < fileBeans.size(); i++) { + photoAdapter.deleteFile(fileBeans.get(i)); + } + + }else { + Toast.makeText(getContext(), "请选择要删除的数据后才可以删除", Toast.LENGTH_SHORT).show(); + } + break; } } + + @Override + public void onDestroy() { + if (EventBus.getDefault().isRegistered(this))//加上判断 + EventBus.getDefault().unregister(this); + super.onDestroy(); + } } 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 5b5450a..ab74716 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java @@ -171,7 +171,24 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick rbWalking = findViewById(R.id.rb_walking); rbManual = findViewById(R.id.rb_manual); tvPhotoAlbum = findViewById(R.id.tv_photo_album); - tvPhotoAlbum.setOnClickListener(this::onClick); + tvPhotoAlbum.setOnClickListener(this); + /*fmRoadPic.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (v.getTag() == null || ((List) v.getTag()).size() == 0) { + Toast.makeText(getActivity(), "还没有拍摄视频!", Toast.LENGTH_SHORT).show(); + return; + } + + 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_OBLATION, 0); + intent.putExtra("poiEntity", showPoiEntity); + startActivityForResult(intent, 0x101); + } + });*/ + rgType.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { @@ -195,9 +212,9 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick MessageDialog.show((AppCompatActivity) Objects.requireNonNull(getContext()), "提示", "是否删除", "确定", "取消").setOkButton(new OnDialogButtonClickListener() { @Override public boolean onClick(BaseDialog baseDialog, View v) { - List videoFileListByUUID = AWMp4ParserHelper.getInstance().getVideoFileListByUUID(showPoiEntity.getId()); - for (int i = 0; i < videoFileListByUUID.size(); i++) { - videoFileListByUUID.get(i).delete(); + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(showPoiEntity.getId()); + for (int i = 0; i < fileListByUUID.size(); i++) { + fileListByUUID.get(i).delete(); } ivPoiVideoPicture.setImageDrawable(null); return false; @@ -246,17 +263,16 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick tvPictures.setEnabled(false); if (!StringUtils.isEmpty(photoList)) { boolean isImageLoad = false; - List videoFileListByUUID = AWMp4ParserHelper.getInstance().getVideoFileListByUUID(showPoiEntity.getId()); - for (int i = 0; i < videoFileListByUUID.size(); i++) { - if (videoFileListByUUID.get(i).getPath().contains("0.mp4") && !videoFileListByUUID.get(i).getPath().contains("0.mp4.txt")) { - if (videoFileListByUUID.get(i).exists() && !isImageLoad) { + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(showPoiEntity.getId()); + for (int i = 0; i < fileListByUUID.size(); i++) { + if (fileListByUUID.get(i).getPath().contains(".mp4") && !fileListByUUID.get(i).getPath().contains(".mp4.txt")) { + if (fileListByUUID.get(i).exists() && !isImageLoad) { // 使用glide加载视频的第一帧 - AWMp4ParserHelper.getInstance().loadFirstWithGlide(getActivity(), Uri.fromFile(videoFileListByUUID.get(i)).toString(), ivPoiVideoPicture, 500); + AWMp4ParserHelper.getInstance().loadFirstWithGlide(getActivity(), Uri.fromFile(fileListByUUID.get(i)).toString(), ivPoiVideoPicture, 500); isImageLoad = true; } - } - fmPoiVideoPic.setTag(videoFileListByUUID); + fmPoiVideoPic.setTag(fileListByUUID); } } } else if (record_way == 2) {//连拍 @@ -267,17 +283,17 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick tvPicture.setEnabled(false); if (!StringUtils.isEmpty(photoList)) { boolean isImageLoad = false; - List pictureFileListByUUID = AWMp4ParserHelper.getInstance().getJPGFileListByUUID(showPoiEntity.getId()); - for (int i = 0; i < pictureFileListByUUID.size(); i++) { - if (pictureFileListByUUID.get(i).getPath().contains("0.jpg") && !pictureFileListByUUID.get(i).getPath().contains("paper.txt")) { - if (pictureFileListByUUID.get(i).exists() && !isImageLoad) { + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(showPoiEntity.getId()); + for (int i = 0; i < fileListByUUID.size(); i++) { + if (fileListByUUID.get(i).getPath().contains(".jpg") && !fileListByUUID.get(i).getPath().contains("paper.txt")) { + if (fileListByUUID.get(i).exists() && !isImageLoad) { // 使用glide加载视频的第一帧 - Glide.with(Objects.requireNonNull(getActivity())).load(pictureFileListByUUID.get(i)).into(ivPoiVideoPicture); + Glide.with(Objects.requireNonNull(getActivity())).load(fileListByUUID.get(i)).into(ivPoiVideoPicture); isImageLoad = true; } } } - fmPoiVideoPic.setTag(pictureFileListByUUID); + fmPoiVideoPic.setTag(fileListByUUID); } } } @@ -322,6 +338,8 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick } private void disables() { + fmPoiVideoPic.setEnabled(false); + tvPhotoAlbum.setEnabled(false); etRoadName.setEnabled(false); ivPoiVideoPicture.setEnabled(false); tvPictures.setEnabled(false); @@ -341,6 +359,46 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick if ((boolean) data.obj) { initPoiVideoSharePre(); } + } else if (data.what == Constant.VIDEO_FINISH_ROAD) { + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(showPoiEntity.getId()); + if (fileListByUUID.size()==0) { + ivPoiVideoPicture.setImageDrawable(null); + } else { + boolean isImageLoad = false; + for (int i = 0; i < fileListByUUID.size(); i++) { + File videoFile = fileListByUUID.get(i); + if (videoFile.getPath().contains(".mp4") && !videoFile.getPath().contains(".mp4.txt")) { + if (videoFile.exists() && !isImageLoad) { + // 使用glide加载视频的第一帧 + AWMp4ParserHelper.getInstance().loadFirstWithGlide(getActivity(), Uri.fromFile(videoFile).toString(), ivPoiVideoPicture, 500); + isImageLoad = true; + } + } + } + fmPoiVideoPic.setTag(fileListByUUID); + } + }else if (data.what==Constant.PHOTO_FINISH_VIDEO){ + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(showPoiEntity.getId()); + + if (fileListByUUID.size()==1) { + for (int i = 0; i < fileListByUUID.size(); i++) { + fileListByUUID.get(i).delete(); + } + ivPoiVideoPicture.setImageDrawable(null); + } else { + boolean isImageLoad = false; + for (int i = 0; i < fileListByUUID.size(); i++) { + File videoFile = fileListByUUID.get(i); + if (videoFile.getPath().contains(".jpg") && !videoFile.getPath().contains("paper.txt")) { + if (videoFile.exists() && !isImageLoad) { + // 使用glide加载视频的第一帧 + AWMp4ParserHelper.getInstance().loadFirstWithGlide(getActivity(), Uri.fromFile(videoFile).toString(), ivPoiVideoPicture, 500); + isImageLoad = true; + } + } + } + fmPoiVideoPic.setTag(fileListByUUID); + } } } @@ -605,8 +663,8 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick File videoFile = new File(videoPath); if (videoFile.exists()) { AWMp4ParserHelper.getInstance().loadFirstWithGlide(getActivity(), Uri.fromFile(videoFile).toString(), ivPoiVideoPicture, 500); - List videoFileListByUUID = AWMp4ParserHelper.getInstance().getVideoFileListByUUID(showPoiEntity.getId()); - fmPoiVideoPic.setTag(videoFileListByUUID); + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(showPoiEntity.getId()); + fmPoiVideoPic.setTag(fileListByUUID); } } } else if (requestCode == 0x102 && resultCode == 0x102) { @@ -624,8 +682,8 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick File pictureFile = new File(videoPath); if (pictureFile.exists()) { AWMp4ParserHelper.getInstance().loadFirstWithGlide(getActivity(), Uri.fromFile(pictureFile).toString(), ivPoiVideoPicture, 500); - List pictureFileListByUUID = AWMp4ParserHelper.getInstance().getJPGFileListByUUID(showPoiEntity.getId()); - fmPoiVideoPic.setTag(pictureFileListByUUID); + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(showPoiEntity.getId()); + fmPoiVideoPic.setTag(fileListByUUID); } } } @@ -767,13 +825,13 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick @Override protected PoiEntity initPoiEntityByUI(PoiEntity poiEntity) { String roadName = etRoadName.getText().toString().trim(); - if (roadName != null && !roadName.equals("")) { + if (!roadName.equals("")) { poiEntity.setName(roadName + ""); } else { - DateFormat formatters = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"); + DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"); Calendar calendars = Calendar.getInstance(); calendars.setTimeInMillis(System.currentTimeMillis()); - String formats = formatters.format(calendars.getTime()); + String formats = formatter.format(calendars.getTime()); String city = Constant.currentLocation.getCity();//返回当前位置的城市. String district = Constant.currentLocation.getDistrict();//返回当前位置的区县. StringBuilder sb = new StringBuilder("poi录像上报"); @@ -811,14 +869,14 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick poiEntity.setTaskStatus(2); if (isRequest == 0x101) { if (fmPoiVideoPic.getTag() == null) { - List videoFileListByUUID = AWMp4ParserHelper.getInstance().getVideoFileListByUUID(showPoiEntity.getId()); - if (videoFileListByUUID != null) { - fmPoiVideoPic.setTag(videoFileListByUUID); + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(showPoiEntity.getId()); + if (fileListByUUID != null) { + fmPoiVideoPic.setTag(fileListByUUID); } } if (fmPoiVideoPic.getTag() != null && !((List) fmPoiVideoPic.getTag()).isEmpty()) { - List lineStringByVideoFileList = AWMp4ParserHelper.getInstance().getLineStringByVideoFileList((List) fmPoiVideoPic.getTag()); - String lineString = GeometryTools.getLineString(lineStringByVideoFileList); + List lineStringByFileList = AWMp4ParserHelper.getInstance().getLineStringByFileList((List) fmPoiVideoPic.getTag()); + String lineString = GeometryTools.getLineString(lineStringByFileList); Log.d("TAG", "onGranted: " + lineString); String photoStr = AWMp4ParserHelper.getInstance().getVideoFileListStr((List) fmPoiVideoPic.getTag()); poiEntity.setPhoto(photoStr); @@ -829,14 +887,14 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick } } else if (isRequest == 0x102) { if (fmPoiVideoPic.getTag() == null) { - List pictureFileListByUUID = AWMp4ParserHelper.getInstance().getJPGFileListByUUID(showPoiEntity.getId()); - if (pictureFileListByUUID != null) { - fmPoiVideoPic.setTag(pictureFileListByUUID); + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(showPoiEntity.getId()); + if (fileListByUUID != null) { + fmPoiVideoPic.setTag(fileListByUUID); } } if (fmPoiVideoPic.getTag() != null && !((List) fmPoiVideoPic.getTag()).isEmpty()) { - List lineStringByVideoFileList = AWMp4ParserHelper.getInstance().getLineStringByVideoFileList((List) fmPoiVideoPic.getTag()); - String lineString = GeometryTools.getLineString(lineStringByVideoFileList); + List lineStringByFileList = AWMp4ParserHelper.getInstance().getLineStringByFileList((List) fmPoiVideoPic.getTag()); + String lineString = GeometryTools.getLineString(lineStringByFileList); Log.d("TAG", "onGranted: " + lineString); String photoStr = AWMp4ParserHelper.getInstance().getVideoFileListStr((List) fmPoiVideoPic.getTag()); poiEntity.setPhoto(photoStr); 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 ab1dcc1..e903dcb 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java @@ -66,6 +66,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.List; +import java.util.Objects; /** * 寻宝-点击上传弹窗-道路 @@ -81,14 +82,12 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList private EditText etDesc; private Button btnRoadSave; private RadioGroup rgType; - private PoiDatabase poiDatabase; private PoiDao poiDao; - private Button roadUpload; private File fileZip; private FrameLayout fmRoadPic; - private NestedScrollView nestedScrollView; private Marker markerRoad; private LatLng latLng; + private TextView tvVideoAlbum; public static RoadFragment newInstance(Bundle bundle) { RoadFragment fragment = new RoadFragment(); @@ -145,12 +144,14 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList @Override protected void initView() { super.initView(); - poiDatabase = PoiDatabase.getInstance(getContext()); + PoiDatabase poiDatabase = PoiDatabase.getInstance(getContext()); poiDao = poiDatabase.getPoiDao(); tvPictures = (TextView) findViewById(R.id.tv_pictures); - tvPictures.setOnClickListener(this::onClick); + tvPictures.setOnClickListener(this); + tvVideoAlbum = findViewById(R.id.tv_video_album); + tvVideoAlbum.setOnClickListener(this); setSlidingUpPanelLayout(Constant.SLIDING_LAYOUT); - nestedScrollView = findViewById(R.id.nested_scroll_view); + NestedScrollView nestedScrollView = findViewById(R.id.nested_scroll_view); if (slidingPaneLayout != null) { slidingPaneLayout.setScrollableView(nestedScrollView); } @@ -165,10 +166,10 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList btnRoadSave = (Button) findViewById(R.id.btn_road_save); btnRoadSave.setOnClickListener(this::onClick); rgType = (RadioGroup) findViewById(R.id.rg_type); - roadUpload = findViewById(R.id.road_upload); + Button roadUpload = findViewById(R.id.road_upload); roadUpload.setOnClickListener(this::onClick); showPictureType(1); - fmRoadPic.setOnClickListener(new View.OnClickListener() { + /*fmRoadPic.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (v.getTag() == null || ((List) v.getTag()).size() == 0) { @@ -183,7 +184,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList intent.putExtra("poiEntity", showPoiEntity); startActivityForResult(intent, 0x101); } - }); + });*/ fmRoadPic.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { @@ -191,9 +192,9 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList MessageDialog.show((AppCompatActivity) getContext(), "提示", "是否删除", "确定", "取消").setOkButton(new OnDialogButtonClickListener() { @Override public boolean onClick(BaseDialog baseDialog, View v) { - List videoFileListByUUID = AWMp4ParserHelper.getInstance().getVideoFileListByUUID(showPoiEntity.getId()); - for (int i = 0; i < videoFileListByUUID.size(); i++) { - videoFileListByUUID.get(i).delete(); + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(showPoiEntity.getId()); + for (int i = 0; i < fileListByUUID.size(); i++) { + fileListByUUID.get(i).delete(); } ivRoadPicture.setImageDrawable(null); return false; @@ -211,11 +212,12 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList private void initShowPoi() { // 添加信息: + assert getArguments() != null; showPoiEntity = (PoiEntity) getArguments().getSerializable("poiEntity"); if (showPoiEntity != null) { String name = showPoiEntity.getName();//名称 if (name != null && !name.equals("")) { - etRoadName.setText(name + ""); + etRoadName.setText(name); } String x = showPoiEntity.getX(); String y = showPoiEntity.getY(); @@ -234,18 +236,17 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList if (describe != null && !describe.equals("")) { etDesc.setText(describe); } - String photoList = showPoiEntity.getPhoto(); + String photoList = showPoiEntity.getPhoto();//存儲在數據庫中的數據 if (!StringUtils.isEmpty(photoList)) { String[] photos = photoList.split(","); List videoFileList = new ArrayList<>(); boolean isImageLoad = false; - if (photos != null && photos.length > 0) { - for (int i = 0; i < photos.length; i++) { - String photo = photos[i]; + if (photos.length > 0) { + for (String photo : photos) { if (!StringUtils.isEmpty(photo)) { File videoFile = new File(photo); videoFileList.add(new File(photo)); - if (videoFile.getPath().contains("0.mp4") && !videoFile.getPath().contains("0.mp4.txt")) { + if (videoFile.getPath().contains(".mp4") && !videoFile.getPath().contains(".mp4.txt")) { if (videoFile.exists() && !isImageLoad) { // 使用glide加载视频的第一帧 AWMp4ParserHelper.getInstance().loadFirstWithGlide(getActivity(), Uri.fromFile(videoFile).toString(), ivRoadPicture, 500); @@ -254,20 +255,20 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList } } } - fmRoadPic.setTag(videoFileList); } } } - + assert showPoiEntity != null; if (showPoiEntity.getTaskStatus() == 3) { disables(); } - } //禁用控件 private void disables() { + fmRoadPic.setEnabled(false); + tvVideoAlbum.setEnabled(false); etRoadName.setEnabled(false); rgType.setEnabled(false); ivRoadPicture.setEnabled(false); @@ -285,6 +286,24 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList if ((boolean) data.obj) { initRoadSharePre(); } + } else if (data.what == Constant.VIDEO_FINISH_ROAD) { + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(showPoiEntity.getId()); + if (fileListByUUID.size()==0) { + ivRoadPicture.setImageDrawable(null); + } else { + boolean isImageLoad = false; + for (int i = 0; i < fileListByUUID.size(); i++) { + File videoFile = fileListByUUID.get(i); + if (videoFile.getPath().contains(".mp4") && !videoFile.getPath().contains(".mp4.txt")) { + if (videoFile.exists() && !isImageLoad) { + // 使用glide加载视频的第一帧 + AWMp4ParserHelper.getInstance().loadFirstWithGlide(getActivity(), Uri.fromFile(videoFile).toString(), ivRoadPicture, 500); + isImageLoad = true; + } + } + } + fmRoadPic.setTag(fileListByUUID); + } } } @@ -294,6 +313,19 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList case R.id.btn_road_save: initPoiSaveLocal(false); break; + case R.id.tv_video_album: + if (fmRoadPic.getTag() == null) { + Toast.makeText(getContext(), "请录像后才可以查看", Toast.LENGTH_SHORT).show(); + return; + } + if (tvPictures.isEnabled()) { + showPoiEntity.setRecord_way(1); + Intent photoAlbumIntent = new Intent(getActivity(), FragmentManagement.class); + photoAlbumIntent.putExtra("tag", 37); + photoAlbumIntent.putExtra("showPoiEntity", showPoiEntity); + startActivity(photoAlbumIntent); + } + break; case R.id.tv_pictures: // 根据用户点击的时间为视频名称赋值 @@ -318,7 +350,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList ZipUtil.zipFiles(videoFileList, fileZip, null);//压缩 PoiEntity poiDaoPoiEntity = poiDao.getPoiEntity(showPoiEntity.getId()); if (poiDaoPoiEntity == null || poiDaoPoiEntity.getTaskStatus() == 1 || poiDaoPoiEntity.getTaskStatus() == 2 || poiDaoPoiEntity.getTaskStatus() == 0 || poiDaoPoiEntity.getTaskStatus() == 5) { - getActivity().runOnUiThread(new Runnable() { + Objects.requireNonNull(getActivity()).runOnUiThread(new Runnable() { @Override public void run() { dismissLoadingDialog(); @@ -327,7 +359,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList }); } else { - getActivity().runOnUiThread(new Runnable() { + Objects.requireNonNull(getActivity()).runOnUiThread(new Runnable() { @Override public void run() { dismissLoadingDialog(); @@ -365,7 +397,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList @Override public void run() { InsertAndUpdateUtils.getInstance().insertOrUpdate(getContext(), poiEntity); - getActivity().runOnUiThread(new Runnable() { + Objects.requireNonNull(getActivity()).runOnUiThread(new Runnable() { @Override public void run() { roadSaveBetWork(poiEntity, isLocal); @@ -384,7 +416,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList if (never) { Toast.makeText(getActivity(), "被永久拒绝授权,请手动授予权限", Toast.LENGTH_SHORT).show(); // 如果是被永久拒绝就跳转到应用权限系统设置页面 - XXPermissions.startPermissionActivity(getActivity(), permissions); + XXPermissions.startPermissionActivity(Objects.requireNonNull(getActivity()), permissions); } } @@ -424,7 +456,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList public void run() { PoiEntity poiDaoPoiEntity = poiDao.getPoiEntity(showPoiEntity.getId()); poiDao.deletePoiEntity(poiDaoPoiEntity); - getActivity().runOnUiThread(new Runnable() { + Objects.requireNonNull(getActivity()).runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getActivity(), "上传成功", Toast.LENGTH_SHORT).show(); @@ -478,7 +510,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList @Override public void run() { InsertAndUpdateUtils.getInstance().insertOrUpdate(getContext(), poiEntity); - getActivity().runOnUiThread(new Runnable() { + Objects.requireNonNull(getActivity()).runOnUiThread(new Runnable() { @Override public void run() { if (isLocal) { @@ -521,8 +553,8 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList if (resultCode == 0x101) { if (data != null && data.hasExtra(Constant.INTENT_VIDEO_PATH)) { // 扫描照片目录中当前视频的所有视频文件 - String videoPath = data.getStringExtra(Constant.INTENT_VIDEO_PATH); + assert videoPath != null; File videoFile = new File(videoPath); if (videoFile.exists()) { Bitmap bitmap = AWMp4ParserHelper.getInstance().getLocalVideoBitmap(videoPath); @@ -530,7 +562,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList int width = bitmap.getWidth(); if (height > width) { DialogSettings.style = DialogSettings.STYLE.STYLE_KONGZUE; - MessageDialog.show((AppCompatActivity) getContext(), "提示", "请重新录像,要求横屏录像", "确定").setOkButton(new OnDialogButtonClickListener() { + MessageDialog.show((AppCompatActivity) Objects.requireNonNull(getContext()), "提示", "请重新录像,要求横屏录像", "确定").setOkButton(new OnDialogButtonClickListener() { @Override public boolean onClick(BaseDialog baseDialog, View v) { Intent intentPanorama = new Intent(getActivity(), PictureActivity.class); @@ -541,12 +573,11 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList return false; } }); - return; } else { if (videoFile.exists()) { AWMp4ParserHelper.getInstance().loadFirstWithGlide(getActivity(), Uri.fromFile(videoFile).toString(), ivRoadPicture, 500); - List videoFileListByUUID = AWMp4ParserHelper.getInstance().getVideoFileListByUUID(showPoiEntity.getId()); - fmRoadPic.setTag(videoFileListByUUID); + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(showPoiEntity.getId()); + fmRoadPic.setTag(fileListByUUID); } } @@ -571,7 +602,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList //表示文件名,系统将会在/dada/dada/包名/shared_prefs目录下生成 //一个以该参数命名的.xml文件。第二个mode表示创建的模式,通过查看 //方法注释得知,建议以0或者MODE_PRIVATE为默认值。 - SharedPreferences poi = getActivity().getSharedPreferences(Constant.DATA_FILE, 0); + SharedPreferences poi = Objects.requireNonNull(getActivity()).getSharedPreferences(Constant.DATA_FILE, 0); //获取Editor对象 SharedPreferences.Editor edit = poi.edit(); //根据要保存的数据的类型,调用对应的put方法, @@ -580,7 +611,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList //以键值对的形式添加新值。 edit.putString("poiEntity", newPoiEntity); //提交新值。必须执行,否则前面的操作都无效。 - edit.commit(); + edit.apply(); Log.d("TAG", "initRoadSharePre: " + newPoiEntity); } @@ -617,7 +648,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList if (showPoiEntity != null) { if (showPoiEntity.getTaskStatus() == 5) { initEndReceiveTask(HttpInterface.UNRECEIVED_POLYGON_TASK, showPoiEntity); - }else { + } else { Message obtain = Message.obtain(); obtain.what = Constant.JOB_WORD_MONITOR; obtain.obj = true; @@ -627,6 +658,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList } } + @Override public void onDestroy() { if (EventBus.getDefault().isRegistered(this))//加上判断 @@ -683,7 +715,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList @Override protected PoiEntity initPoiEntityByUI(PoiEntity poiEntity) { String roadName = etRoadName.getText().toString().trim(); - if (roadName != null && !roadName.equals("")) { + if (!roadName.equals("")) { poiEntity.setName(roadName); } else { DateFormat formatters = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"); @@ -702,7 +734,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList } sb.append("-").append(formats); poiEntity.setName(sb.toString()); - getActivity().runOnUiThread(new Runnable() { + Objects.requireNonNull(getActivity()).runOnUiThread(new Runnable() { @Override public void run() { etRoadName.setText(sb); @@ -715,7 +747,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList poiEntity.setWork_type(pictureType); } String desc = etDesc.getText().toString().trim(); - if (desc != null && !desc.equals("")) { + if (!desc.equals("")) { poiEntity.setMemo(desc); } DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @@ -726,14 +758,14 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList poiEntity.setType(4); poiEntity.setTaskStatus(2); if (fmRoadPic.getTag() == null) { - List videoFileListByUUID = AWMp4ParserHelper.getInstance().getVideoFileListByUUID(showPoiEntity.getId()); - if (videoFileListByUUID != null) { - fmRoadPic.setTag(videoFileListByUUID); + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(showPoiEntity.getId()); + if (fileListByUUID != null) { + fmRoadPic.setTag(fileListByUUID); } } if (fmRoadPic.getTag() != null && !((List) fmRoadPic.getTag()).isEmpty()) { - List lineStringByVideoFileList = AWMp4ParserHelper.getInstance().getLineStringByVideoFileList((List) fmRoadPic.getTag()); - String lineString = GeometryTools.getLineString(lineStringByVideoFileList); + List lineStringByFileList = AWMp4ParserHelper.getInstance().getLineStringByFileList((List) fmRoadPic.getTag()); + String lineString = GeometryTools.getLineString(lineStringByFileList); Log.d("TAG", "onGranted: " + lineString); String photoStr = AWMp4ParserHelper.getInstance().getVideoFileListStr((List) fmRoadPic.getTag()); poiEntity.setPhoto(photoStr); diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/VideoFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/VideoFragment.java index 6496144..6dbfd1a 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/VideoFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/VideoFragment.java @@ -1,20 +1,29 @@ package com.navinfo.outdoor.fragment; import android.os.Bundle; +import android.os.Message; +import android.view.KeyEvent; import android.view.View; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.navinfo.outdoor.R; +import com.navinfo.outdoor.adapter.PhotoAdapter; import com.navinfo.outdoor.adapter.VideoAdapter; +import com.navinfo.outdoor.api.Constant; import com.navinfo.outdoor.base.BaseFragment; +import com.navinfo.outdoor.bean.FileBean; import com.navinfo.outdoor.room.PoiEntity; import com.navinfo.outdoor.util.AWMp4ParserHelper; +import org.greenrobot.eventbus.EventBus; + import java.io.File; +import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -23,7 +32,10 @@ import java.util.Objects; */ public class VideoFragment extends BaseFragment implements View.OnClickListener { - private List fileListByUUID; + + private ArrayList fileBeans; + private ArrayList deleteFiles; + private VideoAdapter videoAdapter; public static VideoFragment newInstance(Bundle bundle) { VideoFragment fragment = new VideoFragment(); @@ -35,28 +47,77 @@ public class VideoFragment extends BaseFragment implements View.OnClickListener protected int getLayout() { return R.layout.fragment_video; } + @Override + public void onResume() { + super.onResume(); + getFocus(); + } + //主界面获取焦点 + private void getFocus() { + Objects.requireNonNull(getView()).setFocusableInTouchMode(true); + getView().requestFocus(); + getView().setOnKeyListener(new View.OnKeyListener() { + @Override + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { + Message message = new Message(); + message.what= Constant.VIDEO_FINISH_ROAD; + EventBus.getDefault().post(message); + Objects.requireNonNull(getActivity()).finish(); + return true; + } + return false; + } + }); + } @Override protected void initView() { super.initView(); PoiEntity showPoiEntity = (PoiEntity) Objects.requireNonNull(getActivity()).getIntent().getSerializableExtra("showPoiEntity"); + deleteFiles = new ArrayList<>(); + ArrayList textFile = new ArrayList<>(); + if (showPoiEntity != null) { String id = showPoiEntity.getId(); - if (showPoiEntity.getRecord_way() == 2) { - fileListByUUID = AWMp4ParserHelper.getInstance().getVideoFileListByUUID(id); + if (showPoiEntity.getRecord_way() == 1) { + fileBeans = new ArrayList<>(); + List fileListByUUID = AWMp4ParserHelper.getInstance().getFileListByUUID(id); + for (int i = 0; i < fileListByUUID.size(); i++) { + if (!fileListByUUID.get(i).getPath().contains(".txt")) { + FileBean fileBean = new FileBean(fileListByUUID.get(i), false); + fileBeans.add(fileBean); + }else { + textFile.add(fileListByUUID.get(i)); + } + } } } - ImageView ivPhotoFinal =(ImageView) findViewById(R.id.iv_video_final); + ImageView ivPhotoFinal = (ImageView) findViewById(R.id.iv_video_final); ivPhotoFinal.setOnClickListener(this); - TextView tvPhotoChoose =(TextView) findViewById(R.id.tv_video_choose); - tvPhotoChoose.setOnClickListener(this); - TextView tvPhotoAlbumDelete =(TextView) findViewById(R.id.tv_video_album_delete); + TextView tvPhotoAlbumDelete = (TextView) findViewById(R.id.tv_video_album_delete); tvPhotoAlbumDelete.setOnClickListener(this); RecyclerView videoRecycler = findViewById(R.id.video_album_recycler); videoRecycler.setLayoutManager(new GridLayoutManager(getContext(), 2)); - VideoAdapter videoAdapter = new VideoAdapter(fileListByUUID, getContext()); + videoAdapter = new VideoAdapter(fileBeans, getContext()); + videoAdapter.setTextFile(textFile); videoRecycler.setAdapter(videoAdapter); - + videoAdapter.setPhotoClickItem(new VideoAdapter.photoClickItem() { + @Override + public void item(boolean isBoolean, FileBean fileBean) { + if (isBoolean) { + deleteFiles.add(fileBean); + } else { + if (deleteFiles != null) { + for (int i = 0; i < deleteFiles.size(); i++) { + if (fileBean.getFile().getPath().equals(deleteFiles.get(i).getFile().getPath())) { + deleteFiles.remove(fileBean); + } + } + } + } + } + }); } @Override @@ -68,8 +129,21 @@ public class VideoFragment extends BaseFragment implements View.OnClickListener public void onClick(View v) { switch (v.getId()) { case R.id.iv_video_final: + Message message = new Message(); + message.what= Constant.VIDEO_FINISH_ROAD; + EventBus.getDefault().post(message); Objects.requireNonNull(getActivity()).finish(); break; + case R.id.tv_video_album_delete: + if (fileBeans != null) { + for (int i = 0; i < fileBeans.size(); i++) { + videoAdapter.deleteFile(fileBeans.get(i)); + } + } else { + Toast.makeText(getContext(), "请选择要删除的数据后才可以删除", Toast.LENGTH_SHORT).show(); + } + break; + } } 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 9a73da6..3f5624d 100644 --- a/app/src/main/java/com/navinfo/outdoor/util/AWMp4ParserHelper.java +++ b/app/src/main/java/com/navinfo/outdoor/util/AWMp4ParserHelper.java @@ -295,39 +295,22 @@ public class AWMp4ParserHelper { /** * 根据提供的uuid,获取指定目录下所有的视频文件 * */ - public List getVideoFileListByUUID(String uuid) { - List videoFileList = new ArrayList<>(); + public List getFileListByUUID(String uuid) { + List fileList = new ArrayList<>(); if (StringUtils.isEmpty(uuid)) { - return videoFileList; + return fileList; } File folderFile = new File(Constant.PICTURE_FOLDER+"/"+uuid+"/"); if (!folderFile.exists()) { folderFile.mkdirs(); - return videoFileList; + return fileList; } for (File videoFile: folderFile.listFiles()) { - videoFileList.add(videoFile); + fileList.add(videoFile); } - return videoFileList; - } - /** - * 根据提供的uuid,获取指定目录下所有的视频文件 - * */ - public List getJPGFileListByUUID(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; + return fileList; } + public String getVideoFileListStr(List videoFileList) { StringBuilder resultStrBuilder = new StringBuilder(""); if (videoFileList == null || videoFileList.size()<=0){ @@ -347,37 +330,7 @@ public class AWMp4ParserHelper { /** * 根据视频文件列表,获取到对应的轨迹数据 * */ - public List getLineStringByVideoFileList(List videoFileList) { - List latLngs = new ArrayList<>(); - if (videoFileList == null || videoFileList.isEmpty()) { - return latLngs; - } - - 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; - } - /** - * 根据视频文件列表,获取到对应的轨迹数据 - * */ - public List getLineStringByPictureFileList(List videoFileList) { + public List getLineStringByFileList(List videoFileList) { List latLngs = new ArrayList<>(); if (videoFileList == null || videoFileList.isEmpty()) { return latLngs; diff --git a/app/src/main/java/com/navinfo/outdoor/util/PoiSaveUtils.java b/app/src/main/java/com/navinfo/outdoor/util/PoiSaveUtils.java index 6e57137..a915e71 100644 --- a/app/src/main/java/com/navinfo/outdoor/util/PoiSaveUtils.java +++ b/app/src/main/java/com/navinfo/outdoor/util/PoiSaveUtils.java @@ -75,7 +75,7 @@ public class PoiSaveUtils { } } } - }else {//其他类型 + } else {//其他类型 if (savePoiNet(poiEntity) == 200) { // 网络保存成功 //走上传流程: uploadPoiNet(poiEntity); @@ -257,13 +257,7 @@ public class PoiSaveUtils { } } } - List videoFileList=null; - if (poiEntity.getRecord_way()==1){ - videoFileList = AWMp4ParserHelper.getInstance().getVideoFileListByUUID(poiEntity.getId()); - }else if (poiEntity.getRecord_way()==2){ - videoFileList = AWMp4ParserHelper.getInstance().getJPGFileListByUUID(poiEntity.getId()); - - } + List videoFileList = AWMp4ParserHelper.getInstance().getFileListByUUID(poiEntity.getId()); if (videoFileList != null && !videoFileList.isEmpty()) { List txtFileList = new ArrayList<>(); for (File videoFile : videoFileList) { @@ -273,7 +267,7 @@ public class PoiSaveUtils { videoFileList.addAll(txtFileList); File fileZip = new File(Constant.PICTURE_FOLDER, "files" + ".zip"); ZipUtil.zipFiles(videoFileList, fileZip, null); - if (fileZip!=null){ + if (fileZip != null) { photoFile.add(fileZip); } } @@ -313,11 +307,11 @@ public class PoiSaveUtils { OtherUploadPicBean otherUploadPicBean = gson.fromJson(bodyStr, OtherUploadPicBean.class); if (otherUploadPicBean.getCode() == 200) { PoiDatabase.getInstance(mContext).getPoiDao().deletePoiEntity(poiEntity); - Log.d("TAGss", "uploadPoiNet: 成功"+anInt); + Log.d("TAGss", "uploadPoiNet: 成功" + anInt); anInt++; return; } else { - Log.d("TAGss", "uploadPoiNet: 失败"+bInt); + Log.d("TAGss", "uploadPoiNet: 失败" + bInt); bInt++; return; } @@ -360,7 +354,7 @@ public class PoiSaveUtils { // 依次上传充电桩数据,如果有一条数据未上传成功,则返回false for (ChargingPileEntity pileEntity : chargingPileEntityList) { if (pileEntity.getBodyId() == 0) { - int saveResult = saveChargingPile2NetWork(pileEntity,poiEntity.getBodyId()); + int saveResult = saveChargingPile2NetWork(pileEntity, poiEntity.getBodyId()); if (saveResult == 200) { result = result & true; } else { @@ -398,7 +392,7 @@ public class PoiSaveUtils { .url(HttpInterface.SUBMIT_CSTASK) .token(Constant.ACCESS_TOKEN) .params(httpParams).getSynchronization(); - if (execute==null){ + if (execute == null) { return -1; } if (execute.code() != 200) { @@ -472,15 +466,15 @@ public class PoiSaveUtils { } try { - HttpParams httpParams=new HttpParams(); - httpParams.put("auditId",chargingPileEntity.getBodyId()); + HttpParams httpParams = new HttpParams(); + httpParams.put("auditId", chargingPileEntity.getBodyId()); Response execute = OkGoBuilder.getInstance() .Builder(mContext) .url(HttpInterface.CS_TASK_UP_LOAD_PIC) .token(Constant.ACCESS_TOKEN) .params(httpParams) .fileList(chargingPileFileList).postFileSynchronization(); - if (execute==null){ + if (execute == null) { return -1; } if (execute.code() != 200) { diff --git a/app/src/main/res/drawable/ic_baseline_arrow_back.xml b/app/src/main/res/drawable/ic_baseline_arrow_back.xml index f632160..0104528 100644 --- a/app/src/main/res/drawable/ic_baseline_arrow_back.xml +++ b/app/src/main/res/drawable/ic_baseline_arrow_back.xml @@ -2,8 +2,7 @@ android:width="24dp" android:height="24dp" android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_baseline_play.xml b/app/src/main/res/drawable/ic_baseline_play.xml new file mode 100644 index 0000000..e5401fd --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_play.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_image_show.xml b/app/src/main/res/layout/activity_image_show.xml index 78fe6e7..4b13278 100644 --- a/app/src/main/res/layout/activity_image_show.xml +++ b/app/src/main/res/layout/activity_image_show.xml @@ -1,32 +1,43 @@ - + android:background="#F4EEEE"> + + + + + + + android:layout_width="match_parent" + android:layout_height="0dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/rl_image_show" /> - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_video.xml b/app/src/main/res/layout/activity_video.xml new file mode 100644 index 0000000..52a52c5 --- /dev/null +++ b/app/src/main/res/layout/activity_video.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_photo.xml b/app/src/main/res/layout/fragment_photo.xml index 66403ea..a01e258 100644 --- a/app/src/main/res/layout/fragment_photo.xml +++ b/app/src/main/res/layout/fragment_photo.xml @@ -1,11 +1,11 @@ - - - + - + - + app:layout_constraintTop_toBottomOf="@+id/rl_photo_album" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_road.xml b/app/src/main/res/layout/fragment_road.xml index 22d3871..c63e122 100644 --- a/app/src/main/res/layout/fragment_road.xml +++ b/app/src/main/res/layout/fragment_road.xml @@ -157,6 +157,16 @@ android:text="点击录像" android:textColor="@color/white" android:textSize="15sp" /> + diff --git a/app/src/main/res/layout/fragment_video.xml b/app/src/main/res/layout/fragment_video.xml index 90eddd1..4766296 100644 --- a/app/src/main/res/layout/fragment_video.xml +++ b/app/src/main/res/layout/fragment_video.xml @@ -1,11 +1,11 @@ - - + - - - + + app:layout_constraintTop_toBottomOf="@+id/rl_video_album" /> \ No newline at end of file diff --git a/app/src/main/res/layout/photo_item.xml b/app/src/main/res/layout/photo_item.xml index 9af8adc..c6516a5 100644 --- a/app/src/main/res/layout/photo_item.xml +++ b/app/src/main/res/layout/photo_item.xml @@ -2,27 +2,27 @@ + + + - - - + android:layout_margin="2dp" + android:buttonTint="@color/white" + app:layout_constraintBottom_toBottomOf="@+id/iv_photo" + app:layout_constraintEnd_toEndOf="@+id/iv_photo" /> \ No newline at end of file diff --git a/app/src/main/res/layout/video_item.xml b/app/src/main/res/layout/video_item.xml index 31a5ae2..25276a6 100644 --- a/app/src/main/res/layout/video_item.xml +++ b/app/src/main/res/layout/video_item.xml @@ -4,25 +4,34 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content"> + + + + + - - + android:layout_margin="2dp" + android:buttonTint="@color/white" + app:layout_constraintBottom_toBottomOf="@id/iv_video" + app:layout_constraintEnd_toEndOf="@id/iv_video" /> \ No newline at end of file