123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- package com.cooleshow.musicmerge.ui;
- import android.content.Intent;
- import android.graphics.Bitmap;
- import android.text.TextUtils;
- import android.view.Gravity;
- import android.view.View;
- import com.alibaba.android.arouter.facade.annotation.Route;
- import com.cooleshow.base.constanst.Constants;
- import com.cooleshow.base.router.RouterPath;
- import com.cooleshow.base.ui.activity.BaseMVPActivity;
- import com.cooleshow.base.utils.FileUtils;
- import com.cooleshow.base.utils.LOG;
- import com.cooleshow.base.utils.MyFileUtils;
- import com.cooleshow.base.utils.SizeUtils;
- import com.cooleshow.base.utils.ToastUtil;
- import com.cooleshow.base.utils.UiUtils;
- import com.cooleshow.base.utils.Utils;
- import com.cooleshow.musicmerge.R;
- import com.cooleshow.musicmerge.callback.ResultCallback;
- import com.cooleshow.musicmerge.contract.VideoFileHandleContract;
- import com.cooleshow.musicmerge.databinding.AcSelectVideoFrameLayoutBinding;
- import com.cooleshow.musicmerge.helper.MixHelper;
- import com.cooleshow.musicmerge.presenter.VideoFileHandlePresenter;
- import com.cooleshow.musicmerge.widget.cover.ShortVideoSelectCover;
- import java.io.File;
- import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
- import io.reactivex.rxjava3.annotations.NonNull;
- import io.reactivex.rxjava3.core.Observable;
- import io.reactivex.rxjava3.core.ObservableEmitter;
- import io.reactivex.rxjava3.core.ObservableOnSubscribe;
- import io.reactivex.rxjava3.core.Observer;
- import io.reactivex.rxjava3.disposables.Disposable;
- import io.reactivex.rxjava3.schedulers.Schedulers;
- @Route(path = RouterPath.MusicTuner.MUSIC_SELECT_VIDEO_FRAME)
- public class SelectVideoFrameActivity extends BaseMVPActivity<AcSelectVideoFrameLayoutBinding, VideoFileHandlePresenter> implements VideoFileHandleContract, View.OnClickListener {
- private final static String OUT_PATH = MyFileUtils.getCacheDir(Utils.getApp(), "videoFrame");
- private String mVideoPath;
- @Override
- protected void initView() {
- initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "编辑封面");
- viewBinding.toolbarInclude.toolbar.setBackground(getResources().getDrawable(R.drawable.shape_video_cover_top_bg));
- viewBinding.toolbarInclude.tvRightText.setWidth(SizeUtils.dp2px(64));
- viewBinding.toolbarInclude.tvRightText.setHeight(SizeUtils.dp2px(32));
- viewBinding.toolbarInclude.tvRightText.setVisibility(View.VISIBLE);
- viewBinding.toolbarInclude.tvRightText.setText("保存");
- viewBinding.toolbarInclude.tvRightText.setBackground(getResources().getDrawable(com.cooleshow.base.R.drawable.shape_16dp_white));
- viewBinding.toolbarInclude.tvRightText.setGravity(Gravity.CENTER);
- viewBinding.toolbarInclude.tvRightText.setTextColor(getResources().getColor(R.color.main_style_color));
- viewBinding.toolbarInclude.tvRightText.setOnClickListener(this);
- }
- @Override
- public void initData() {
- super.initData();
- mVideoPath = getIntent().getStringExtra("videoFilePath");
- boolean isLocalFile = getIntent().getBooleanExtra("isLocalFile", true);
- if (TextUtils.isEmpty(mVideoPath)) {
- finish();
- return;
- }
- if (isLocalFile) {
- toPreView();
- } else {
- if (checkParamsIsError()) {
- return;
- }
- boolean b = checkUrlToDownload(mVideoPath);
- if (b) {
- toPreView();
- }
- }
- viewBinding.videoCutterLayout.setOnGetSampleImageListener(new ShortVideoSelectCover.OnGetSampleImageListener() {
- @Override
- public void start() {
- }
- @Override
- public void complete(Bitmap img) {
- if (img != null) {
- saveFile(img);
- }
- }
- });
- }
- private boolean checkParamsIsError() {
- boolean isVideo = MyFileUtils.isVideoFromUrl(mVideoPath);
- if (!isVideo) {
- ToastUtil.getInstance().showShort("文件解析失败");
- finish();
- return true;
- }
- return false;
- }
- private boolean checkUrlToDownload(String recordUrl) {
- String fileEndSuffix = MyFileUtils.getWAVOrMp4FileSuffix(recordUrl);
- String filePath = MixHelper.getInstance().getDownloadSavePathForMp4(recordUrl);
- LOG.i("pq", "checkUrlToDownload:" + filePath);
- File file = new File(filePath);
- if (file.exists()) {
- mVideoPath = filePath;
- return true;
- }
- setLoadingCancelable(false);
- showLoading("视频下载中");
- MixHelper.getInstance().download(recordUrl, fileEndSuffix, new ResultCallback<String>() {
- @Override
- public void onSuccess(String s) {
- if(!checkActivityExist()){
- return;
- }
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- hideLoading();
- mVideoPath = s;
- toPreView();
- }
- });
- }
- @Override
- public void onProgress(int progressPercent) {
- if(!checkActivityExist()){
- return;
- }
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- updateLoadingText("视频下载中" + progressPercent + "%");
- }
- });
- }
- @Override
- public void onFail(int errorCode, String errorStr) {
- if(!checkActivityExist()){
- return;
- }
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- ToastUtil.getInstance().showShort("视频下载失败,请重试");
- hideLoading();
- }
- });
- }
- });
- return false;
- }
- private void toPreView() {
- viewBinding.videoCutterLayout.prePlayVideo(mVideoPath);
- }
- private void saveFile(Bitmap img) {
- Observable.create(new ObservableOnSubscribe<String>() {
- @Override
- public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Throwable {
- File file = FileUtils.saveImgToLocalFile(img);
- if (emitter != null) {
- emitter.onNext(file.getAbsolutePath());
- }
- }
- }).subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(new Observer<String>() {
- @Override
- public void onSubscribe(@NonNull Disposable d) {
- }
- @Override
- public void onNext(@NonNull String s) {
- reBackData(s);
- }
- @Override
- public void onError(@NonNull Throwable e) {
- ToastUtil.getInstance().showShort("获取封面失败,请重试");
- }
- @Override
- public void onComplete() {
- hideLoading();
- }
- });
- }
- private void reBackData(String s) {
- Intent intent = new Intent();
- intent.putExtra(Constants.COMMON_EXTRA_KEY, s);
- setResult(RESULT_OK, intent);
- finish();
- }
- @Override
- protected AcSelectVideoFrameLayoutBinding getLayoutView() {
- return AcSelectVideoFrameLayoutBinding.inflate(getLayoutInflater());
- }
- @Override
- protected VideoFileHandlePresenter createPresenter() {
- return new VideoFileHandlePresenter();
- }
- @Override
- public void finish() {
- super.finish();
- }
- @Override
- public void onBackPressed() {
- super.onBackPressed();
- }
- @Override
- public void onDestroy() {
- release();
- super.onDestroy();
- }
- boolean isNeedRelease = true;
- private void release() {
- if (!isNeedRelease) {
- return;
- }
- try {
- if (viewBinding != null) {
- viewBinding.videoCutterLayout.release();
- }
- isNeedRelease = false;
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- @Override
- public void onClick(View v) {
- int id = v.getId();
- if (id == com.cooleshow.base.R.id.tv_right_text) {
- if (UiUtils.isFastClick()) {
- return;
- }
- toGetCover();
- return;
- }
- }
- private void toGetCover() {
- showLoading("获取封面中");
- viewBinding.videoCutterLayout.getCover();
- }
- }
|