From 7040f16f0c725cf72df65b70291f999ace6263ac Mon Sep 17 00:00:00 2001 From: zuoxiao <470321431@qq.com> Date: 星期三, 08 一月 2025 11:00:36 +0800 Subject: [PATCH] 1.修复上传视频超时问题 --- app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java | 270 +++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 208 insertions(+), 62 deletions(-) diff --git a/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java b/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java index cebbdd9..fef6b3d 100644 --- a/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java +++ b/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java @@ -1,48 +1,66 @@ package com.dayu.pipirrapp.activity; +import static com.dayu.pipirrapp.net.Constants.BASE_URL; + import android.content.Context; import android.content.Intent; -import android.net.Uri; import android.os.Bundle; +import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; +import androidx.lifecycle.Observer; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.SimpleItemAnimator; +import com.dayu.pipirrapp.MyApplication; import com.dayu.pipirrapp.adapter.AddPictureAdapter; +import com.dayu.pipirrapp.bean.db.LatLonBean; +import com.dayu.pipirrapp.bean.net.AddProcessingRequest; +import com.dayu.pipirrapp.bean.net.InsectionResult; +import com.dayu.pipirrapp.bean.net.UplodFileState; import com.dayu.pipirrapp.databinding.ActivityOrderDealBinding; +import com.dayu.pipirrapp.fragment.OrderFragment; +import com.dayu.pipirrapp.net.ApiManager; +import com.dayu.pipirrapp.net.BaseResponse; +import com.dayu.pipirrapp.net.subscribers.SubscriberListener; +import com.dayu.pipirrapp.net.upload.UploadFileListener; +import com.dayu.pipirrapp.tool.FileUploadUtils; import com.dayu.pipirrapp.tool.FullyGridLayoutManager; import com.dayu.pipirrapp.tool.GlideEngine; +import com.dayu.pipirrapp.tool.ImageFileCompressEngine; +import com.dayu.pipirrapp.utils.CommonKeyName; +import com.dayu.pipirrapp.utils.MyLog; +import com.dayu.pipirrapp.utils.ServiceUtils; +import com.dayu.pipirrapp.utils.ToastUtil; import com.dayu.pipirrapp.view.TitleBar; +import com.jeremyliao.liveeventbus.LiveEventBus; import com.luck.picture.lib.basic.PictureSelectionModel; import com.luck.picture.lib.basic.PictureSelector; import com.luck.picture.lib.config.PictureMimeType; import com.luck.picture.lib.config.SelectMimeType; import com.luck.picture.lib.decoration.GridSpacingItemDecoration; -import com.luck.picture.lib.engine.CompressFileEngine; import com.luck.picture.lib.engine.ImageEngine; import com.luck.picture.lib.entity.LocalMedia; import com.luck.picture.lib.entity.MediaExtraInfo; import com.luck.picture.lib.interfaces.OnExternalPreviewEventListener; -import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener; -import com.luck.picture.lib.utils.DateUtils; import com.luck.picture.lib.utils.DensityUtil; import com.luck.picture.lib.utils.MediaUtils; import com.luck.picture.lib.utils.PictureFileUtils; +import com.tencent.bugly.crashreport.CrashReport; -import java.io.File; import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; -import top.zibin.luban.CompressionPredicate; -import top.zibin.luban.Luban; -import top.zibin.luban.OnNewCompressListener; -import top.zibin.luban.OnRenameListener; +import retrofit2.Call; /** * OrderDealDetailActivity - @@ -53,7 +71,7 @@ * @since 2024-11-27 */ public class OrderDealActivity extends BaseActivity { - private String TAG = "OrderDealActivity"; + private final String TAG = "OrderDealActivity"; ActivityOrderDealBinding binding; RecyclerView mRecyclerView; AddPictureAdapter mAdapter; @@ -62,14 +80,31 @@ private final List<LocalMedia> mData = new ArrayList<>(); private ActivityResultLauncher<Intent> launcherResult; private ImageEngine imageEngine; + // List<UplodFileState> uplodFileStates = new ArrayList<>(); + Map<String, UplodFileState> uplodFileStates = new HashMap<>(); + String workOrderId; + LatLonBean latLonBean; + + /** + * 瀹氫綅鐩戝惉 + */ + private Observer<Object> locationObserver = new Observer<Object>() { + @Override + public void onChanged(Object o) { + MyLog.d("OrderDealActivity>>>locationObserver>>"); + latLonBean = (LatLonBean) o; + } + }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityOrderDealBinding.inflate(LayoutInflater.from(this)); setContentView(binding.getRoot()); + workOrderId = this.getIntent().getStringExtra("workOrderId"); launcherResult = createActivityResultLauncher(); initView(); + startLocation(); } @@ -85,7 +120,7 @@ } mRecyclerView.addItemDecoration(new GridSpacingItemDecoration(4, DensityUtil.dip2px(this, 8), false)); - mAdapter = new AddPictureAdapter(this, mData); + mAdapter = new AddPictureAdapter(this, mData, uplodFileStates); mAdapter.setSelectMax(maxSelectNum + maxSelectVideoNum); mRecyclerView.setAdapter(mAdapter); imageEngine = GlideEngine.createGlideEngine(); @@ -104,6 +139,39 @@ public void openPicture() { //娣诲姞鍥剧墖 mOpenPicture(); + } + + @Override + public void onDeleteClick(int position) { + deleteItem(position); + } + + @Override + public void onReUpload(UplodFileState uplodFileState) { + uplodFileState.setState(UplodFileState.STATE_UPDING); + uplodeImg(uplodFileState); + } + }); + binding.dealButton.setOnClickListener(v -> { + boolean isAllPost = true; + for (UplodFileState imgData : uplodFileStates.values()) { + if (imgData.getState() == 0) { + isAllPost = false; + } + } + + if (!TextUtils.isEmpty(binding.contentET.getText().toString())) { + if (isAllPost) { + if (uplodFileStates.size() > 0) { + postData(); + } else { + ToastUtil.showToast(OrderDealActivity.this, "璇蜂笂浼犲浘鐗�"); + } + } else { + ToastUtil.showToast(OrderDealActivity.this, "鍥剧墖姝e湪涓婁紶璇风◢鍚庢彁浜�"); + } + } else { + ToastUtil.showToast(OrderDealActivity.this, "璇疯緭鍏ュ弽棣堝唴瀹�"); } }); } @@ -150,6 +218,7 @@ @Override public void onPreviewDelete(int position) { + deleteItem(position); mAdapter.remove(position); mAdapter.notifyItemRemoved(position); } @@ -166,6 +235,13 @@ * @param result */ private void analyticalSelectResults(ArrayList<LocalMedia> result) { + //鑾峰彇褰撳墠uplodFileStates鎵�鏈夌殑鍥剧墖鍦板潃 + Set<String> existingPaths = new HashSet<>(); + for (UplodFileState uplodData : uplodFileStates.values()) { + existingPaths.add(uplodData.getFilePath()); + } + //鑾峰彇鍦≒ictureSelector鐨勭浉鍐屾椂鍙栨秷閫変腑鐨勫浘鐗� + Set<String> resultPaths = new HashSet<>(); for (LocalMedia media : result) { if (media.getWidth() == 0 || media.getHeight() == 0) { if (PictureMimeType.isHasImage(media.getMimeType())) { @@ -194,66 +270,136 @@ Log.i(TAG, "瑁佸壀瀹介珮: " + media.getCropImageWidth() + "x" + media.getCropImageHeight()); Log.i(TAG, "鏂囦欢澶у皬: " + PictureFileUtils.formatAccurateUnitFileSize(media.getSize())); Log.i(TAG, "鏂囦欢鏃堕暱: " + media.getDuration()); - } - runOnUiThread(new Runnable() { - @Override - public void run() { - boolean isMaxSize = result.size() == mAdapter.getSelectMax(); - int oldSize = mAdapter.getData().size(); - mAdapter.notifyItemRangeRemoved(0, isMaxSize ? oldSize + 1 : oldSize); - mAdapter.getData().clear(); - - mAdapter.getData().addAll(result); - mAdapter.notifyItemRangeInserted(0, result.size()); + String compressPath = media.getCompressPath(); + //鍒ゆ柇鏄惁鏈夎繖涓矾寰勶紝娌℃湁鐨勮瘽涓婁紶璇ュ浘鐗� + if (TextUtils.isEmpty(compressPath)) { + compressPath = media.getRealPath(); } + if (!existingPaths.contains(compressPath)) { + UplodFileState uplodFileState = new UplodFileState(); + uplodFileState.setFilePath(compressPath); + if (compressPath.toLowerCase().endsWith(".mp4") || compressPath.toLowerCase().endsWith(".avi") || compressPath.toLowerCase().endsWith(".mkv") || compressPath.toLowerCase().endsWith(".mov")) { + // 杩欐槸瑙嗛鏂囦欢 + uplodFileState.setUploadType(UplodFileState.VIDEO_TYPE); + }else { + uplodFileState.setUploadType(UplodFileState.IMG_TYPE); + } + uplodFileStates.put(compressPath, uplodFileState); + // 鎵ц涓婁紶鍥剧墖鐨勬搷浣� + uplodeImg(uplodFileState); + } + + resultPaths.add(media.getCompressPath()); + } + //澶勭悊浠庣浉鍐岃繑鍥炴椂鍙栨秷鐨勫浘鐗囧鐞� + existingPaths.removeAll(resultPaths); + if (!existingPaths.isEmpty()) { + List<UplodFileState> toRemove = new ArrayList<>(); + for (String path : existingPaths) { + for (UplodFileState uplodFileState : uplodFileStates.values()) { + if (path.equals(uplodFileState.getFilePath())) { + uplodFileState.getThisCall().cancel(); + toRemove.add(uplodFileState); + } + } + } + for (UplodFileState removeFile : toRemove) { + uplodFileStates.remove(removeFile.getFilePath()); + } + } + runOnUiThread(() -> { + boolean isMaxSize = result.size() == mAdapter.getSelectMax(); + int oldSize = mAdapter.getData().size(); + mAdapter.notifyItemRangeRemoved(0, isMaxSize ? oldSize + 1 : oldSize); + mAdapter.getData().clear(); + + mAdapter.getData().addAll(result); + mAdapter.notifyItemRangeInserted(0, result.size()); + }); } + //涓婁紶鍥剧墖 + private void uplodeImg(UplodFileState uplodFileState) { + FileUploadUtils.uploadFile(this, uplodFileState, uplodFileStates, mAdapter); + } + /** - * 鑷畾涔夊浘鐗囧帇缂� + * 涓婃姤澶勭悊缁撴灉 */ - private static class ImageFileCompressEngine implements CompressFileEngine { - - @Override - public void onStartCompress(Context context, ArrayList<Uri> source, OnKeyValueResultCallbackListener call) { - Luban.with(context).load(source).ignoreBy(100).setRenameListener(new OnRenameListener() { - @Override - public String rename(String filePath) { - int indexOf = filePath.lastIndexOf("."); - String postfix = indexOf != -1 ? filePath.substring(indexOf) : ".jpg"; - return DateUtils.getCreateFileName("CMP_") + postfix; - } - }).filter(new CompressionPredicate() { - @Override - public boolean apply(String path) { - if (PictureMimeType.isUrlHasImage(path) && !PictureMimeType.isHasHttp(path)) { - return true; - } - return !PictureMimeType.isUrlHasGif(path); - } - }).setCompressListener(new OnNewCompressListener() { - @Override - public void onStart() { - - } - - @Override - public void onSuccess(String source, File compressFile) { - if (call != null) { - call.onCallback(source, compressFile.getAbsolutePath()); - } - } - - @Override - public void onError(String source, Throwable e) { - if (call != null) { - call.onCallback(source, null); - } - } - }).launch(); + private void postData() { + AddProcessingRequest result = new AddProcessingRequest(); + result.setImages(uplodFileStates); + result.setContent(binding.contentET.getText().toString()); + result.setInspectorId(MyApplication.myApplication.userId); + result.setWorkOrderId(workOrderId); + result.setCompleteTime(com.dayu.pipirrapp.utils.DateUtils.getNowDateToMMStr()); + if (latLonBean != null) { + result.setLat(String.valueOf(latLonBean.getLatitude())); + result.setLng(String.valueOf(latLonBean.getLongitude())); } + ApiManager.getInstance().requestPostHideLoading(this, BASE_URL + "/app/workOrder/addProcessingResult", InsectionResult.class, result.toMap(result), new SubscriberListener<BaseResponse<List<InsectionResult>>>() { + @Override + public void onNext(BaseResponse<List<InsectionResult>> t) { + try { + if (t.isSuccess()) { + ToastUtil.showToastLong(OrderDealActivity.this, "涓婃姤鎴愬姛"); + setResult(OrderFragment.RESULT_REFRESH); + OrderDealActivity.this.finish(); + } else { + + } + } catch (Exception e) { + e.printStackTrace(); + CrashReport.postCatchedException(e); + } + + } + }); + } + + /** + * 寮�濮嬪畾浣嶇浉鍏抽�昏緫 + */ + private void startLocation() { + ServiceUtils.startLocationService(this, true); + //鑾峰彇瀹氫綅鏈嶅姟浼犺繃鏉ョ殑鍧愭爣鐐� + LiveEventBus.get(CommonKeyName.locationData).observeForever(locationObserver); } + @Override + protected void onDestroy() { + super.onDestroy(); + LiveEventBus.get(CommonKeyName.locationData).removeObserver(locationObserver); + FileUploadUtils.cancelAllCall(uplodFileStates); + } + + /** + * 棰勮鍜屽浘鐗囧垪琛ㄥ垹闄ゅ浘鐗囨椂澶勭悊鍒犻櫎浜嬩欢 + */ + private void deleteItem(int position) { + LocalMedia localMedia = mAdapter.getData().get(position); + String path; + UplodFileState uplodFileState; + if (TextUtils.isEmpty(localMedia.getCompressPath())) { + uplodFileState = uplodFileStates.get(localMedia.getRealPath()); + } else { + uplodFileState = uplodFileStates.get(localMedia.getCompressPath()); + } + if (uplodFileState != null) { + path = uplodFileState.getFilePath(); + try { + Call<BaseResponse> mCall = uplodFileStates.get(path).getThisCall(); + if (mCall != null) { + mCall.cancel(); + MyLog.d("progressRequestBody>>>" + "cancel銆嬨�嬨�媝ath:" + path); + } + } catch (Exception e) { + e.printStackTrace(); + } + uplodFileStates.remove(path); + } + } } -- Gitblit v1.8.0