Browse Source

异步上传优化

guilin 9 months ago
parent
commit
2cbefde427

+ 10 - 1
app/src/main/java/com/fxy/adapter/GridImageAdapter.java

@@ -62,6 +62,9 @@ public class GridImageAdapter extends RecyclerView.Adapter<GridImageAdapter.View
     private Activity mActivity;
     private int pictureType;
 
+    //是否显示
+    private boolean showProgress = false;
+
     //录音参数 start
     public static final int RECORD_AUDIO = 1024;
     private long downT;
@@ -96,6 +99,10 @@ public class GridImageAdapter extends RecyclerView.Adapter<GridImageAdapter.View
         this.list = list;
     }
 
+    public void setShowProgress(boolean isShow ){
+        showProgress = isShow;
+    }
+
     public class ViewHolder extends RecyclerView.ViewHolder {
 
         ImageView mImg;
@@ -175,7 +182,9 @@ public class GridImageAdapter extends RecyclerView.Adapter<GridImageAdapter.View
                     // 通过源码分析应该是bindViewHolder()暂未绘制完成导致,知道原因的也可联系我~感谢
                     if (index != RecyclerView.NO_POSITION) {
                         list.remove(index);
-                        ossPhotoList.remove(index);//删除oss
+                        if (ossPhotoList.size()>index){
+                            ossPhotoList.remove(index);//删除oss
+                        }
                         notifyItemRemoved(index);
                         notifyItemRangeChanged(index, list.size());
                         Log.i("delete position:", index + "--->remove after:" + list.size());

+ 2 - 2
app/src/main/java/com/fxy/base/RealmMigrations.java

@@ -9,7 +9,7 @@ public class RealmMigrations implements RealmMigration {
     @Override
     public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
         final RealmSchema schema = realm.getSchema();
-        if(oldVersion == 1) {
+        if(oldVersion < 2) {
             if (schema.get("CutRuleRealm")==null){
                 schema.create("CutRuleRealm")
                         .addField("id", int.class)
@@ -22,7 +22,7 @@ public class RealmMigrations implements RealmMigration {
                         .addField("is_delete", String.class)
                         .addField("create_user", int.class)
                         .addField("create_date", String.class);
-                oldVersion++;
+                oldVersion = newVersion;
             }
 
         }

+ 3 - 0
app/src/main/java/com/fxy/base/StorageApplication.java

@@ -127,6 +127,8 @@ public class StorageApplication extends Application {
         RealmConfiguration config = new RealmConfiguration.Builder()
                 .name("storageRealm.realm") //文件名
                 .schemaVersion(Integer.parseInt(BuildConfig.VERSION_REALM)) //版本号
+                .migration(new RealmMigrations()) // 设置迁移类
+                .deleteRealmIfMigrationNeeded() // 如果迁移失败,则删除 Realm 文件
                 .build();
 
         // 进行迁移操作,从0到1
@@ -139,6 +141,7 @@ public class StorageApplication extends Application {
         Realm.setDefaultConfiguration(config);
     }
 
+
     private void initChangeLanguage() {
         MultiLanguageUtil.getInstance().setConfiguration(context);
         registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

+ 816 - 0
app/src/main/java/com/fxy/common/AsyncUpload.java

@@ -0,0 +1,816 @@
+package com.fxy.common;
+
+import android.Manifest;
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.Gravity;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.alibaba.sdk.android.oss.internal.OSSAsyncTask;
+import com.elvishew.xlog.XLog;
+import com.fxy.R;
+import com.fxy.adapter.GridImageAdapter;
+import com.fxy.baselibrary.util.DateUtil;
+import com.fxy.baselibrary.util.JsonUtil;
+import com.fxy.baselibrary.util.RxTimeTool;
+import com.fxy.bean.ActionBean;
+import com.fxy.constant.SPCache;
+import com.fxy.net.MyDialogCallback;
+import com.fxy.net.Urls;
+import com.fxy.realm.AsyncUploadRealm;
+import com.fxy.view.FullyGridLayoutManager;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.luck.picture.lib.PictureSelector;
+import com.luck.picture.lib.config.PictureConfig;
+import com.luck.picture.lib.config.PictureMimeType;
+import com.luck.picture.lib.entity.LocalMedia;
+import com.luck.picture.lib.permissions.Permission;
+import com.luck.picture.lib.permissions.RxPermissions;
+import com.lzy.okgo.OkGo;
+import com.lzy.okgo.model.Response;
+
+import org.json.JSONObject;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import io.reactivex.functions.Consumer;
+import io.realm.Realm;
+import io.realm.RealmResults;
+
+public class AsyncUpload {
+    private final Activity mActivity;
+    private final Context mContext;
+    private int maxSelectNum = 9;
+    private GridImageAdapter adapter;
+    private final RecyclerView mRecyclerView;
+    private PopupWindow pop;
+
+    private boolean onlyCamera = false;
+    private boolean isCompress = false;
+    private int compressQuality = 100;//默认值
+    private int minimumCompressSize = 100;//最小压缩
+
+
+    //资源类型
+    private int pictureType=1;
+
+
+
+    private String uploadType = "";
+    //文件上传类型
+    protected String fileKey = "";
+
+    //通知地址
+    private String notifyUrl = "";
+
+    //唯一标识
+    private String uniqueTag = "";
+
+    //通知地址
+    private HashMap<String, Object> notifyParam  = new HashMap<>();
+
+
+    private HashMap<String, Object> limitOperate  = new HashMap<>();
+
+    protected Realm mRealm;
+    private List<AsyncUploadRealm> awaitUploadList=new ArrayList<>();
+
+
+    //
+    private List<LocalMedia> selectList = new ArrayList<>();
+
+//
+    // 图片上传目录    //等待上传
+////    private List<LocalMedia> awaitUploadList=new ArrayList<>();
+////    //已失败
+////    private List<LocalMedia> failUploadList=new ArrayList<>();
+////    //已上传好的
+////    private List<LocalMedia> selectList = new ArrayList<>();
+////    //已上传
+////    private ArrayList<String> ossPhotoList =new ArrayList<>();
+    private String mPrefix="tally";
+
+    //是否停止上传
+    private String resourceUrl = "";
+
+    private String resourceType = "";
+
+    private String resourcePrefix = "";
+
+    private OssService ossService;
+
+    private CosService cosService;
+
+
+
+    public AsyncUpload(Activity activity, RecyclerView rvShowImg, String prefix,String fileKey, String notifyUrl){
+
+        mActivity = activity;
+        mContext  = activity.getBaseContext();
+        mRecyclerView = rvShowImg;
+        this.fileKey = fileKey;
+        this.mPrefix = prefix;
+        this.notifyUrl = notifyUrl;
+        initAdapter();
+        initData();
+    }
+
+
+
+    private void initData() {
+        SPCache spCache = SPCache.getInstance(mContext);
+        resourceUrl    = spCache.getResourceHost()+"/";
+        resourceType   = spCache.getResourceType();
+        resourcePrefix = spCache.getResourcePrefix();
+        mRealm = Realm.getDefaultInstance();
+        uploadType = mActivity.getClass().getSimpleName();
+        limitOperate = new HashMap<>();
+        uniqueTag =  this.fileKey+UUID.randomUUID().toString();
+    }
+
+    public void setCompress(Boolean isCompress) {
+        this.isCompress = isCompress;
+    }
+    public void setCompress(Boolean isCompress,int compressQuality,int minimumCompressSize) {
+        this.isCompress = isCompress;
+        this.compressQuality = compressQuality;
+        this.minimumCompressSize = minimumCompressSize;
+    }
+
+
+    public void setUploadType(String fileKey) {
+        this.fileKey = fileKey;
+    }
+
+    public void setPictureType(int pictureType){
+        this.pictureType = pictureType;
+    }
+
+    public void setOnlyCamera(boolean onlyCamera){
+        this.onlyCamera = onlyCamera;
+    }
+
+    public void  setMaxSelectNum(int num){
+        this.maxSelectNum = num;
+    }
+
+    public void  setNotifyParam( HashMap<String, Object> map){
+        this.notifyParam = map;
+    }
+
+    //操作限制
+    public void setLimitOperate(HashMap<String, Object> map){
+        this.limitOperate = map;
+    }
+
+    /**
+     * 设置操作类型
+     * @return
+     */
+    public String getUploadType() {
+       return fileKey;
+    }
+
+
+    public int getAwaitNum(){
+        RealmResults<AsyncUploadRealm> realmResults  = mRealm.where(AsyncUploadRealm.class)
+                .equalTo("isDelete",0)
+                .equalTo("pushStatus",0)
+                .equalTo("uploadType",uploadType)
+                .sort("pushStatus").findAll();
+        realmResults.load();
+        return  realmResults.size();
+    }
+
+    public List<LocalMedia> getSelectList (){
+        return  selectList;
+    }
+
+    public void emptyRemake(){
+        selectList.clear();
+        adapter.clearData();
+        uniqueTag =  this.fileKey+UUID.randomUUID().toString();
+    }
+
+
+    //销毁
+    public void removeHandler(){
+        if (uploadHandler!=null){
+            uploadHandler.removeCallbacksAndMessages(null);
+        }
+    }
+
+    /**
+     * 获取选中图片
+     * @param data
+     */
+    public void getSelectImg (Intent data){
+        List<LocalMedia>  fileList = PictureSelector.obtainMultipleResult(data);
+        for (int i = 0; i < fileList.size(); i++) {
+            addUploadFile(fileList.get(i));
+            selectList.add(fileList.get(i));
+        }
+        asyncUpload();
+        adapter.setList(selectList);
+        adapter.notifyDataSetChanged();
+    }
+
+    public String getUniqueTag(){
+        return  this.uniqueTag;
+    }
+
+
+
+    @SuppressLint("HandlerLeak")
+    private Handler uploadHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            try {
+                //XLog.e(msg);
+                int current = (Integer) msg.arg1;
+                switch (msg.what){
+                    case 0:
+                        Toast.makeText(mActivity, "error", Toast.LENGTH_SHORT).show();
+                        break;
+                    case 1://失败
+
+                        if (awaitUploadList.size()>0){
+
+                            AsyncUploadRealm asyncUploadRealm = awaitUploadList.get(current);
+                            awaitUploadList.remove(current);
+                            resultUpload(asyncUploadRealm.getId(),0,"");
+                            String message = (String) msg.obj;
+                            if (!message.isEmpty() && mActivity!=null){
+                                Toast.makeText(mActivity, message, Toast.LENGTH_SHORT).show();
+                            }
+
+                        }
+
+                        break;
+                    case 2://成功
+
+                        //表示数据存在
+                        if (awaitUploadList.size()>0){
+                            AsyncUploadRealm asyncUploadRealm = awaitUploadList.get(current);
+                            awaitUploadList.remove(current);
+                            resultUpload(asyncUploadRealm.getId(),1,(String) msg.obj);
+                        }
+                        break;
+                    case 3:
+                        //设置进度条
+
+                        //progressDialog.show();
+                        return;
+                    case 4:
+                        //获取上传状态
+
+                        return;
+                    default:
+                        break;
+                }
+
+
+
+
+
+                // 通过接口对象传上传状态
+                if (uploadChangeListener!=null){
+                    uploadChangeListener.uploadResult(true,fileKey);
+                }
+
+            } catch (Exception e) {
+                XLog.e(e.getMessage());
+                e.printStackTrace();
+                // 通过接口对象传上传状态
+                if (uploadChangeListener!=null){
+                    uploadChangeListener.uploadResult(false,fileKey);
+                }
+
+            }
+        }
+    };
+
+
+
+    // 持有一个接口对象
+    UploadChangeListener uploadChangeListener;
+    // 状态变化监听
+    public interface UploadChangeListener {
+        // 回调方法 可以多个
+        void uploadResult(boolean State, String actionType);
+        void uploadFileKey(String actionType);
+    }
+    // 提供注册事件监听的方法
+    public void setOnChangeListener(UploadChangeListener uploadChangeListener) {
+        this.uploadChangeListener = uploadChangeListener;
+    }
+
+
+
+    // 调用回调方法
+    //uploadChangeListener.uploadResult(false);
+
+    public void filedUpload(int num){
+
+
+        // 例如 LocalMedia 里面返回三种path
+        // 1.media.getPath(); 为原图path
+        // 2.media.getCutPath();为裁剪后path,需判断media.isCut();是否为true
+        // 3.media.getCompressPath();为压缩后path,需判断media.isCompressed();是否为true
+        // 如果裁剪并压缩了,以取压缩路径为准,因为是先裁剪后压缩的
+        LocalMedia localMedia = awaitUploadList.get(num).getLocalMedia();
+        String urlPath =localMedia.getPath();
+        if (isCompress && localMedia.getCompressPath()!=null){
+            urlPath = localMedia.getCompressPath();
+        }
+
+        if (urlPath.isEmpty()){
+            Message msg = new Message();
+            msg.obj = "文件路径不存在";
+            msg.what = 1;
+            uploadHandler.sendMessage(msg);
+            return;
+        }
+
+        String fileSuffix = "";
+        if (urlPath.lastIndexOf(".")>-1) {
+            // 获取文件后缀名
+            fileSuffix = urlPath.substring(urlPath.lastIndexOf("."));
+        }
+
+        String fileName= UUID.randomUUID().toString() + fileSuffix;
+
+        if (resourceType.equals("tencent")){
+            if (cosService==null){
+                String path_prefix = resourcePrefix+"/android/"+mPrefix+"/"+RxTimeTool.getYestoryDate("yyyyMMd")+"/";
+                cosService  = new CosService(mActivity.getBaseContext(),path_prefix);
+            }
+            //new cosThread(urlPath, fileName , num).start();
+            cosService.cosUpload(urlPath, fileName , num,uploadHandler);
+
+        }else{
+            if (ossService ==null){
+                ossService = new OssService(mActivity,mPrefix);
+            }
+
+
+            ossService.ossUpload(urlPath, fileName , num,uploadHandler);
+            //new ossThread(urlPath, fileName , num).start();
+        }
+        // task.cancel(); // 可以取消任务
+        // task.waitUntilFinished(); // 可以等待直到任务完成
+    }
+
+
+    private void initAdapter() {
+        FullyGridLayoutManager manager = new FullyGridLayoutManager(mActivity, 3, GridLayoutManager.VERTICAL, false);
+        mRecyclerView.setLayoutManager(manager);
+        adapter = new GridImageAdapter(mActivity,mActivity, onAddPicClickListener,pictureType);
+        adapter.setList(selectList);
+        adapter.setSelectMax(maxSelectNum);
+        mRecyclerView.setAdapter(adapter);
+        adapter.setOnItemClickListener(new GridImageAdapter.OnItemClickListener() {
+            @Override
+            public void onItemClick(int position, View v) {
+                if (selectList.size() > 0) {
+                    LocalMedia media = selectList.get(position);
+                    String pictureType = media.getPictureType();
+                    int mediaType = PictureMimeType.pictureToVideo(pictureType);
+                    switch (mediaType) {
+                        case 1:
+                            // 预览图片 可自定长按保存路径
+                            //PictureSelector.create(MainActivity.this).externalPicturePreview(position, "/custom_file", selectList);
+                            PictureSelector.create(mActivity).externalPicturePreview(position, selectList);
+                            break;
+                        case 2:
+                            // 预览视频
+                            PictureSelector.create(mActivity).externalPictureVideo(media.getPath());
+                            break;
+                        case 3:
+                            // 预览音频
+                            PictureSelector.create(mActivity).externalPictureAudio(media.getPath());
+                            break;
+                    }
+                }
+            }
+        });
+
+        //回调语音
+        adapter.setOnAudioListener(new GridImageAdapter.OnAudioListener() {
+            @Override
+            public void onSaveResult(Intent data) {
+                getSelectImg(data);
+            }
+        });
+    }
+
+
+
+    public GridImageAdapter.onAddPicClickListener onAddPicClickListener = new GridImageAdapter.onAddPicClickListener() {
+
+        @SuppressLint("CheckResult")
+        @Override
+        public void onAddPicClick() {
+            //获取写的权限
+            RxPermissions rxPermission = new RxPermissions(mActivity);
+            rxPermission.requestEach(Manifest.permission.WRITE_EXTERNAL_STORAGE)
+                    .subscribe(new Consumer<Permission>() {
+                        @Override
+                        public void accept(Permission permission) {
+                            if (permission.granted) {// 用户已经同意该权限
+                                //第一种方式,弹出选择和拍照的dialog
+
+                                if (limitOperate.containsKey("disabled")){
+                                    String message = "暂时无法拍照";
+
+                                    if(limitOperate.containsKey("error")){
+                                        message = limitOperate.get("error").toString();
+                                    }
+                                    if ( mActivity!=null){
+                                        Toast.makeText(mActivity, message, Toast.LENGTH_SHORT).show();
+                                    }
+                                    return;
+                                }
+
+                                if (pictureType==PictureConfig.TYPE_AUDIO){
+                                    authAudio();
+                                }else {
+                                    if (onlyCamera){
+                                        //第二种方式,直接进入相册,但是 是有拍照得按钮的
+                                        authCamera();
+                                    }else{
+                                        showPop();
+                                    }
+                                }
+
+
+
+                            } else {
+                                Toast.makeText(mContext, "拒绝", Toast.LENGTH_SHORT).show();
+                            }
+                        }
+                    });
+            //监听返回当前某个上传类型
+            if (uploadChangeListener!=null){
+                uploadChangeListener.uploadFileKey(fileKey);
+            }
+        }
+    };
+
+    private void showAlbum() {
+        //参数很多,根据需要添加
+        PictureSelector.create(mActivity)
+                .openGallery(PictureMimeType.ofImage())// 全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
+                .maxSelectNum(maxSelectNum)// 最大图片选择数量
+                .minSelectNum(1)// 最小选择数量
+                .imageSpanCount(4)// 每行显示个数
+                .selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选PictureConfig.MULTIPLE : PictureConfig.SINGLE
+                .previewImage(true)// 是否可预览图片
+                .isCamera(true)// 是否显示拍照按钮
+                .isZoomAnim(true)// 图片列表点击 缩放效果 默认true
+                //.setOutputCameraPath("/CustomPath")// 自定义拍照保存路径
+                .enableCrop(true)// 是否裁剪
+                .compress(true)// 是否压缩
+                //.sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效
+                .glideOverride(160, 160)// glide 加载宽高,越小图片列表越流畅,但会影响列表图片浏览的清晰度
+                .withAspectRatio(1, 1)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
+                //.selectionMedia(selectList)// 是否传入已选图片
+                //.previewEggs(false)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
+                //.cropCompressQuality(90)// 裁剪压缩质量 默认100
+                //.compressMaxKB()//压缩最大值kb compressGrade()为Luban.CUSTOM_GEAR有效
+                //.compressWH() // 压缩宽高比 compressGrade()为Luban.CUSTOM_GEAR有效
+                //.cropWH()// 裁剪宽高比,设置如果大于图片本身宽高则无效
+                .rotateEnabled(false) // 裁剪是否可旋转图片
+                //.scaleEnabled()// 裁剪是否可放大缩小图片
+                //.recordVideoSecond()//录制视频秒数 默认60s
+                .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
+    }
+
+    private void showPop() {
+        View bottomView = View.inflate(mContext, R.layout.layout_bottom_dialog, null);
+        TextView mAlbum = bottomView.findViewById(R.id.tv_album);
+        TextView mCamera = bottomView.findViewById(R.id.tv_camera);
+        TextView mCancel = bottomView.findViewById(R.id.tv_cancel);
+
+        pop = new PopupWindow(bottomView, -1, -2);
+        pop.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+        pop.setOutsideTouchable(true);
+        pop.setFocusable(true);
+        WindowManager.LayoutParams lp = mActivity.getWindow().getAttributes();
+        lp.alpha = 0.5f;
+        mActivity.getWindow().setAttributes(lp);
+        pop.setOnDismissListener(new PopupWindow.OnDismissListener() {
+
+            @Override
+            public void onDismiss() {
+                WindowManager.LayoutParams lp = mActivity.getWindow().getAttributes();
+                lp.alpha = 1f;
+                mActivity.getWindow().setAttributes(lp);
+            }
+        });
+        pop.setAnimationStyle(R.style.main_menu_photo_anim);
+        pop.showAtLocation(mActivity.getWindow().getDecorView(), Gravity.BOTTOM, 0, 0);
+
+        View.OnClickListener clickListener = new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                switch (view.getId()) {
+                    case R.id.tv_album:
+                        //相册
+                        PictureSelector.create(mActivity)
+                                .openGallery(PictureMimeType.ofImage())
+                                .maxSelectNum(maxSelectNum)
+                                .minSelectNum(1)
+                                .imageSpanCount(4)
+                                .selectionMode(PictureConfig.MULTIPLE)
+                                .compress(isCompress) // 压缩
+                                .cropCompressQuality(compressQuality)// 裁剪压缩质量 默认100
+                                .minimumCompressSize(minimumCompressSize) //最新压缩图片
+
+                                .forResult(PictureConfig.CHOOSE_REQUEST);
+                        break;
+                    case R.id.tv_camera:
+                        //拍照
+                        PictureSelector.create(mActivity)
+                                .openCamera(PictureMimeType.ofImage())
+                                //只需要拍照
+                                //.selectionMode(PictureConfig.SINGLE)
+                                //.isCamera(true)
+                                .compress(isCompress) // 压缩
+                                .cropCompressQuality(compressQuality)// 裁剪压缩质量 默认100
+                                .minimumCompressSize(minimumCompressSize) //最新压缩图片
+                                .forResult(PictureConfig.CHOOSE_REQUEST);
+
+                        break;
+                    case R.id.tv_cancel:
+                        //取消
+                        //closePopupWindow();
+
+                        break;
+                }
+                closePopupWindow();
+            }
+        };
+
+        mAlbum.setOnClickListener(clickListener);
+        mCamera.setOnClickListener(clickListener);
+        mCancel.setOnClickListener(clickListener);
+
+
+    }
+
+    /**
+     * 外部直接调取拍照接口
+     */
+    public void authCamera(){
+        //拍照
+        PictureSelector.create(mActivity)
+                .openCamera(PictureMimeType.ofImage())
+                //只需要拍照
+                //.selectionMode(PictureConfig.SINGLE)
+                //.isCamera(true)
+                //.compressMaxKB()//压缩最大值kb compressGrade()为Luban.CUSTOM_GEAR有效
+                .compress(isCompress) // 压缩
+                .cropCompressQuality(compressQuality)// 裁剪压缩质量 默认100
+                .minimumCompressSize(minimumCompressSize) //最新压缩图片
+                .forResult(PictureConfig.CHOOSE_REQUEST);
+
+        //监听返回当前某个上传类型
+        if (uploadChangeListener!=null){
+            uploadChangeListener.uploadFileKey(fileKey);
+        }
+    }
+
+    /**
+     * 自动打开录音
+     */
+    public void authAudio(){
+        // 自带音频
+        PictureSelector.create(mActivity)
+                .openCamera(PictureMimeType.ofAudio())
+                //只需要音频
+                .selectionMode(PictureConfig.TYPE_AUDIO)
+                .compress(isCompress) // 压缩
+                .forResult(PictureConfig.CHOOSE_REQUEST);
+
+
+
+        //监听返回当前某个上传类型
+        if (uploadChangeListener!=null){
+            uploadChangeListener.uploadFileKey(fileKey);
+        }
+    }
+
+
+    /**
+     * 关闭弹窗
+     */
+    public void closePopupWindow() {
+        if (pop != null && pop.isShowing()) {
+            pop.dismiss();
+            pop = null;
+        }
+    }
+
+
+
+
+
+
+    //存储数据问题
+    public void asyncUpload(){
+
+        if (!getIsNetwork()){
+            //无网络时在请求检查是否有网络
+            return;
+        }
+
+        if (awaitUploadList==null || awaitUploadList.size()==0){
+            RealmResults<AsyncUploadRealm> realmResults  = mRealm.where(AsyncUploadRealm.class)
+                    .equalTo("isDelete",0)
+                    .equalTo("pushStatus",0)
+                    .equalTo("notifyKey",fileKey)
+                    .equalTo("uploadType",uploadType)
+                    .sort("pushStatus").findAll();
+            realmResults.load();
+            awaitUploadList.addAll(realmResults);
+
+        }
+
+        if (awaitUploadList.size()>0){
+            filedUpload(0);
+        }
+    }
+
+    private void addUploadFile(LocalMedia localMedia){
+        String realmId = UUID.randomUUID().toString();
+        String scan_date = DateUtil.getCurDateStr(DateUtil.FORMAT_YMDHMS);
+        //同步操作写法一:
+        mRealm.beginTransaction();
+        //会创建对象和user表
+        AsyncUploadRealm takePhotosRealm = mRealm.createObject(AsyncUploadRealm.class,realmId);
+        Gson gson = new Gson();
+        String localMediaStr = gson.toJson(localMedia);
+        takePhotosRealm.setLocalMediaStr(localMediaStr);
+        takePhotosRealm.setOssUrl("");
+        takePhotosRealm.setScanDate(scan_date);
+        takePhotosRealm.setUploadType(uploadType);
+        takePhotosRealm.setNotifyKey(fileKey);
+        takePhotosRealm.setNotifyParam(gson.toJson(notifyParam));
+        takePhotosRealm.setNotifyUrl(notifyUrl);
+        takePhotosRealm.setUniqueTag(uniqueTag);
+        //
+
+        Date date = new Date();
+        takePhotosRealm.setCreateTime(date.getTime());
+        takePhotosRealm.setPushStatus(0);
+        //提交事务,操作就被执行
+        mRealm.commitTransaction();
+    }
+
+    /**
+     * 设置是否完成
+     * @param realmId
+     * @param isFinish
+     */
+    private void setIsFinish(String realmId,Integer isFinish){
+        //更新值
+        mRealm.beginTransaction();
+        AsyncUploadRealm myObject = mRealm.where(AsyncUploadRealm.class).equalTo("id",realmId).findFirst();
+        myObject.setIsFinish(isFinish);
+        mRealm.commitTransaction();
+    }
+
+
+
+    /**
+     * 上传结果
+     * @param tmpRealmId String
+     * @param status Integer
+     * @param photoPath String
+     */
+    private void resultUpload(String tmpRealmId,Integer status,String photoPath){
+        if (tmpRealmId!=null && !tmpRealmId.isEmpty()){
+            int rePush = 0;
+            //遍历删除
+            if (awaitUploadList.size()>0){
+                for (int i=0;i<awaitUploadList.size();i++){
+                    if (awaitUploadList.get(i).getId().equals(tmpRealmId)){
+                        rePush = awaitUploadList.get(i).getRePush();
+                        awaitUploadList.remove(i);
+                        break;
+                    }
+                }
+            }
+
+            int pushStatus = 2;
+            if (status==0){
+                pushStatus = rePush>4 ? 1 : 0;
+            }
+            //更新值
+            mRealm.beginTransaction();
+            AsyncUploadRealm myObject = mRealm.where(AsyncUploadRealm.class).equalTo("id",tmpRealmId).findFirst();
+            myObject.setPushStatus(pushStatus);
+            myObject.setOssUrl(photoPath);
+            if (getIsNetwork() && status==0 ){
+                myObject.setRePush(myObject.getRePush()+1);
+            }
+            mRealm.commitTransaction();
+            if (status == 1){
+                asyncNotify(myObject);
+            }
+        }
+        //上传完,继续执行
+        asyncUpload();
+    }
+
+    //异步通知结果
+    private void  asyncNotify(AsyncUploadRealm myObject){
+        try {
+            JSONObject jsonObject = new JSONObject(myObject.getNotifyParam());
+            jsonObject.put(myObject.getNotifyKey(),myObject.getOssUrl());
+            jsonObject.put("realm_id",myObject.getId());
+            jsonObject.put("unique_tag",myObject.getUniqueTag());
+            final String tmpRealmId1 = myObject.getId();
+            OkGo.<String>post(myObject.getNotifyUrl()).upJson(jsonObject)
+                    .execute(new MyDialogCallback(mContext, true, false) {
+                        @Override
+                        public void onSuccess(Response<String> response) {
+                            super.onSuccess(response);
+                            try {
+                                ActionBean bean = JsonUtil.getObject(response.body(), ActionBean.class);
+                                if(bean.code == 1){
+                                    setIsFinish(tmpRealmId1,1);
+                                }
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                                XLog.e("回传图片地址错误",e.getMessage());
+                                setIsFinish(tmpRealmId1,2);
+                            }
+                        }
+                    });
+        } catch (Exception e) {
+            e.printStackTrace();
+            XLog.e("异步通知"+e.getMessage());
+
+        }
+    }
+
+    /**
+     * 获取当前网络
+     * @return Boolean
+     */
+    private Boolean getIsNetwork(){
+        boolean isNetwork = false;
+
+        try {
+            if (mActivity==null){
+                return  isNetwork;
+            }
+
+            ConnectivityManager connectivityManager = (ConnectivityManager) mActivity.getSystemService(Context.CONNECTIVITY_SERVICE);
+            if (connectivityManager == null) {
+                XLog.d( "无法获取ConnectivityManager实例");
+                return  isNetwork;
+            }
+            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
+            if (networkInfo != null) {
+                XLog.d( "当前网络状态:" + networkInfo.getState());
+                isNetwork = true;
+            } else {
+                XLog.d( "当前无网络连接");
+                isNetwork = false;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return  isNetwork;
+    }
+
+
+}

+ 16 - 0
app/src/main/java/com/fxy/common/OssService.java

@@ -32,6 +32,7 @@ import org.json.JSONObject;
 import java.io.InputStream;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.util.HashMap;
 
 public class OssService {
     private Context mContext;
@@ -181,6 +182,17 @@ public class OssService {
 
             // 下面3个参数依次为bucket名,ObjectKey名,上传文件路径
             final PutObjectRequest put = new PutObjectRequest(getBucketName(), getFilePath()+objectKey, urlPath);
+
+
+//            put.setCallbackParam(new HashMap<String, String>() {
+//                {
+//                    put("callbackUrl", "http://oss-demo.aliyuncs.com:23450");
+//                    put("callbackHost", "yourCallbackHost");
+//                    put("callbackBodyType", "application/json");
+//                    put("callbackBody", "{\"mimeType\":${mimeType},\"size\":${size},\"my_var1\":${x:var1},\"my_var2\":${x:var2}}");
+//                }
+//            });
+
             // 设置进度回调
             put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
                 @Override
@@ -207,6 +219,10 @@ public class OssService {
                     msg.obj = "/"+request.getObjectKey();
                     msg.what = 2;
                     uploadHandler.sendMessage(msg);
+
+
+                    // 只有设置了servercallback,该值才有数据。
+                    String serverCallbackReturnJson = result.getServerCallbackReturnBody();
                 }
 
                 @Override

+ 100 - 47
app/src/main/java/com/fxy/detection/DetectionPutInMainActivity.java

@@ -29,6 +29,7 @@ import com.fxy.baselibrary.qrcode.ActivityScanerCode;
 import com.fxy.baselibrary.util.JsonUtil;
 import com.fxy.bean.ActionBean;
 import com.fxy.bean.ScanBean;
+import com.fxy.common.AsyncUpload;
 import com.fxy.common.PictureSelectorUpload;
 import com.fxy.constant.BaseConfig;
 import com.fxy.constant.EventCode;
@@ -38,6 +39,7 @@ import com.fxy.view.FloatingImageView;
 import com.google.gson.Gson;
 import com.google.zxing.Result;
 import com.luck.picture.lib.config.PictureConfig;
+import com.luck.picture.lib.entity.LocalMedia;
 import com.lzy.okgo.OkGo;
 import com.lzy.okgo.model.Response;
 
@@ -88,10 +90,18 @@ public class DetectionPutInMainActivity extends  BaseActivity implements StoJNI.
     @BindView(R.id.tv_result)
     TextView tvResult;
 
+    @BindView(R.id.ll_await_num)
+    LinearLayout llAwaitNum;
 
+    @BindView(R.id.tv_await_num)
+    TextView tvAwaitNum;
 
-    private PictureSelectorUpload labelPictureSelectorUpload;
-    private PictureSelectorUpload weighPictureSelectorUpload;
+
+    private HashMap<String, Object> postData  = new HashMap<>();
+
+
+    private AsyncUpload labelPictureSelectorUpload;
+    private AsyncUpload weighPictureSelectorUpload;
     private String currentPictureType= "";
     //
     //扫码扫码动作
@@ -143,13 +153,12 @@ public class DetectionPutInMainActivity extends  BaseActivity implements StoJNI.
         if (resultCode == RESULT_OK) {
             // 图片选择结果回调
             if (requestCode == PictureConfig.CHOOSE_REQUEST) {
-                if (currentPictureType.equals("weigh_picture")){
+                if (currentPictureType.equals("weight_img")){
                     weighPictureSelectorUpload.getSelectImg(data);
                 }else {
                     labelPictureSelectorUpload.getSelectImg(data);
                 }
-
-
+                totalAwaitNum();
             }
         }
     }
@@ -183,38 +192,42 @@ public class DetectionPutInMainActivity extends  BaseActivity implements StoJNI.
         iniData();
         RecyclerView rvLabelShowImg = (RecyclerView)llLabelPicture.findViewById(R.id.rv_show_img);
         RecyclerView rvWeighShowImg = (RecyclerView)llWeighPicture.findViewById(R.id.rv_show_img);
-        labelPictureSelectorUpload  = setItemPicture("label_picture",rvLabelShowImg,9,PictureConfig.TYPE_IMAGE);
-        weighPictureSelectorUpload  = setItemPicture("weigh_picture",rvWeighShowImg,9,PictureConfig.TYPE_IMAGE);
+        labelPictureSelectorUpload  = setItemPicture("label_img",rvLabelShowImg);
+        weighPictureSelectorUpload  = setItemPicture("weight_img",rvWeighShowImg);
+
+        iniPhoto();
     }
 
 
 
     /**
      * 设置多个上传文件
-     * @param actionType String
+     * @param uploadType String
      * @param showImg RecyclerView
      */
-    private PictureSelectorUpload setItemPicture(String actionType,RecyclerView showImg,int maxNum,int pictureType){
-        PictureSelectorUpload pictureUpload = new PictureSelectorUpload(DetectionPutInMainActivity.this,showImg,"detection",maxNum,pictureType);
-        pictureUpload.setActionType(actionType);
-        pictureUpload.setCompress(true,100,500);
+    private AsyncUpload setItemPicture(String uploadType,RecyclerView showImg){
+
+        String notifyUrl = Urls.getServiceAddress(this) + Urls.FXY_DETECTION_PUTIN;
+        AsyncUpload pictureUpload = new AsyncUpload(DetectionPutInMainActivity.this,showImg,"detection",uploadType,notifyUrl);
+        pictureUpload.setUploadType(uploadType);
+        pictureUpload.setCompress(true,100,100);
         pictureUpload.setOnlyCamera(true);
-        pictureUpload.setProgressType(2);
+        pictureUpload.setMaxSelectNum(9);
+        pictureUpload.asyncUpload();//
         //showImg.onTouchEvent()
 
-        pictureUpload.setOnChangeListener(new PictureSelectorUpload.UploadChangeListener() {
+        pictureUpload.setOnChangeListener(new AsyncUpload.UploadChangeListener() {
             @Override
             public void uploadResult(boolean State,String actionType) {
                 if (State) {
-
+                    totalAwaitNum();
                 }
             }
 
             @Override
-            public void uploadActionType(String actionType) {
-                System.out.println("actionType:"+actionType);
-                currentPictureType = actionType;
-
+            public void uploadFileKey(String fileKey) {
+                System.out.println("fileKey:"+fileKey);
+                currentPictureType = fileKey;
             }
         });
         return  pictureUpload;
@@ -231,6 +244,14 @@ public class DetectionPutInMainActivity extends  BaseActivity implements StoJNI.
         return super.dispatchKeyEvent(event);
     }
 
+    public HashMap<String, Object> getNotifyParam(){
+        postData.put("box_number",etOrderNumber.getText().toString().trim());
+        postData.put("tracking_number",etTrackingNumber.getText().toString().trim());
+        labelPictureSelectorUpload.setNotifyParam(postData);
+        weighPictureSelectorUpload.setNotifyParam(postData);
+        return postData;
+    }
+
     //监听按键
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         XLog.e("监听按键:"+keyCode);XLog.e(event);
@@ -350,17 +371,35 @@ public class DetectionPutInMainActivity extends  BaseActivity implements StoJNI.
 
     }
 
+    //getAwaitNum
+    private void totalAwaitNum(){
+        int awaitNum = labelPictureSelectorUpload.getAwaitNum();
+        tvAwaitNum.setText(String.valueOf(awaitNum));
+    }
+
     //统一按钮回调
     public void callbackEditor(View v){
+
+        getNotifyParam();
         switch (v.getId()) {
             case R.id.et_tracking_number:
                 getInboundTrack();
                 break;
             case R.id.et_order_number:
+                if (etTrackingNumber.getText().toString().isEmpty()){
+                    etTrackingNumber.requestFocus();
+                    return;
+                }
+                if (etOrderNumber.getText().toString().isEmpty()){
+                    etOrderNumber.requestFocus();
+                    return;
+                }
+
                 labelPictureSelectorUpload.authCamera();
                 break;
             default:
         }
+
     }
 
     /**
@@ -525,6 +564,8 @@ public class DetectionPutInMainActivity extends  BaseActivity implements StoJNI.
                             llResult.setVisibility(showText.isEmpty() ? View.GONE:View.VISIBLE);
                             tvResult.setText(showText);
 
+
+
                             if(bean.code == 1){
                                 showSuccessToast(bean.msg,voiceName);
                                 etOrderNumber.requestFocus();
@@ -547,37 +588,31 @@ public class DetectionPutInMainActivity extends  BaseActivity implements StoJNI.
         }
 
 
-        if (!checkRepeat(Urls.FXY_DETECTION_PUTIN+(postParam.toString()))){
-            Toast.makeText(this, getString(R.string.error_data_processed), Toast.LENGTH_LONG).show();
-            return;
-        }
+
+
+        //假成功
+        initFinish();
+        showSuccessToast("success");
+
+//        if (!checkRepeat(Urls.FXY_DETECTION_PUTIN+(postParam.toString()))){
+//            Toast.makeText(this, getString(R.string.error_data_processed), Toast.LENGTH_LONG).show();
+//            return;
+//        }
 
 
 
         OkGo.<String>post(Urls.getServiceAddress(this) + Urls.FXY_DETECTION_PUTIN).upJson(postParam)
-                .execute(new MyDialogCallback(this, true, true) {
+                .execute(new MyDialogCallback(this, true, false) {
                     @Override
                     public void onSuccess(Response<String> response) {
                         super.onSuccess(response);
                         try {
                             ActionBean bean = JsonUtil.getObject(response.body(), ActionBean.class);
-                            if(bean.code == 1){
-                                isRequiredShow = false;
-                                showSuccessToast(bean.msg);
-                                 labelPictureSelectorUpload.emptyRemake();//清空图片
-                                weighPictureSelectorUpload.emptyRemake();
-
-
-                                etOrderNumber.setText("");
-                                etTrackingNumber.setText("");
-                                etTrackingNumber.requestFocus();
-
-                                llResult.setVisibility(View.GONE);
-                                llWeighPicture.setVisibility(View.GONE);
-
-                            }else{
-                                showWarningToast(bean.msg);
-                            }
+//                            if(bean.code == 1){
+//                                showSuccessToast(bean.msg);
+//                            }else{
+//                                showWarningToast(bean.msg);
+//                            }
                         } catch (Exception e) {
                             e.printStackTrace();
                             XLog.e("添加开箱拆柜数据结果返回错误",e.getMessage());
@@ -586,6 +621,16 @@ public class DetectionPutInMainActivity extends  BaseActivity implements StoJNI.
                 });
     }
 
+    private void initFinish(){
+        isRequiredShow = false;
+        labelPictureSelectorUpload.emptyRemake();//清空图片
+        weighPictureSelectorUpload.emptyRemake();
+        etOrderNumber.setText("");
+        etTrackingNumber.setText("");
+        etTrackingNumber.requestFocus();
+        llResult.setVisibility(View.GONE);
+        llWeighPicture.setVisibility(View.GONE);
+    }
 
     /*
      * 校验必录
@@ -607,7 +652,7 @@ public class DetectionPutInMainActivity extends  BaseActivity implements StoJNI.
             postParam = new JSONObject();
             Gson gson = new Gson();
 
-            ArrayList<String> labelPhotoList = labelPictureSelectorUpload.getPhotoList();
+            List<LocalMedia>  labelPhotoList = labelPictureSelectorUpload.getSelectList();
 
 
             //检查是否拍照  工单处理时拍照拍照非必传
@@ -615,18 +660,18 @@ public class DetectionPutInMainActivity extends  BaseActivity implements StoJNI.
                 showWarningToast("面单照片不能为空");
                 return false;
             }
+            postParam.put("label_img_tag",labelPictureSelectorUpload.getUniqueTag());
+
 
             if (showWeightImg){
-                ArrayList<String> weighPhotoList = weighPictureSelectorUpload.getPhotoList();
+                List<LocalMedia> weighPhotoList = weighPictureSelectorUpload.getSelectList();
                 if (weighPhotoList.size()==0){
                     showWarningToast("内件照片不能为空");
                     return false;
                 }
-                postParam.put("weight_img",gson.toJson(weighPhotoList));
-            }
-
+                postParam.put("weight_img_tag",weighPictureSelectorUpload.getUniqueTag());
+             }
 
-            postParam.put("label_img",gson.toJson(labelPhotoList));
 
             postParam.put("box_number",etOrderNumber.getText().toString().trim());
             postParam.put("tracking_number",etTrackingNumber.getText().toString().trim());
@@ -639,6 +684,14 @@ public class DetectionPutInMainActivity extends  BaseActivity implements StoJNI.
         return true;
     }
 
+    private void iniPhoto(){
+//        HashMap<String, Object> map = new HashMap<>();
+//        map.put("disabled",false);
+//        map.put("error","不可拍照");
+//        labelPictureSelectorUpload.setLimitOperate(map);
+//        weighPictureSelectorUpload.setLimitOperate(map);
+    }
+
     //sIsGoodinfoMatch,sIsBattery,sIsMagnetic,sIsWood,sIsExtra,sIsOther
     @OnClick({R.id.btn_confirm})
     public void onViewClicked(View view) {

+ 244 - 0
app/src/main/java/com/fxy/realm/AsyncUploadRealm.java

@@ -0,0 +1,244 @@
+package com.fxy.realm;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.fxy.baselibrary.util.JsonUtil;
+import com.fxy.detection.bean.DealDiffBean;
+import com.luck.picture.lib.entity.LocalMedia;
+
+import io.realm.RealmObject;
+import io.realm.annotations.PrimaryKey;
+
+public class AsyncUploadRealm extends RealmObject implements Parcelable {
+    @PrimaryKey // 必须要有一个主键
+    private String id ;//
+    private String uploadType = "" ;// 上传类型(作用于区分不同的功能)
+    private String notifyKey = "" ; // 分组KEY(作用于一个页面多个图片)
+    private String uniqueTag = ""; //唯一标识
+    private String notifyUrl = ""; // 通知地址
+    private String notifyParam = ""; //通知参数
+    private String ossUrl ="";//OSS文件路径
+    private String scanDate = ""; //扫描时间
+    private Integer isDelete = 0; //是否删除
+    private Integer pushStatus = 0; // 推送到oss状态 0 -未推送 1 - 推送失败;  2 - 推送成功
+    private Integer rePush = 0; //重推次数
+    private Integer isFinish=0; // 是否完成 0未完成【】  1已完成 【已上传】 2上传失败
+    private Long createTime;
+    private String localMediaStr = "";
+    public AsyncUploadRealm() {
+    }
+
+    protected AsyncUploadRealm(Parcel in) {
+        id = in.readString();
+        uploadType = in.readString();
+        notifyKey = in.readString();
+        uniqueTag = in.readString();
+        notifyUrl = in.readString();
+        notifyParam = in.readString();
+        ossUrl = in.readString();
+        scanDate = in.readString();
+        if (in.readByte() == 0) {
+            isDelete = null;
+        } else {
+            isDelete = in.readInt();
+        }
+        if (in.readByte() == 0) {
+            pushStatus = null;
+        } else {
+            pushStatus = in.readInt();
+        }
+        if (in.readByte() == 0) {
+            rePush = null;
+        } else {
+            rePush = in.readInt();
+        }
+        if (in.readByte() == 0) {
+            isFinish = null;
+        } else {
+            isFinish = in.readInt();
+        }
+        if (in.readByte() == 0) {
+            createTime = null;
+        } else {
+            createTime = in.readLong();
+        }
+        localMediaStr = in.readString();
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(id);
+        dest.writeString(uploadType);
+        dest.writeString(notifyKey);
+        dest.writeString(uniqueTag);
+        dest.writeString(notifyUrl);
+        dest.writeString(notifyParam);
+        dest.writeString(ossUrl);
+        dest.writeString(scanDate);
+        if (isDelete == null) {
+            dest.writeByte((byte) 0);
+        } else {
+            dest.writeByte((byte) 1);
+            dest.writeInt(isDelete);
+        }
+        if (pushStatus == null) {
+            dest.writeByte((byte) 0);
+        } else {
+            dest.writeByte((byte) 1);
+            dest.writeInt(pushStatus);
+        }
+        if (rePush == null) {
+            dest.writeByte((byte) 0);
+        } else {
+            dest.writeByte((byte) 1);
+            dest.writeInt(rePush);
+        }
+        if (isFinish == null) {
+            dest.writeByte((byte) 0);
+        } else {
+            dest.writeByte((byte) 1);
+            dest.writeInt(isFinish);
+        }
+        if (createTime == null) {
+            dest.writeByte((byte) 0);
+        } else {
+            dest.writeByte((byte) 1);
+            dest.writeLong(createTime);
+        }
+        dest.writeString(localMediaStr);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final Creator<AsyncUploadRealm> CREATOR = new Creator<AsyncUploadRealm>() {
+        @Override
+        public AsyncUploadRealm createFromParcel(Parcel in) {
+            return new AsyncUploadRealm(in);
+        }
+
+        @Override
+        public AsyncUploadRealm[] newArray(int size) {
+            return new AsyncUploadRealm[size];
+        }
+    };
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getUploadType() {
+        return uploadType;
+    }
+
+    public void setUploadType(String uploadType) {
+        this.uploadType = uploadType;
+    }
+
+    public String getNotifyKey() {
+        return notifyKey;
+    }
+
+    public void setNotifyKey(String notifyKey) {
+        this.notifyKey = notifyKey;
+    }
+
+    public String getUniqueTag() {
+        return uniqueTag;
+    }
+
+    public void setUniqueTag(String uniqueTag) {
+        this.uniqueTag = uniqueTag;
+    }
+
+    public String getNotifyUrl() {
+        return notifyUrl;
+    }
+
+    public void setNotifyUrl(String notifyUrl) {
+        this.notifyUrl = notifyUrl;
+    }
+
+    public String getNotifyParam() {
+        return notifyParam;
+    }
+
+    public void setNotifyParam(String notifyParam) {
+        this.notifyParam = notifyParam;
+    }
+
+    public String getOssUrl() {
+        return ossUrl;
+    }
+
+    public void setOssUrl(String ossUrl) {
+        this.ossUrl = ossUrl;
+    }
+
+    public String getScanDate() {
+        return scanDate;
+    }
+
+    public void setScanDate(String scanDate) {
+        this.scanDate = scanDate;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getPushStatus() {
+        return pushStatus;
+    }
+
+    public void setPushStatus(Integer pushStatus) {
+        this.pushStatus = pushStatus;
+    }
+
+    public Integer getRePush() {
+        return rePush;
+    }
+
+    public void setRePush(Integer rePush) {
+        this.rePush = rePush;
+    }
+
+    public Integer getIsFinish() {
+        return isFinish;
+    }
+
+    public void setIsFinish(Integer isFinish) {
+        this.isFinish = isFinish;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLocalMediaStr() {
+        return localMediaStr;
+    }
+
+    public void setLocalMediaStr(String localMediaStr) {
+        this.localMediaStr = localMediaStr;
+    }
+
+    public LocalMedia getLocalMedia() {
+        return JsonUtil.jsonString2Bean(this.localMediaStr, LocalMedia.class);
+    }
+}

+ 26 - 0
app/src/main/res/layout/activity_fxy_detection_putin.xml

@@ -123,6 +123,8 @@
             </LinearLayout>
 
 
+
+
             <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
@@ -149,6 +151,30 @@
                     android:textColor="@color/white"
                     android:visibility="visible" />
             </LinearLayout>
+
+            <LinearLayout
+                android:id="@+id/ll_await_num"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/dp_10"
+                android:layout_marginRight="@dimen/dp_10"
+                android:background="@null"
+                android:padding="@dimen/dp_10"
+                android:gravity="center_vertical"
+                android:orientation="horizontal">
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                     android:text="待上传文件:">
+                </TextView>
+                <TextView
+                    android:id="@+id/tv_await_num"
+                    android:textColor="@color/md_red_900"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="0">
+                </TextView>
+            </LinearLayout>
         </LinearLayout>