package com.dayu.pipirrapp.activity; import static com.dayu.pipirrapp.net.Constants.BASE_URL; import android.content.Context; import android.content.Intent; 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.annotation.Nullable; 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.AddIssueRequest; import com.dayu.pipirrapp.bean.net.InsectionResult; import com.dayu.pipirrapp.bean.net.UplodFileState; import com.dayu.pipirrapp.databinding.ActivityAddIssueBinding; 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.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.utils.DensityUtil; import com.luck.picture.lib.utils.MediaUtils; import com.luck.picture.lib.utils.PictureFileUtils; import com.tencent.bugly.crashreport.CrashReport; 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 retrofit2.Call; /** * AddQuestionActivity -问题上报 * * @author zuoxiao * @version 1.0 * @since 2024-12-09 */ public class AddIssueActivity extends BaseActivity { private final String TAG = "AddQuestionActivity"; ActivityAddIssueBinding binding; RecyclerView mRecyclerView; AddPictureAdapter mAdapter; int maxSelectNum = 10;//最大照片 int maxSelectVideoNum = 3;//最大视频 int videoMaxSecond = 60; private final List mData = new ArrayList<>(); private ActivityResultLauncher launcherResult; private ImageEngine imageEngine; Map uplodFileStates = new HashMap<>(); // List uplodFileStates = new ArrayList<>(); LatLonBean latLonBean; /** * 定位监听 */ private final Observer locationObserver = new Observer() { @Override public void onChanged(Object o) { latLonBean = (LatLonBean) o; } }; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityAddIssueBinding.inflate(LayoutInflater.from(this)); setContentView(binding.getRoot()); launcherResult = createActivityResultLauncher(); initView(); startLocation(); } void initView() { new TitleBar(this).setTitleText("上报问题").setLeftIco().setLeftIcoListening(v -> AddIssueActivity.this.finish()); mRecyclerView = binding.recycler; FullyGridLayoutManager manager = new FullyGridLayoutManager(this, 4, GridLayoutManager.VERTICAL, false); mRecyclerView.setLayoutManager(manager); RecyclerView.ItemAnimator itemAnimator = mRecyclerView.getItemAnimator(); if (itemAnimator != null) { ((SimpleItemAnimator) itemAnimator).setSupportsChangeAnimations(false); } mRecyclerView.addItemDecoration(new GridSpacingItemDecoration(4, DensityUtil.dip2px(this, 8), false)); mAdapter = new AddPictureAdapter(this, mData, uplodFileStates); 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(AddIssueActivity.this) .openPreview() .setImageEngine(imageEngine) .setExternalPreviewEventListener(new AddIssueActivity.MyExternalPreviewEventListener()) .startActivityPreview(position, true, mAdapter.getData()); } @Override public void openPicture() { //添加图片 mOpenPicture(); } @Override public void onDeleteClick(int position) { deleteItem(position); } @Override public void onReUpload(UplodFileState uplodFileState) { FileUploadUtils.uploadFile(AddIssueActivity.this, uplodFileState, uplodFileStates, mAdapter); } }); 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.isEmpty()) { postData(); } else { ToastUtil.showToast(AddIssueActivity.this, "请上传图片"); } } else { ToastUtil.showToast(AddIssueActivity.this, "图片正在上传请稍后提交"); } } else { ToastUtil.showToast(AddIssueActivity.this, "请输入反馈内容"); } }); } /** * 添加图片 */ private void mOpenPicture() { // 进入相册 PictureSelectionModel selectionModel = PictureSelector.create(this) .openGallery(SelectMimeType.ofAll()) .setMaxSelectNum(maxSelectNum) .setMaxVideoSelectNum(maxSelectVideoNum) .setImageEngine(imageEngine) //设置图片压缩 .setCompressEngine(new ImageFileCompressEngine()) //设置视频图片一起在相册选择 .isWithSelectVideoImage(true) //设置最大视频时长 .setRecordVideoMaxSecond(videoMaxSecond) // 过滤视频最大时长 .setFilterVideoMaxSecond(videoMaxSecond) // 拍照是否纠正旋转图片 .isCameraRotateImage(true) .setSelectedData(mAdapter.getData()); selectionModel.forResult(launcherResult); } /** * 创建一个ActivityResultLauncher * * @return */ private ActivityResultLauncher createActivityResultLauncher() { return registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { int resultCode = result.getResultCode(); if (resultCode == RESULT_OK) { ArrayList 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) { deleteItem(position); mAdapter.remove(position); mAdapter.notifyItemRemoved(position); } @Override public boolean onLongPressDownload(Context context, LocalMedia media) { return false; } } /** * 处理选择结果 * * @param result */ private void analyticalSelectResults(ArrayList 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()); Log.i(TAG, "扩展名: " + media.getMimeType()); FileUploadUtils.creatAndUploadFile(this, media, uplodFileStates, mAdapter); } // 获取 result 中没有而 uplodFileStates 中有的地址 FileUploadUtils.cancelRemovedUploads(result, uplodFileStates); // 更新UI FileUploadUtils.updateUI(result, mAdapter); } /** * 上报处理结果 */ private void postData() { AddIssueRequest result = new AddIssueRequest(); result.setImages(uplodFileStates); result.setContent(binding.contentET.getText().toString()); result.setInspectorId(MyApplication.myApplication.userId); 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/issue/addIssueReport", InsectionResult.class, result.toMap(result), new SubscriberListener>>() { @Override public void onNext(BaseResponse> t) { try { if (t.isSuccess()) { ToastUtil.showToastLong(AddIssueActivity.this, "上报成功"); setResult(OrderFragment.RESULT_REFRESH); AddIssueActivity.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 mCall = uplodFileStates.get(path).getThisCall(); if (mCall != null) { mCall.cancel(); MyLog.d("progressRequestBody>>>" + "cancel》》》path:" + path); } } catch (Exception e) { e.printStackTrace(); } uplodFileStates.remove(path); } } }