From 3ac1a2854f23f61c61e537ea6a7add0c9a70438e Mon Sep 17 00:00:00 2001 From: zuoxiao <470321431@qq.com> Date: 星期一, 02 十二月 2024 15:28:15 +0800 Subject: [PATCH] 1.上传巡检定位点相关功能 2.上传文件相关 --- app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java | 186 +++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 172 insertions(+), 14 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 fb91e02..cebbdd9 100644 --- a/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java +++ b/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java @@ -1,14 +1,15 @@ package com.dayu.pipirrapp.activity; -import android.animation.AnimatorSet; -import android.animation.ObjectAnimator; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; import android.os.Bundle; -import android.provider.MediaStore; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; -import android.view.animation.Animation; -import android.view.animation.AnimationUtils; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.SimpleItemAnimator; @@ -17,20 +18,31 @@ import com.dayu.pipirrapp.databinding.ActivityOrderDealBinding; import com.dayu.pipirrapp.tool.FullyGridLayoutManager; import com.dayu.pipirrapp.tool.GlideEngine; +import com.dayu.pipirrapp.view.TitleBar; import com.luck.picture.lib.basic.PictureSelectionModel; import com.luck.picture.lib.basic.PictureSelector; -import com.luck.picture.lib.config.PictureConfig; +import com.luck.picture.lib.config.PictureMimeType; import com.luck.picture.lib.config.SelectMimeType; -import com.luck.picture.lib.config.SelectModeConfig; 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.interfaces.OnGridItemSelectAnimListener; -import com.luck.picture.lib.interfaces.OnQueryFilterListener; -import com.luck.picture.lib.interfaces.OnSelectAnimListener; +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 java.io.File; import java.util.ArrayList; import java.util.List; + +import top.zibin.luban.CompressionPredicate; +import top.zibin.luban.Luban; +import top.zibin.luban.OnNewCompressListener; +import top.zibin.luban.OnRenameListener; /** * OrderDealDetailActivity - @@ -41,24 +53,28 @@ * @since 2024-11-27 */ public class OrderDealActivity extends BaseActivity { - + private String TAG = "OrderDealActivity"; ActivityOrderDealBinding binding; RecyclerView mRecyclerView; AddPictureAdapter mAdapter; int maxSelectNum = 10;//鏈�澶х収鐗� int maxSelectVideoNum = 0;//鏈�澶ц棰� private final List<LocalMedia> mData = new ArrayList<>(); + private ActivityResultLauncher<Intent> launcherResult; + private ImageEngine imageEngine; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityOrderDealBinding.inflate(LayoutInflater.from(this)); setContentView(binding.getRoot()); + launcherResult = createActivityResultLauncher(); initView(); } void initView() { + new TitleBar(this).setTitleText("澶勭悊宸ュ崟").setLeftIco().setLeftIcoListening(v -> OrderDealActivity.this.finish()); mRecyclerView = binding.recycler; FullyGridLayoutManager manager = new FullyGridLayoutManager(this, 4, GridLayoutManager.VERTICAL, false); @@ -72,29 +88,171 @@ mAdapter = new AddPictureAdapter(this, mData); mAdapter.setSelectMax(maxSelectNum + maxSelectVideoNum); mRecyclerView.setAdapter(mAdapter); + imageEngine = GlideEngine.createGlideEngine(); mAdapter.setOnItemClickListener(new AddPictureAdapter.OnItemClickListener() { @Override public void onItemClick(View v, int position) { - + // 棰勮鍥剧墖銆佽棰戙�侀煶棰� + PictureSelector.create(OrderDealActivity.this) + .openPreview() + .setImageEngine(imageEngine) + .setExternalPreviewEventListener(new MyExternalPreviewEventListener()) + .startActivityPreview(position, true, mAdapter.getData()); } @Override public void openPicture() { + //娣诲姞鍥剧墖 mOpenPicture(); } }); } + /** + * 娣诲姞鍥剧墖 + */ private void mOpenPicture() { // 杩涘叆鐩稿唽 PictureSelectionModel selectionModel = PictureSelector.create(this) .openGallery(SelectMimeType.ofImage()) .setMaxSelectNum(maxSelectNum) .setMaxVideoSelectNum(maxSelectVideoNum) - .setImageEngine(GlideEngine.createGlideEngine()) + .setImageEngine(imageEngine) + //璁剧疆鍥剧墖鍘嬬缉 + .setCompressEngine(new ImageFileCompressEngine()) .setSelectedData(mAdapter.getData()); - selectionModel.forResult(PictureConfig.CHOOSE_REQUEST); + selectionModel.forResult(launcherResult); + } + + /** + * 鍒涘缓涓�涓狝ctivityResultLauncher + * + * @return + */ + private ActivityResultLauncher<Intent> createActivityResultLauncher() { + return registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), + result -> { + int resultCode = result.getResultCode(); + if (resultCode == RESULT_OK) { + ArrayList<LocalMedia> selectList = PictureSelector.obtainSelectorList(result.getData()); + analyticalSelectResults(selectList); + } else if (resultCode == RESULT_CANCELED) { + Log.i(TAG, "onActivityResult PictureSelector Cancel"); + } + }); + } + + /** + * 澶栭儴棰勮鐩戝惉浜嬩欢 + */ + private class MyExternalPreviewEventListener implements OnExternalPreviewEventListener { + + @Override + public void onPreviewDelete(int position) { + mAdapter.remove(position); + mAdapter.notifyItemRemoved(position); + } + + @Override + public boolean onLongPressDownload(Context context, LocalMedia media) { + return false; + } + } + + /** + * 澶勭悊閫夋嫨缁撴灉 + * + * @param result + */ + private void analyticalSelectResults(ArrayList<LocalMedia> result) { + for (LocalMedia media : result) { + if (media.getWidth() == 0 || media.getHeight() == 0) { + if (PictureMimeType.isHasImage(media.getMimeType())) { + MediaExtraInfo imageExtraInfo = MediaUtils.getImageSize(this, media.getPath()); + media.setWidth(imageExtraInfo.getWidth()); + media.setHeight(imageExtraInfo.getHeight()); + } else if (PictureMimeType.isHasVideo(media.getMimeType())) { + MediaExtraInfo videoExtraInfo = MediaUtils.getVideoSize(this, media.getPath()); + media.setWidth(videoExtraInfo.getWidth()); + media.setHeight(videoExtraInfo.getHeight()); + } + } + Log.i(TAG, "鏂囦欢鍚�: " + media.getFileName()); + Log.i(TAG, "鏄惁鍘嬬缉:" + media.isCompressed()); + Log.i(TAG, "鍘嬬缉:" + media.getCompressPath()); + Log.i(TAG, "鍒濆璺緞:" + media.getPath()); + Log.i(TAG, "缁濆璺緞:" + media.getRealPath()); + Log.i(TAG, "鏄惁瑁佸壀:" + media.isCut()); + Log.i(TAG, "瑁佸壀璺緞:" + media.getCutPath()); + Log.i(TAG, "鏄惁寮�鍚師鍥�:" + media.isOriginal()); + Log.i(TAG, "鍘熷浘璺緞:" + media.getOriginalPath()); + Log.i(TAG, "娌欑洅璺緞:" + media.getSandboxPath()); + Log.i(TAG, "姘村嵃璺緞:" + media.getWatermarkPath()); + Log.i(TAG, "瑙嗛缂╃暐鍥�:" + media.getVideoThumbnailPath()); + Log.i(TAG, "鍘熷瀹介珮: " + media.getWidth() + "x" + media.getHeight()); + 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()); + } + }); + } + + + /** + * 鑷畾涔夊浘鐗囧帇缂� + */ + 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(); + } } -- Gitblit v1.8.0