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 mediaFileListCurrent; private List 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 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 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 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 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 outputFileList){ List 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 uploadPhotos =uploadService.uploadPhotos(photoList); uploadPhotos.enqueue(new Callback() { @Override public void onResponse(Call call, Response 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 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 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 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 uploadPhotos =uploadService.uploadPhotos(photoList); uploadPhotos.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { if (response.body()!=null){ mediafileDao.update(mediaFile); photoUploaded++; updateUploadingStatus(); if (photoUploaded 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 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 uploadPhotos(@Part List partList); } @Override protected void onStop() { super.onStop(); } }