riku
2025-10-31 1897c4ad5fa73b3f0a36e1aa0e1e9000302a6ace
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
package cn.flightfeather.thirdappmodule.activity;
 
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.CardView;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
 
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.ping.greendao.gen.MediafileDao;
 
import java.io.File;
import java.util.ArrayList;
import java.util.List;
 
import cn.flightfeather.thirdappmodule.CommonApplication;
import cn.flightfeather.thirdappmodule.R;
import cn.flightfeather.thirdappmodule.adapter.MediaFileListAdapter;
import cn.flightfeather.thirdappmodule.bean.entity.Mediafile;
import cn.flightfeather.thirdappmodule.task.CompressPhotoTask;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
 
public class UploadMediaFilesActivity extends AppCompatActivity implements View.OnClickListener {
    private RecyclerView rv_main;
    private TextView tv_uploada;
    private MediafileDao mediafileDao;
    private CommonApplication application;
    private List<Mediafile> mediaFileListCurrent;
    private List<File> fileListCurrent;
    private MediaFileListAdapter adapter;
    private CardView cv_wait;
    private TextView tv_waitText;
    private AlertDialog.Builder uploadingDialog;
    private int photoTotal = 0;
    private int photoUploaded =0;
    private ProgressBar pb_uploading;
    private TextView tv_status;
    private UploadService uploadService;
    private List<File> outputFileList;
    private AlertDialog uploadingDialog2;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_upload_media_files);
        application = (CommonApplication) getApplication();
        uploadService = application.getRetrofit().create(UploadService.class);
        initUI();
        initDataBase();
        initData();
        initUploadingDialog();
    }
 
    //初始化界面
    private void initUI() {
        getSupportActionBar().setTitle("文件上传");
        rv_main = (RecyclerView) findViewById(R.id.rv_main);
        tv_uploada = (TextView) findViewById(R.id.tv_upload);
        cv_wait = (CardView) findViewById(R.id.cv_wait);
        tv_waitText = (TextView) findViewById(R.id.tv_wait_text);
        cv_wait.setVisibility(View.GONE);
 
        LinearLayoutManager manager = new LinearLayoutManager(this);
        rv_main.setLayoutManager(manager);
        mediaFileListCurrent = new ArrayList<>();
        adapter = new MediaFileListAdapter(this,mediaFileListCurrent);
        rv_main.setAdapter(adapter);
 
        tv_uploada.setOnClickListener(this);
    }
 
    //初始化数据库
    private void initDataBase() {
        mediafileDao = application.getDaoSession().getMediafileDao();
    }
    //初始化数据
    private void initData() {
        List<Mediafile> mediaFileList = mediafileDao.queryBuilder().where(MediafileDao.Properties.Remark.eq("未上传")).list();
        if (mediaFileList!=null&&mediaFileList.size()>0){
            mediaFileListCurrent.clear();
            mediaFileListCurrent.addAll(mediaFileList);
            //检查一下mediafile对应的图片是否存在,没有则删掉mediafile
            for (int i = 0;i<mediaFileListCurrent.size();i++){
                Mediafile  mediaFile = mediaFileListCurrent.get(i);
                File file = new File(Environment.getExternalStorageDirectory(),(mediaFile.getPath()+mediaFile.getDescription()));
                if (!file.exists()){
                    Log.i(i+":","no Photo");
                    mediafileDao.delete(mediaFile);
                }
            }
            List<Mediafile> mediaFileList2 = mediafileDao.queryBuilder().where(MediafileDao.Properties.Remark.eq("未上传")).list();
            mediaFileListCurrent.clear();
            mediaFileListCurrent.addAll(mediaFileList2);
            photoTotal = mediaFileListCurrent.size();
            photoUploaded = 0;
            adapter.notifyDataSetChanged();
        }
    }
    //上传前压缩图片
    private void preUpload(){
        CompressPhotoTask task = new CompressPhotoTask(mediaFileListCurrent,this);
        task.execute();
        pb_uploading.setMax(photoTotal);
        pb_uploading.setProgress(photoUploaded);
        tv_status.setText("压缩中...");
        if (uploadingDialog2 != null && !uploadingDialog2.isShowing()) {
            uploadingDialog2.show();
        } else {
            uploadingDialog2 = uploadingDialog.show();
        }
    }
    //开始上传
    public void startUplaod(List<File> outputFileList){
 
        this.outputFileList = outputFileList;
        updateUploadingStatus();
        uploadSinglePhoto(outputFileList.get(0));
 
    }
 
    private void showErrorDialog(){
        uploadingDialog2.dismiss();
        AlertDialog.Builder dialog = new AlertDialog.Builder(this);
        dialog.setTitle("上传失败");
        dialog.setMessage("请重试");
        dialog.setPositiveButton("确定",null);
        initData();
        dialog.show();
 
    }
    //一次上传全部的图片
    private void uploadAllPhoto(List<File> outputFileList){
        List<MultipartBody.Part> photoList = new ArrayList<>();
        //准备图片部分
        for (File file:outputFileList){
            // 创建 RequestBody,用于封装构建RequestBody
            RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
            // MultipartBody.Part  和后端约定好Key,这里的partName是用image
            MultipartBody.Part body = MultipartBody.Part.createFormData("Photos", file.getName(), requestFile);
            photoList.add(body);
        }
        //将mediafile的备注设置为已上传,如果上传成功就将这个列表写入数据库
        for (int i = 0;i<mediaFileListCurrent.size();i++){
            Mediafile mediaFile = mediaFileListCurrent.get(i);
            mediaFile.setRemark("已上传");
            mediaFileListCurrent.set(i,mediaFile);
        }
        //准备mediafile的json
        Gson gson = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
                .create();
        String a =gson.toJson(mediaFileListCurrent);
        final RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), a);
        MultipartBody.Part part = MultipartBody.Part.createFormData("mediafileVoList", null, requestBody);
        photoList.add(part);
 
 
        Call<ResponseBody> uploadPhotos =uploadService.uploadPhotos(photoList);
        uploadPhotos.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                if (response.body()!=null){
                    mediafileDao.updateInTx(mediaFileListCurrent);
                    hideWait();
                    Toast.makeText(application, "上传成功", Toast.LENGTH_SHORT).show();
                    finish();
 
                }else if (response.errorBody()!=null){
                    hideWait();
                    System.out.println("uploadPhotos:"+response.errorBody().toString());
                    Toast.makeText(application, "上传错误,请重试", Toast.LENGTH_SHORT).show();
                }
            }
 
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                hideWait();
                System.out.println("uploadPhotos:"+t.toString());
                Toast.makeText(application, "网络连接失败", Toast.LENGTH_SHORT).show();
            }
        });
    }
 
    //显示确认上传的dialog
    public void showConfirmUploadDialog(){
        if (mediaFileListCurrent!=null&&mediaFileListCurrent.size()>0){
            AlertDialog.Builder dialog = new AlertDialog.Builder(this);
            dialog.setTitle("开始上传吗?");
            dialog.setMessage("推荐在wifi连接下上传,避免过多的流量消耗");
            dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    preUpload();
                }
            });
            dialog.setNegativeButton("取消",null);
            dialog.show();
        }else {
            Toast.makeText(application, "没有要上传的图片", Toast.LENGTH_SHORT).show();
        }
 
    }
    private void initUploadingDialog(){
        uploadingDialog = new AlertDialog.Builder(this);
        uploadingDialog.setTitle("正在上传");
        View view =View.inflate(UploadMediaFilesActivity.this,R.layout.dialog_uploading,null);
        pb_uploading = (ProgressBar) view.findViewById(R.id.pb_uploading);
        tv_status = (TextView) view.findViewById(R.id.tv_status);
        uploadingDialog.setView(view);
        uploadingDialog.setCancelable(false);
 
 
    }
 
    private void uploadSinglePhoto(File file){
        List<MultipartBody.Part> photoList = new ArrayList<>();
        //准备图片部分
 
            // 创建 RequestBody,用于封装构建RequestBody
            RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
            // MultipartBody.Part  和后端约定好Key,这里的partName是用image
            MultipartBody.Part body = MultipartBody.Part.createFormData("Photos", file.getName(), requestFile);
            photoList.add(body);
 
        List<Mediafile> mediafiles = new ArrayList<>();
        final Mediafile mediaFile = mediaFileListCurrent.get(photoUploaded);
        mediaFile.setRemark("已上传");
        mediafiles.add(mediaFile);
 
        //准备mediafile的json
        Gson gson = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
                .create();
        String a =gson.toJson(mediafiles);
 
        final RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), a);
        MultipartBody.Part part = MultipartBody.Part.createFormData("mediafileVoList", null, requestBody);
        photoList.add(part);
 
        Call<ResponseBody> uploadPhotos =uploadService.uploadPhotos(photoList);
        uploadPhotos.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                if (response.body()!=null){
                    mediafileDao.update(mediaFile);
                    photoUploaded++;
                    updateUploadingStatus();
                    if (photoUploaded<photoTotal){
                        uploadSinglePhoto(outputFileList.get(photoUploaded));
                    }else {
                        Toast.makeText(application, "上传成功", Toast.LENGTH_SHORT).show();
                        clearTemp(outputFileList);
                        finish();
                    }
 
                }else if (response.errorBody()!=null){
                    hideWait();
                    System.out.println("uploadSinglePhotos:"+response.errorBody().toString());
                    Toast.makeText(application, "上传错误,请重试", Toast.LENGTH_SHORT).show();
                    showErrorDialog();
 
                }
            }
 
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                hideWait();
                System.out.println("uploadSinglePhotos:"+t.toString());
                Toast.makeText(application, "网络连接失败", Toast.LENGTH_SHORT).show();
                showErrorDialog();
            }
        });
 
 
    }
    //更新上传的显示状态
    private void updateUploadingStatus(){
        pb_uploading.setProgress(photoUploaded);
        tv_status.setText(photoUploaded+"/"+photoTotal);
    }
    //清理缓存
    private void clearTemp(List<File> outputFileList){
        if (outputFileList!=null&&outputFileList.size()>0){
            for (File file:outputFileList){
                if (file.exists()){
                    file.delete();
                }
            }
        }
 
    }
 
    private void showCompressWait(){
        tv_waitText.setText("压缩中");
        cv_wait.setVisibility(View.VISIBLE);
    }
    private void showUploadWait(){
        tv_waitText.setText("上传中");
        cv_wait.setVisibility(View.VISIBLE);
    }
    private void hideWait(){
        cv_wait.setVisibility(View.GONE);
    }
 
    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.tv_upload) {
            showConfirmUploadDialog();
        }
    }
    interface UploadService{
        @Multipart
        @POST("mediafile/add/")
        Call<ResponseBody> uploadPhotos(@Part List<MultipartBody.Part> partList);
    }
 
    @Override
    protected void onStop() {
        super.onStop();
 
    }
}