diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b7f158e..0c3e54b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -82,7 +82,6 @@
tools:replace="android:allowBackup"
tools:targetApi="s">
-
@@ -458,6 +457,9 @@
+
diff --git a/app/src/main/java/com/rehome/zhdcoa/Contans.java b/app/src/main/java/com/rehome/zhdcoa/Contans.java
index 0078669..5a2bd6d 100644
--- a/app/src/main/java/com/rehome/zhdcoa/Contans.java
+++ b/app/src/main/java/com/rehome/zhdcoa/Contans.java
@@ -540,6 +540,10 @@ public class Contans {
//http://10.19.0.17:1700/dserver/device/vibration/monitoring/list?deviceCode=002c005e&startTime=2026-01-21+14:37:00&endTime=2026-01-22+23:59:59&v=1769063841074
public final static String DeviceAlermInfoDataListUrl = "dserver/device/vibration/monitoring/list";
public final static String DeviceOnlineStatusUrl = "dserver/device/online/data";
+
+ public final static String getDevicePhotoListUrl = "dserver/device/img";
+
+
//设备在线列表
public final static String DeviceOnlineStatusListUrl = "dserver/device/list";
//人员组织结构模块 用户验证接口token
diff --git a/app/src/main/java/com/rehome/zhdcoa/bean/DeviceOnlineStatusImgBean.java b/app/src/main/java/com/rehome/zhdcoa/bean/DeviceOnlineStatusImgBean.java
new file mode 100644
index 0000000..f76f523
--- /dev/null
+++ b/app/src/main/java/com/rehome/zhdcoa/bean/DeviceOnlineStatusImgBean.java
@@ -0,0 +1,129 @@
+package com.rehome.zhdcoa.bean;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 测振测温设备图片中间表
+ *
+ * @author HuangWenfei
+ */
+public class DeviceOnlineStatusImgBean extends DeviceAlarmBaseBean{
+
+ private List data;
+
+ public List getData() {
+ return data;
+ }
+
+ public void setData(List data) {
+ this.data = data;
+ }
+
+ public static class DeviceOnlineStatusImg {
+ /**
+ * 设备名称
+ */
+ private String deviceName;
+
+ /**
+ * id
+ */
+ private Integer id;
+
+ /**
+ * 设备id
+ */
+ private String deviceId;
+
+ /**
+ * 设备图片
+ */
+ private String imgUrl;
+
+ /**
+ * 图片名称
+ */
+ private String fileName;
+
+ /**
+ * 创建时间
+ */
+ private Date createTime;
+
+
+ /**
+ * 删除时间
+ */
+ private Date deleteTime;
+
+ /**
+ * 逻辑删除
+ */
+ private Integer isDeleted;
+
+ public String getDeviceName() {
+ return deviceName;
+ }
+
+ public void setDeviceName(String deviceName) {
+ this.deviceName = deviceName;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getDeviceId() {
+ return deviceId;
+ }
+
+ public void setDeviceId(String deviceId) {
+ this.deviceId = deviceId;
+ }
+
+ public String getImgUrl() {
+ return imgUrl;
+ }
+
+ public void setImgUrl(String imgUrl) {
+ this.imgUrl = imgUrl;
+ }
+
+ public String getFileName() {
+ return fileName;
+ }
+
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
+
+ public Date getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(Date createTime) {
+ this.createTime = createTime;
+ }
+
+ public Date getDeleteTime() {
+ return deleteTime;
+ }
+
+ public void setDeleteTime(Date deleteTime) {
+ this.deleteTime = deleteTime;
+ }
+
+ public Integer getIsDeleted() {
+ return isDeleted;
+ }
+
+ public void setIsDeleted(Integer isDeleted) {
+ this.isDeleted = isDeleted;
+ }
+ }
+}
diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceOnlinePhotoManageActivity.java b/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceOnlinePhotoManageActivity.java
new file mode 100644
index 0000000..5fcc4db
--- /dev/null
+++ b/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceOnlinePhotoManageActivity.java
@@ -0,0 +1,1234 @@
+package com.rehome.zhdcoa.ui.activity;
+
+import static android.text.Html.FROM_HTML_MODE_LEGACY;
+import static com.rehome.zhdcoa.utils.GsonUtils.GsonToBean;
+
+import android.Manifest;
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Looper;
+import android.provider.MediaStore;
+import android.text.Html;
+import android.text.Spannable;
+import android.text.SpannableStringBuilder;
+import android.text.TextUtils;
+import android.text.style.AbsoluteSizeSpan;
+import android.text.style.ForegroundColorSpan;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.Spinner;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.activity.result.ActivityResult;
+import androidx.activity.result.ActivityResultCallback;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.constraintlayout.widget.ConstraintLayout;
+import androidx.constraintlayout.widget.ConstraintSet;
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.ContextCompat;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.recyclerview.widget.SimpleItemAnimator;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.request.target.CustomTarget;
+import com.bumptech.glide.request.transition.Transition;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.luck.picture.lib.PictureSelectorPreviewFragment;
+import com.luck.picture.lib.animators.AnimationType;
+import com.luck.picture.lib.basic.IBridgeViewLifecycle;
+import com.luck.picture.lib.basic.PictureSelectionModel;
+import com.luck.picture.lib.basic.PictureSelector;
+import com.luck.picture.lib.config.InjectResourceSource;
+import com.luck.picture.lib.config.PictureMimeType;
+import com.luck.picture.lib.config.PictureSelectionConfig;
+import com.luck.picture.lib.config.SelectLimitType;
+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.CropFileEngine;
+import com.luck.picture.lib.engine.ImageEngine;
+import com.luck.picture.lib.engine.UriToFileTransformEngine;
+import com.luck.picture.lib.engine.VideoPlayerEngine;
+import com.luck.picture.lib.entity.LocalMedia;
+import com.luck.picture.lib.entity.MediaExtraInfo;
+import com.luck.picture.lib.interfaces.OnBitmapWatermarkEventListener;
+import com.luck.picture.lib.interfaces.OnCameraInterceptListener;
+import com.luck.picture.lib.interfaces.OnCustomLoadingListener;
+import com.luck.picture.lib.interfaces.OnExternalPreviewEventListener;
+import com.luck.picture.lib.interfaces.OnInjectActivityPreviewListener;
+import com.luck.picture.lib.interfaces.OnInjectLayoutResourceListener;
+import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener;
+import com.luck.picture.lib.interfaces.OnMediaEditInterceptListener;
+import com.luck.picture.lib.interfaces.OnPermissionDeniedListener;
+import com.luck.picture.lib.interfaces.OnPermissionDescriptionListener;
+import com.luck.picture.lib.interfaces.OnPreviewInterceptListener;
+import com.luck.picture.lib.interfaces.OnQueryFilterListener;
+import com.luck.picture.lib.interfaces.OnRecordAudioInterceptListener;
+import com.luck.picture.lib.interfaces.OnSelectLimitTipsListener;
+import com.luck.picture.lib.interfaces.OnVideoThumbnailEventListener;
+import com.luck.picture.lib.language.LanguageConfig;
+import com.luck.picture.lib.permissions.PermissionChecker;
+import com.luck.picture.lib.permissions.PermissionConfig;
+import com.luck.picture.lib.permissions.PermissionResultCallback;
+import com.luck.picture.lib.style.PictureSelectorStyle;
+import com.luck.picture.lib.style.SelectMainStyle;
+import com.luck.picture.lib.style.TitleBarStyle;
+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.luck.picture.lib.utils.SandboxTransformUtils;
+import com.luck.picture.lib.utils.StyleUtils;
+import com.luck.picture.lib.utils.ToastUtils;
+import com.luck.picture.lib.widget.MediumBoldTextView;
+import com.rehome.zhdcoa.App;
+
+import com.rehome.zhdcoa.Listener.GlideEngine;
+import com.rehome.zhdcoa.Listener.ImageLoaderUtils;
+import com.rehome.zhdcoa.R;
+import com.rehome.zhdcoa.adapter.luck.GridImageAdapter;
+import com.rehome.zhdcoa.Contans;
+import com.rehome.zhdcoa.base.BaseActivity;
+import com.rehome.zhdcoa.bean.AIRiskListBaseBean;
+import com.rehome.zhdcoa.bean.DeviceAlarmInfoLineChartBean;
+import com.rehome.zhdcoa.bean.DeviceOnlineStatusBean;
+import com.rehome.zhdcoa.bean.DeviceOnlineStatusImgBean;
+import com.rehome.zhdcoa.bean.MemberInfoStatisticsV1Bean;
+import com.rehome.zhdcoa.entity.StatusInfo;
+import com.rehome.zhdcoa.utils.AuthenticationLoginAIUtils;
+import com.rehome.zhdcoa.utils.BitmapCompressUtils;
+import com.rehome.zhdcoa.utils.BitmapUtil;
+import com.rehome.zhdcoa.utils.FullyGridLayoutManager;
+import com.rehome.zhdcoa.utils.GsonUtils;
+import com.rehome.zhdcoa.utils.HttpListener;
+import com.rehome.zhdcoa.utils.HttpResponseListener;
+import com.rehome.zhdcoa.utils.NohttpUtils;
+import com.rehome.zhdcoa.utils.OnAuthenticationLoginListener;
+import com.rehome.zhdcoa.utils.RSAAndroid;
+import com.rehome.zhdcoa.utils.SPUtils;
+import com.rehome.zhdcoa.utils.UiUtlis;
+import com.rehome.zhdcoa.weiget.BaCheckDialog;
+import com.rehome.zhdcoa.weiget.CommitDialog;
+import com.rehome.zhdcoa.weiget.WaitDialog;
+import com.yalantis.ucrop.UCrop;
+import com.yalantis.ucrop.UCropImageEngine;
+import com.yolanda.nohttp.NoHttp;
+import com.yolanda.nohttp.RequestMethod;
+import com.yolanda.nohttp.rest.Request;
+import com.yolanda.nohttp.rest.RequestQueue;
+import com.yolanda.nohttp.rest.Response;
+import org.litepal.crud.DataSupport;
+
+import java.io.File;
+import java.math.RoundingMode;
+import java.nio.charset.StandardCharsets;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocketFactory;
+
+import cn.hutool.core.io.IoUtil;
+import top.zibin.luban.CompressionPredicate;
+import top.zibin.luban.Luban;
+import top.zibin.luban.OnNewCompressListener;
+import top.zibin.luban.OnRenameListener;
+
+public class DeviceOnlinePhotoManageActivity extends BaseActivity {
+
+ EditText etMs;
+
+
+ private RecyclerView recycle;
+ private RecyclerView recycleDevicePhotoOnline;
+ private CheckBox cb_crop;
+ private CheckBox cb_compress;
+ private CheckBox cb_editor;
+ private String username;
+ private TextView tv_sbmc;
+
+
+ private static final String[] permission = new String[]{
+ Manifest.permission.CAMERA,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE
+ };
+ private static final int QRCODE_SCAN_CAMERA_REQUEST_CODE = 4;//扫描二維码请求摄像头权限
+
+ private String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "com.rehome.zhdcoa/images";
+
+ private String stFileName;
+ private ArrayList videoList = new ArrayList<>();
+
+
+ private GridImageAdapter mAdapter;
+ private int maxSelectNum = 16;
+ private List mData = new ArrayList<>();
+
+ private int language = LanguageConfig.UNKNOWN_LANGUAGE;
+ private ImageEngine imageEngine;
+ private VideoPlayerEngine videoPlayerEngine;
+ private PictureSelectorStyle selectorStyle;
+ private int chooseModePhoto = SelectMimeType.ofImage();
+ private int chooseModeVideo = SelectMimeType.ofVideo();
+ private int chooseMode = chooseModePhoto;
+ private final static String TAG_EXPLAIN_VIEW = "TAG_EXPLAIN_VIEW";
+ private final static String TAG = "app";
+ private int animationMode = AnimationType.DEFAULT_ANIMATION;
+
+
+ private final static int FILE_CHOOSER_RESULT_CODE = 10000;
+
+ private ActivityResultLauncher launcherResult;
+
+
+ private ArrayList finalList = new ArrayList<>();
+
+ private String deviceId;
+ private String deviceName;
+
+ private List deviceOnlineStatusImgList = new ArrayList<>();
+
+ private void findView() {
+ etMs = findViewById(R.id.et_ms);
+ recycle = findViewById(R.id.recycle);
+ cb_crop = findViewById(R.id.cb_crop);
+ cb_compress = findViewById(R.id.cb_compress);
+ cb_editor = findViewById(R.id.cb_editor);
+ tv_sbmc = findViewById(R.id.tv_sbmc);
+ recycleDevicePhotoOnline = findViewById(R.id.recycleDevicePhotoOnline);
+ }
+
+ @Override
+ public int getLayoutId() {
+ return R.layout.activity_device_online_photo_manage;
+ }
+
+ @Override
+ public void initView() {
+ username = App.getInstance().getUserInfo().getManid();
+ Intent intent = getIntent();
+ deviceId = intent.getStringExtra("deviceId");
+ deviceName = intent.getStringExtra("deviceName");
+ showLog("-----deviceName----");
+ showLog(deviceName);
+ findView();
+ if(!TextUtils.isEmpty(deviceName)){
+ tv_sbmc.setText(deviceName);
+ }
+
+ initToolbar("工作情况汇报", "提交", new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if(TextUtils.isEmpty(etMs.getText().toString().trim())){
+ showToast("汇报内容必填");
+ }else{
+ //提交汇报数据
+ mData.clear();
+ mData.addAll(mAdapter.getData());
+ //authenticationLoginAI();
+ }
+ }
+ });
+
+ //初始化获取照片和视频
+ initTakePhoto();
+ }
+
+ @Override
+ public void initData() {
+ authenticationLoginDeviceAlarmInfoRsa();
+ }
+
+ private void authenticationLoginDeviceAlarmInfoRsa() {
+ try {
+ //AI三维登录接口
+ String userName = Contans.SP.DeviceAlermInfoAccount;
+ String strPublicDecode = RSAAndroid.decryptByPublicKeyForSpiltStr(
+ Contans.SP.DeviceAlermInfoPwd,
+ RSAAndroid.publicRsaKeyLocal
+ );
+ AuthenticationLoginAIUtils.authenticationDeviceAlermInfoRsaShowProgress(this,userName,strPublicDecode,new OnAuthenticationLoginListener(){
+ @Override
+ public void onAuthenticationSuccess(boolean result, String token) {
+ if(token!=null&&token.isEmpty()){
+ //登录失败
+ showToast("设备状态智能监测及分析平台登录失败");
+ }else{
+ //登录成功
+ //获取照片列表
+ //http://10.19.0.17:1700/dserver/device/img/002c00e9?v=1770446858996
+ getDevicePhotoList();
+ }
+ }
+ });
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void getDevicePhotoList() {
+
+ String url = Contans.IP + Contans.getDevicePhotoListUrl+"/"+deviceId;
+ Request request = NoHttp.createStringRequest(url, RequestMethod.GET);
+
+ NohttpUtils.getInstance().add(this,0, request, new HttpListener() {
+
+ @SuppressLint({"SetTextI18n", "DefaultLocale"})
+ @Override
+ public void onSucceed(int what, com.yolanda.nohttp.rest.Response response) {
+
+ String result = response.get();
+ showLog(result);
+
+
+ DeviceOnlineStatusImgBean bean = GsonToBean(result, DeviceOnlineStatusImgBean.class);
+ if(bean!=null && bean.getCode()==20000 && bean.isSuccess() && bean.getData()!=null && !bean.getData().isEmpty()){
+ deviceOnlineStatusImgList.clear();
+ deviceOnlineStatusImgList.addAll(bean.getData());
+
+
+ }
+ }
+
+ @Override
+ public void onFailed(int what, com.yolanda.nohttp.rest.Response response) {
+ showLog("数据加载失败");
+ }
+ });
+ }
+
+ public void uploadDataByReport() {
+ finalList.clear();
+ for (LocalMedia media : mData) {
+ if(media.getCompressPath()!=null){
+ finalList.add(media.getCompressPath());
+ }else{
+ if(media.getSandboxPath()!=null){
+ finalList.add(media.getSandboxPath());
+ }
+ }
+ showLog(new Gson().toJson(media));
+ }
+
+ showLog(finalList.toString().toLowerCase());
+ upLoadReport();
+ }
+
+
+
+
+ //上传单条缺陷工单
+ private void upLoadReport() {
+ String url = Contans.BASE_URL_AI_3D_SERVER + Contans.DAYLY_RISK_LIST_SUBMIT_REPORT;
+ showLog(url);
+ Request request = NoHttp.createStringRequest(url, RequestMethod.POST);
+
+ showLog("-----------");
+// showLog(id);
+ showLog(username);
+
+ request.add("reporterNo", username);
+// request.add("level", level);
+// request.add("type", type);
+// request.add("ticketId", id);
+ request.add("content",etMs.getText().toString().trim());
+
+
+ if (mData!=null&&mData.size()>0) {
+
+ for (LocalMedia localMedia : mData) {
+ showLog(new Gson().toJson(localMedia));
+ if(localMedia.getCompressPath()!=null){
+ request.add("fileList", new File(localMedia.getCompressPath()));
+ }else{
+ if(localMedia.getSandboxPath()!=null){
+ request.add("fileList", new File(localMedia.getSandboxPath()));
+ }
+ }
+ }
+ }
+
+
+ if(Contans.BASE_URL_AI_3D_SERVER.equals(Contans.BASE_URL_AI_3D_SERVER_EXTRANET)){
+ SSLSocketFactory socketFactory = NohttpUtils.getSSLSocketFactory(context);
+ if (socketFactory != null) {
+ request.setSSLSocketFactory(socketFactory);
+ request.setHostnameVerifier(new HostnameVerifier() {
+ @Override
+ public boolean verify(String s, SSLSession sslSession) {
+ return true;
+ }
+ });
+ }
+ }
+
+ NohttpUtils.getInstance().add(this,0, request, new HttpListener() {
+
+ @Override
+ public void onSucceed(int what, Response response) {
+
+ showLog("----------------");
+ String result = response.get();
+ showLog(result);
+
+ AIRiskListBaseBean aiRiskListBaseBean = GsonToBean(result, AIRiskListBaseBean.class);
+ if (aiRiskListBaseBean != null && aiRiskListBaseBean.isSuccess() && aiRiskListBaseBean.getCode()==20000) {
+ //弹框提示
+ BaCheckDialog dialog = new BaCheckDialog(context,"提交汇报成功", new BaCheckDialog.AuditDialogListener() {
+
+ @Override
+ public void confirm(String notice) {
+ finish();
+ }
+ });
+ dialog.show();
+ }
+ }
+
+ @Override
+ public void onFailed(int what, Response response) {
+
+ }
+ },true,true,"请稍候...");
+ }
+
+ private void clearView() {
+ etMs.setText("");
+ mAdapter.getData().clear();
+ mAdapter.notifyDataSetChanged();
+ }
+
+
+ private void initTakePhoto() {
+ launcherResult = createActivityResultLauncher();
+
+ //android 10 以上
+ if (getExternalFilesDir(null) != null) {
+ path = Objects.requireNonNull(getExternalFilesDir(null)).getPath() + "/images";
+ } else {
+ path = getFilesDir().getPath() + "/images";
+ }
+
+ clearImageDiskCache(DeviceOnlinePhotoManageActivity.this);
+
+ FullyGridLayoutManager manager = new FullyGridLayoutManager(this,
+ 4, GridLayoutManager.VERTICAL, false);
+ recycle.setLayoutManager(manager);
+ RecyclerView.ItemAnimator itemAnimator = recycle.getItemAnimator();
+ if (itemAnimator != null) {
+ ((SimpleItemAnimator) itemAnimator).setSupportsChangeAnimations(false);
+ }
+ recycle.addItemDecoration(new GridSpacingItemDecoration(4,
+ DensityUtil.dip2px(this, 8), false));
+ mAdapter = new GridImageAdapter(this, mData);
+ mAdapter.setSelectMax(maxSelectNum);
+ recycle.setAdapter(mAdapter);
+
+
+ imageEngine = GlideEngine.createGlideEngine();
+ selectorStyle = new PictureSelectorStyle();
+ mAdapter.setOnItemClickListener(new GridImageAdapter.OnItemClickListener() {
+ @Override
+ public void onItemClick(View v, int position) {
+ showLog("onItemClick");
+ // 预览图片、视频、音频
+ PictureSelector.create(DeviceOnlinePhotoManageActivity.this)
+ .openPreview()
+ .setImageEngine(imageEngine)
+ .setVideoPlayerEngine(videoPlayerEngine)
+ .setSelectorUIStyle(selectorStyle)
+ .setLanguage(language)
+ .isAutoVideoPlay(false)
+ .isLoopAutoVideoPlay(false)
+ .isPreviewFullScreenMode(true)
+ .isVideoPauseResumePlay(false)
+ .setCustomLoadingListener(getCustomLoadingListener())
+ .isPreviewZoomEffect(chooseMode != SelectMimeType.ofAudio(), recycle)
+ .setAttachViewLifecycle(new IBridgeViewLifecycle() {
+ @Override
+ public void onViewCreated(Fragment fragment, View view, Bundle savedInstanceState) {
+// PictureSelectorPreviewFragment previewFragment = (PictureSelectorPreviewFragment) fragment;
+// MediumBoldTextView tvShare = view.findViewById(R.id.tv_share);
+// tvShare.setVisibility(View.VISIBLE)
+// previewFragment.addAminViews(tvShare);
+// ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) tvShare.getLayoutParams();
+// layoutParams.topMargin = cb_preview_full.isChecked() ? DensityUtil.getStatusBarHeight(getContext()) : 0;
+// tvShare.setOnClickListener(new View.OnClickListener() {
+// @Override
+// public void onClick(View v) {
+// PicturePreviewAdapter previewAdapter = previewFragment.getAdapter();
+// ViewPager2 viewPager2 = previewFragment.getViewPager2();
+// LocalMedia media = previewAdapter.getItem(viewPager2.getCurrentItem());
+// ToastUtils.showToast(fragment.getContext(), "自定义分享事件:" + viewPager2.getCurrentItem());
+// }
+// });
+ }
+
+ @Override
+ public void onDestroy(Fragment fragment) {
+ //取消注册广播,防止内存泄漏
+ //localBroadcastManager.unregisterReceiver( myReceiver );
+// if (cb_preview_full.isChecked()) {
+// // 如果是全屏预览模式且是startFragmentPreview预览,回到自己的界面时需要恢复一下自己的沉浸式状态
+// // 以下提供2种解决方案:
+// // 1.通过ImmersiveManager.immersiveAboveAPI23重新设置一下沉浸式
+// int statusBarColor = ContextCompat.getColor(getContext(), R.color.ps_color_grey);
+// int navigationBarColor = ContextCompat.getColor(getContext(), R.color.ps_color_grey);
+// ImmersiveManager.immersiveAboveAPI23(MainActivityJava.this,
+// true, true,
+// statusBarColor, navigationBarColor, false);
+// // 2.让自己的titleBar的高度加上一个状态栏高度且内容PaddingTop下沉一个状态栏的高度
+// }
+ }
+ })
+ .setInjectLayoutResourceListener(new OnInjectLayoutResourceListener() {
+ @Override
+ public int getLayoutResourceId(Context context, int resourceSource) {
+ return resourceSource == InjectResourceSource.PREVIEW_LAYOUT_RESOURCE
+ ? R.layout.ps_custom_fragment_preview
+ : InjectResourceSource.DEFAULT_LAYOUT_RESOURCE;
+ }
+ })
+ .setExternalPreviewEventListener(new MyExternalPreviewEventListener())
+ .setInjectActivityPreviewFragment(new OnInjectActivityPreviewListener() {
+ @Override
+ public PictureSelectorPreviewFragment onInjectPreviewFragment() {
+ return null;
+ }
+ })
+ .startActivityPreview(position, true, mAdapter.getData());
+ }
+
+ @Override
+ public void openPicture() {
+ showLog("openPicture");
+ // 进入相册
+ PictureSelectionModel selectionModel = PictureSelector.create(DeviceOnlinePhotoManageActivity.this)
+ .openGallery(chooseMode)
+ .setSelectorUIStyle(selectorStyle)
+ .setImageEngine(imageEngine)
+ .setVideoPlayerEngine(videoPlayerEngine)
+ .setCropEngine(getCropFileEngine())
+ .setCompressEngine(getCompressFileEngine())
+ .setSandboxFileEngine(new MeSandboxFileEngine())
+ .setCameraInterceptListener(getCustomCameraEvent())
+ .setRecordAudioInterceptListener(new MeOnRecordAudioInterceptListener())
+ .setSelectLimitTipsListener(new MeOnSelectLimitTipsListener())
+ .setEditMediaInterceptListener(getCustomEditMediaEvent())
+ .setPermissionDescriptionListener(getPermissionDescriptionListener())
+ .setPreviewInterceptListener(getPreviewInterceptListener())
+ .setPermissionDeniedListener(getPermissionDeniedListener())
+ .setAddBitmapWatermarkListener(getAddBitmapWatermarkListener())
+ .setVideoThumbnailListener(getVideoThumbnailEventListener())
+ .isAutoVideoPlay(false)
+ .isLoopAutoVideoPlay(false)
+ .isPageSyncAlbumCount(true)
+ .setRecordVideoMaxSecond(10)
+ .setCustomLoadingListener(getCustomLoadingListener())
+ .setQueryFilterListener(new OnQueryFilterListener() {
+ @Override
+ public boolean onFilter(LocalMedia media) {
+ return false;
+ }
+ })
+ .setSelectionMode(SelectModeConfig.MULTIPLE)
+ .setLanguage(language)
+ .setOutputCameraDir(getSandboxCameraOutputPath())
+ .setQuerySandboxDir(getSandboxCameraOutputPath())
+ .isDisplayTimeAxis(true)
+ .isOnlyObtainSandboxDir(false)
+ .isPageStrategy(true)
+ .isOriginalControl(false)
+ .isDisplayCamera(true)
+ .isOpenClickSound(false)
+ .setSkipCropMimeType(getNotSupportCrop())
+ .isFastSlidingSelect(true)
+ //.setOutputCameraImageFileName("luck.jpeg")
+ //.setOutputCameraVideoFileName("luck.mp4")
+ .isWithSelectVideoImage(true)
+ .isPreviewFullScreenMode(true)
+ .isVideoPauseResumePlay(false)
+ .isPreviewZoomEffect(true)
+ .isPreviewImage(true)
+ .isPreviewVideo(true)
+ .isPreviewAudio(true)
+ .setGridItemSelectAnimListener(null)
+ //.setQueryOnlyMimeType(PictureMimeType.ofGIF())
+ .isMaxSelectEnabledMask(true)
+ .setMaxSelectNum(maxSelectNum)
+ .setMaxVideoSelectNum(maxSelectNum)
+ .setRecyclerAnimationMode(animationMode)
+ .isGif(false)
+ .setSelectedData(mAdapter.getData());
+ forSelectResult(selectionModel);
+ }
+ });
+
+ }
+
+
+
+ /**
+ * 清除图片磁盘缓存
+ */
+ public void clearImageDiskCache(Context context) {
+ try {
+ if (Looper.myLooper() == Looper.getMainLooper()) {
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ Glide.get(context).clearDiskCache();
+ }
+ }).start();
+ } else {
+ Glide.get(context).clearDiskCache();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void forSelectResult(PictureSelectionModel model) {
+ model.forResult(launcherResult);
+ }
+
+
+ /**
+ * 处理选择结果
+ *
+ * @param result
+ */
+ private void analyticalSelectResults(ArrayList result) {
+ showLog("result");
+ showLog(String.valueOf(result.size()));
+ mData = result;
+ for (LocalMedia media : result) {
+ if (media.getWidth() == 0 || media.getHeight() == 0) {
+ if (PictureMimeType.isHasImage(media.getMimeType())) {
+ MediaExtraInfo imageExtraInfo = MediaUtils.getImageSize(context, media.getPath());
+ media.setWidth(imageExtraInfo.getWidth());
+ media.setHeight(imageExtraInfo.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());
+
+ if(media.getCompressPath()!=null){
+
+ ///storage/emulated/0/Android/data/com.rehome.dywoa/cache/luban_disk_cache/CMP_20240627183056629.jpg
+ ///storage/emulated/0/Android/data/com.rehome.dywoa/files/Pictures/IMG_20240628100106501.jpeg
+ Bitmap bitmap =BitmapFactory.decodeFile(media.getSandboxPath());
+ Bitmap bitmap1 =BitmapFactory.decodeFile(media.getCompressPath());
+
+ if(bitmap!=null){
+ showLog("沙盒宽高---------------");
+ showLog("w:"+String.valueOf(bitmap.getWidth()) + " h:" + bitmap.getHeight());
+ }
+
+ if(bitmap1!=null){
+ showLog("压缩宽高---------------");
+ showLog("w:"+String.valueOf(bitmap1.getWidth()) + " h:" + bitmap1.getHeight());
+ showLog("压缩文件大小---------------");
+ File fileCompressPath=new File(media.getCompressPath());
+ showLog("压缩文件大小: " + String.valueOf(fileCompressPath.length()));
+ }
+ }
+// if(media.getCompressPath()==null&&media.getSandboxPath()!=null){
+// int indexOf = media.getSandboxPath().lastIndexOf(".");
+// String postfix = indexOf != -1 ? media.getSandboxPath().substring(indexOf) : ".jpg";
+// String fileName = DateUtils.getCreateFileName("CMP_") + postfix;
+//
+// String dirPic = media.getSandboxPath().substring(0,media.getSandboxPath().lastIndexOf("/"));
+// String outputPath = dirPic + File.separator+fileName;
+// showLog(dirPic);
+// showLog(outputPath);
+// //167903 读取图片路径按比例大小压缩方法 w:614 h:819
+// Bitmap bitmap = BitmapCompressUtils.getimage(media.getSandboxPath());
+// //66759 图片用BITMAP按比例压缩 w:384 h:512
+// //Bitmap bitmap = BitmapCompressUtils.compressScale(BitmapFactory.decodeFile(media.getSandboxPath()));
+// BitmapUtil.saveBitmap(outputPath,bitmap);
+// File fileCompressPath=new File(outputPath);
+// Log.i(TAG, "压缩文件大小: " + String.valueOf(fileCompressPath.length()));
+// }
+
+
+
+ //BitmapCompressUtils
+
+// String extensionName = FileUtils.getFileType(videoFileName);
+// videoCompressFilePath = context.getExternalFilesDir(null).getPath() + "/Movies/" + UUID.randomUUID() + "_compress_video." + extensionName;
+// showLog(videoCompressFilePath);
+// if(chooseMode==chooseModeVideo){
+// VideoCompress.compressVideoLow(videoFilePath, videoCompressFilePath, new VideoCompress.CompressListener() {
+// @Override
+// public void onStart() {
+// progressDialog.show();
+// }
+//
+// @Override
+// public void onSuccess() {
+// progressDialog.dismiss();
+// showLog(videoCompressFilePath);
+// File file = new File(videoCompressFilePath);
+// showLog("压缩后文件大小:"+String.valueOf(file.length()));
+//
+// }
+//
+// @Override
+// public void onFail() {
+// progressDialog.dismiss();
+// }
+//
+// @Override
+// public void onProgress(float percent) {
+// progressDialog.setProgress((int) percent);
+// }
+// });
+// }
+
+
+ }
+
+ 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());
+ }
+ });
+ }
+
+ /**
+ * 自定义loading
+ *
+ * @return
+ */
+ private OnCustomLoadingListener getCustomLoadingListener() {
+ return null;
+ }
+
+ /**
+ * 外部预览监听事件
+ */
+ private class MyExternalPreviewEventListener implements OnExternalPreviewEventListener {
+
+ @Override
+ public void onPreviewDelete(int position) {
+ mAdapter.remove(position);
+ mAdapter.notifyItemRemoved(position);
+ }
+
+ @Override
+ public boolean onLongPressDownload(LocalMedia media) {
+ return false;
+ }
+ }
+
+ /**
+ * 裁剪引擎
+ *
+ * @return
+ */
+ private ImageFileCropEngine getCropFileEngine() {
+ return cb_crop.isChecked() ? new ImageFileCropEngine() : null;
+ }
+
+ /**
+ * 自定义裁剪
+ */
+ private class ImageFileCropEngine implements CropFileEngine {
+
+ @Override
+ public void onStartCrop(Fragment fragment, Uri srcUri, Uri destinationUri, ArrayList dataSource, int requestCode) {
+ UCrop.Options options = buildOptions();
+ UCrop uCrop = UCrop.of(srcUri, destinationUri, dataSource);
+ uCrop.withOptions(options);
+ uCrop.setImageEngine(new UCropImageEngine() {
+ @Override
+ public void loadImage(Context context, String url, ImageView imageView) {
+ if (!ImageLoaderUtils.assertValidRequest(context)) {
+ return;
+ }
+ Glide.with(context).load(url).override(180, 180).into(imageView);
+ }
+
+ @Override
+ public void loadImage(Context context, Uri url, int maxWidth, int maxHeight, OnCallbackListener call) {
+ Glide.with(context).asBitmap().load(url).override(maxWidth, maxHeight).into(new CustomTarget() {
+ @Override
+ public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition super Bitmap> transition) {
+ if (call != null) {
+ call.onCall(resource);
+ }
+ }
+
+ @Override
+ public void onLoadCleared(@Nullable Drawable placeholder) {
+ if (call != null) {
+ call.onCall(null);
+ }
+ }
+ });
+ }
+ });
+ uCrop.start(fragment.requireActivity(), fragment, requestCode);
+ }
+ }
+
+ /**
+ * 配制UCrop,可根据需求自我扩展
+ *
+ * @return
+ */
+ private UCrop.Options buildOptions() {
+ UCrop.Options options = new UCrop.Options();
+ options.setHideBottomControls(false);
+ options.setFreeStyleCropEnabled(false);
+ options.setShowCropFrame(true);
+ options.setShowCropGrid(true);
+ options.setCircleDimmedLayer(false);
+ options.withAspectRatio(0, 0);
+ options.setCropOutputPathDir(getSandboxPath());
+ options.isCropDragSmoothToCenter(false);
+ options.setSkipCropMimeType(getNotSupportCrop());
+ options.isForbidCropGifWebp(false);
+ options.isForbidSkipMultipleCrop(true);
+ options.setMaxScaleMultiplier(100);
+ if (selectorStyle != null && selectorStyle.getSelectMainStyle().getStatusBarColor() != 0) {
+ SelectMainStyle mainStyle = selectorStyle.getSelectMainStyle();
+ boolean isDarkStatusBarBlack = mainStyle.isDarkStatusBarBlack();
+ int statusBarColor = mainStyle.getStatusBarColor();
+ options.isDarkStatusBarBlack(isDarkStatusBarBlack);
+ if (StyleUtils.checkStyleValidity(statusBarColor)) {
+ options.setStatusBarColor(statusBarColor);
+ options.setToolbarColor(statusBarColor);
+ } else {
+ options.setStatusBarColor(ContextCompat.getColor(context, com.luck.picture.lib.R.color.ps_color_grey));
+ options.setToolbarColor(ContextCompat.getColor(context, com.luck.picture.lib.R.color.ps_color_grey));
+ }
+ TitleBarStyle titleBarStyle = selectorStyle.getTitleBarStyle();
+ if (StyleUtils.checkStyleValidity(titleBarStyle.getTitleTextColor())) {
+ options.setToolbarWidgetColor(titleBarStyle.getTitleTextColor());
+ } else {
+ options.setToolbarWidgetColor(ContextCompat.getColor(context, com.luck.picture.lib.R.color.ps_color_white));
+ }
+ } else {
+ options.setStatusBarColor(ContextCompat.getColor(context, com.luck.picture.lib.R.color.ps_color_grey));
+ options.setToolbarColor(ContextCompat.getColor(context, com.luck.picture.lib.R.color.ps_color_grey));
+ options.setToolbarWidgetColor(ContextCompat.getColor(context, com.luck.picture.lib.R.color.ps_color_white));
+ }
+ return options;
+ }
+
+ /**
+ * 创建自定义输出目录
+ *
+ * @return
+ */
+ private String getSandboxPath() {
+ File externalFilesDir = context.getExternalFilesDir("");
+ File customFile = new File(externalFilesDir.getAbsolutePath(), "Sandbox");
+ if (!customFile.exists()) {
+ customFile.mkdirs();
+ }
+ return customFile.getAbsolutePath() + File.separator;
+ }
+
+ private String[] getNotSupportCrop() {
+ //跳过裁剪GIF
+// if (true) {
+// return new String[]{PictureMimeType.ofGIF(), PictureMimeType.ofWEBP()};
+// }
+ return null;
+ }
+
+ /**
+ * 压缩引擎
+ *
+ * @return
+ */
+ private ImageFileCompressEngine getCompressFileEngine() {
+ return cb_compress.isChecked() ? new ImageFileCompressEngine() : null;
+ }
+
+ /**
+ * 自定义压缩
+ */
+ private static class ImageFileCompressEngine implements CompressFileEngine {
+
+ @Override
+ public void onStartCompress(Context context, ArrayList 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 static class MeSandboxFileEngine implements UriToFileTransformEngine {
+
+ @Override
+ public void onUriToFileAsyncTransform(Context context, String srcPath, String mineType, OnKeyValueResultCallbackListener call) {
+ if (call != null) {
+ call.onCallback(srcPath, SandboxTransformUtils.copyPathToSandbox(context, srcPath, mineType));
+ }
+ }
+ }
+
+ /**
+ * 自定义相机事件
+ *
+ * @return
+ */
+ private OnCameraInterceptListener getCustomCameraEvent() {
+ return null;
+ }
+
+ /**
+ * 录音回调事件
+ */
+ private static class MeOnRecordAudioInterceptListener implements OnRecordAudioInterceptListener {
+
+ @Override
+ public void onRecordAudio(Fragment fragment, int requestCode) {
+ String[] recordAudio = {android.Manifest.permission.RECORD_AUDIO};
+ if (PermissionChecker.isCheckSelfPermission(fragment.getContext(), recordAudio)) {
+ startRecordSoundAction(fragment, requestCode);
+ } else {
+ addPermissionDescription(false, (ViewGroup) fragment.requireView(), recordAudio);
+ PermissionChecker.getInstance().requestPermissions(fragment,
+ new String[]{android.Manifest.permission.RECORD_AUDIO}, new PermissionResultCallback() {
+ @Override
+ public void onGranted() {
+ removePermissionDescription((ViewGroup) fragment.requireView());
+ startRecordSoundAction(fragment, requestCode);
+ }
+
+ @Override
+ public void onDenied() {
+ removePermissionDescription((ViewGroup) fragment.requireView());
+ }
+ });
+ }
+ }
+ }
+
+ /**
+ * 启动录音意图
+ *
+ * @param fragment
+ * @param requestCode
+ */
+ private static void startRecordSoundAction(Fragment fragment, int requestCode) {
+ Intent recordAudioIntent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
+ if (recordAudioIntent.resolveActivity(fragment.requireActivity().getPackageManager()) != null) {
+ fragment.startActivityForResult(recordAudioIntent, requestCode);
+ } else {
+ ToastUtils.showToast(fragment.getContext(), "The system is missing a recording component");
+ }
+ }
+
+ /**
+ * 添加权限说明
+ *
+ * @param viewGroup
+ * @param permissionArray
+ */
+ private static void addPermissionDescription(boolean isHasSimpleXCamera, ViewGroup viewGroup, String[] permissionArray) {
+ int dp10 = DensityUtil.dip2px(viewGroup.getContext(), 10);
+ int dp15 = DensityUtil.dip2px(viewGroup.getContext(), 15);
+ MediumBoldTextView view = new MediumBoldTextView(viewGroup.getContext());
+ view.setTag(TAG_EXPLAIN_VIEW);
+ view.setTextSize(14);
+ view.setTextColor(Color.parseColor("#333333"));
+ view.setPadding(dp10, dp15, dp10, dp15);
+
+ String title;
+ String explain;
+
+ if (TextUtils.equals(permissionArray[0], PermissionConfig.CAMERA[0])) {
+ title = "相机权限使用说明";
+ explain = "相机权限使用说明\n用户app用于拍照/录视频";
+ } else if (TextUtils.equals(permissionArray[0], Manifest.permission.RECORD_AUDIO)) {
+ if (isHasSimpleXCamera) {
+ title = "麦克风权限使用说明";
+ explain = "麦克风权限使用说明\n用户app用于录视频时采集声音";
+ } else {
+ title = "录音权限使用说明";
+ explain = "录音权限使用说明\n用户app用于采集声音";
+ }
+ } else {
+ title = "存储权限使用说明";
+ explain = "存储权限使用说明\n用户app写入/下载/保存/读取/修改/删除图片、视频、文件等信息";
+ }
+ int startIndex = 0;
+ int endOf = startIndex + title.length();
+ SpannableStringBuilder builder = new SpannableStringBuilder(explain);
+ builder.setSpan(new AbsoluteSizeSpan(DensityUtil.dip2px(viewGroup.getContext(), 16)), startIndex, endOf, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
+ builder.setSpan(new ForegroundColorSpan(0xFF333333), startIndex, endOf, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
+ view.setText(builder);
+ view.setBackground(ContextCompat.getDrawable(viewGroup.getContext(), R.drawable.ps_demo_permission_desc_bg));
+
+ if (isHasSimpleXCamera) {
+ RelativeLayout.LayoutParams layoutParams =
+ new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
+ layoutParams.topMargin = DensityUtil.getStatusBarHeight(viewGroup.getContext());
+ layoutParams.leftMargin = dp10;
+ layoutParams.rightMargin = dp10;
+ viewGroup.addView(view, layoutParams);
+ } else {
+ ConstraintLayout.LayoutParams layoutParams =
+ new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.WRAP_CONTENT);
+ layoutParams.topToBottom = R.id.title_bar;
+ layoutParams.leftToLeft = ConstraintSet.PARENT_ID;
+ layoutParams.leftMargin = dp10;
+ layoutParams.rightMargin = dp10;
+ viewGroup.addView(view, layoutParams);
+ }
+ }
+
+ /**
+ * 移除权限说明
+ *
+ * @param viewGroup
+ */
+ private static void removePermissionDescription(ViewGroup viewGroup) {
+ View tagExplainView = viewGroup.findViewWithTag(TAG_EXPLAIN_VIEW);
+ viewGroup.removeView(tagExplainView);
+ }
+
+ /**
+ * 拦截自定义提示
+ */
+ private static class MeOnSelectLimitTipsListener implements OnSelectLimitTipsListener {
+
+ @Override
+ public boolean onSelectLimitTips(Context context, @Nullable LocalMedia media, PictureSelectionConfig config, int limitType) {
+ if (limitType == SelectLimitType.SELECT_MIN_SELECT_LIMIT) {
+ ToastUtils.showToast(context, "图片最少不能低于" + config.minSelectNum + "张");
+ return true;
+ } else if (limitType == SelectLimitType.SELECT_MIN_VIDEO_SELECT_LIMIT) {
+ ToastUtils.showToast(context, "视频最少不能低于" + config.minVideoSelectNum + "个");
+ return true;
+ } else if (limitType == SelectLimitType.SELECT_MIN_AUDIO_SELECT_LIMIT) {
+ ToastUtils.showToast(context, "音频最少不能低于" + config.minAudioSelectNum + "个");
+ return true;
+ }
+ return false;
+ }
+ }
+
+ /**
+ * 自定义编辑事件
+ *
+ * @return
+ */
+ private OnMediaEditInterceptListener getCustomEditMediaEvent() {
+ return cb_editor.isChecked() ? new MeOnMediaEditInterceptListener(getSandboxPath(), buildOptions()) : null;
+ }
+
+
+ /**
+ * 自定义编辑
+ */
+ private static class MeOnMediaEditInterceptListener implements OnMediaEditInterceptListener {
+ private final String outputCropPath;
+ private final UCrop.Options options;
+
+ public MeOnMediaEditInterceptListener(String outputCropPath, UCrop.Options options) {
+ this.outputCropPath = outputCropPath;
+ this.options = options;
+ }
+
+ @Override
+ public void onStartMediaEdit(Fragment fragment, LocalMedia currentLocalMedia, int requestCode) {
+ String currentEditPath = currentLocalMedia.getAvailablePath();
+ Uri inputUri = PictureMimeType.isContent(currentEditPath)
+ ? Uri.parse(currentEditPath) : Uri.fromFile(new File(currentEditPath));
+ Uri destinationUri = Uri.fromFile(
+ new File(outputCropPath, DateUtils.getCreateFileName("CROP_") + ".jpeg"));
+ UCrop uCrop = UCrop.of(inputUri, destinationUri);
+ options.setHideBottomControls(false);
+ uCrop.withOptions(options);
+ uCrop.setImageEngine(new UCropImageEngine() {
+ @Override
+ public void loadImage(Context context, String url, ImageView imageView) {
+ if (!ImageLoaderUtils.assertValidRequest(context)) {
+ return;
+ }
+ Glide.with(context).load(url).override(180, 180).into(imageView);
+ }
+
+ @Override
+ public void loadImage(Context context, Uri url, int maxWidth, int maxHeight, OnCallbackListener call) {
+ Glide.with(context).asBitmap().load(url).override(maxWidth, maxHeight).into(new CustomTarget() {
+ @Override
+ public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition super Bitmap> transition) {
+ if (call != null) {
+ call.onCall(resource);
+ }
+ }
+
+ @Override
+ public void onLoadCleared(@Nullable Drawable placeholder) {
+ if (call != null) {
+ call.onCall(null);
+ }
+ }
+ });
+ }
+ });
+ uCrop.startEdit(fragment.requireActivity(), fragment, requestCode);
+ }
+ }
+
+ /**
+ * 权限说明
+ *
+ * @return
+ */
+ private OnPermissionDescriptionListener getPermissionDescriptionListener() {
+ return null;
+ }
+
+ /**
+ * 自定义预览
+ *
+ * @return
+ */
+ private OnPreviewInterceptListener getPreviewInterceptListener() {
+ return null;
+ }
+
+ /**
+ * 权限拒绝后回调
+ *
+ * @return
+ */
+ private OnPermissionDeniedListener getPermissionDeniedListener() {
+ return null;
+ }
+
+ /**
+ * 给图片添加水印
+ */
+ private OnBitmapWatermarkEventListener getAddBitmapWatermarkListener() {
+ return null;
+ }
+
+ /**
+ * 处理视频缩略图
+ */
+ private OnVideoThumbnailEventListener getVideoThumbnailEventListener() {
+ return null;
+ }
+
+ /**
+ * 创建相机自定义输出目录
+ *
+ * @return
+ */
+ private String getSandboxCameraOutputPath() {
+ return "";
+ }
+
+ /**
+ * 创建一个ActivityResultLauncher
+ *
+ * @return
+ */
+ private ActivityResultLauncher createActivityResultLauncher() {
+ return registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
+ new ActivityResultCallback() {
+ @Override
+ public void onActivityResult(ActivityResult result) {
+ int resultCode = result.getResultCode();
+ if (resultCode == RESULT_OK) {
+ ArrayList selectList = PictureSelector.obtainSelectorList(result.getData());
+ analyticalSelectResults(selectList);
+ }
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceOnlineStatusListActivity.kt b/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceOnlineStatusListActivity.kt
index dd8eb3a..b4e3794 100644
--- a/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceOnlineStatusListActivity.kt
+++ b/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceOnlineStatusListActivity.kt
@@ -1,20 +1,15 @@
package com.rehome.zhdcoa.ui.activity
-import android.os.Bundle
+import android.content.Intent
import android.text.TextUtils
import android.view.View
import android.widget.ArrayAdapter
-import androidx.activity.enableEdgeToEdge
-import androidx.appcompat.app.AppCompatActivity
-import androidx.core.view.ViewCompat
-import androidx.core.view.WindowInsetsCompat
+import com.google.gson.GsonBuilder
+import com.google.gson.reflect.TypeToken
import com.rehome.zhdcoa.Contans
-import com.rehome.zhdcoa.Listener.OnItemClickListener
import com.rehome.zhdcoa.R
-import com.rehome.zhdcoa.adapter.DeviceAlarmInfoAdapter
import com.rehome.zhdcoa.adapter.DeviceOnlineStatusListAdapter
import com.rehome.zhdcoa.base.BaseActivityOaToolbarViewBinding
-import com.rehome.zhdcoa.bean.DeviceAlarmListResultBean
import com.rehome.zhdcoa.bean.DeviceOnlineStatusListResultBean
import com.rehome.zhdcoa.databinding.ActivityDeviceOnlineStatusListBinding
import com.rehome.zhdcoa.utils.AuthenticationLoginAIUtils
@@ -23,11 +18,11 @@ import com.rehome.zhdcoa.utils.HttpListener
import com.rehome.zhdcoa.utils.NohttpUtils
import com.rehome.zhdcoa.utils.RSAAndroid
import com.rehome.zhdcoa.weiget.LoadListView
-import com.rehome.zhdcoa.weiget.OAToolbar
import com.yolanda.nohttp.NoHttp
import com.yolanda.nohttp.RequestMethod
import com.yolanda.nohttp.rest.Response
+
class DeviceOnlineStatusListActivity : BaseActivityOaToolbarViewBinding() {
val typeList = mutableListOf("VIBRATION", "OIL", "FUEL", "THERMAL_IMAGER", "VIBRATION_ZB")
@@ -67,11 +62,37 @@ class DeviceOnlineStatusListActivity : BaseActivityOaToolbarViewBinding
run {
val item = dataList[position]
showLog(GsonUtils.GsonString(item))
+ val type = object : TypeToken