AsyncUpload.java 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879
  1. package com.fxy.common;
  2. import android.Manifest;
  3. import android.annotation.SuppressLint;
  4. import android.app.Activity;
  5. import android.app.AlertDialog;
  6. import android.app.ProgressDialog;
  7. import android.content.Context;
  8. import android.content.DialogInterface;
  9. import android.content.Intent;
  10. import android.graphics.Color;
  11. import android.graphics.drawable.ColorDrawable;
  12. import android.net.ConnectivityManager;
  13. import android.net.NetworkInfo;
  14. import android.os.Handler;
  15. import android.os.Message;
  16. import android.support.v7.widget.GridLayoutManager;
  17. import android.support.v7.widget.RecyclerView;
  18. import android.view.Gravity;
  19. import android.view.View;
  20. import android.view.WindowManager;
  21. import android.widget.PopupWindow;
  22. import android.widget.TextView;
  23. import android.widget.Toast;
  24. import com.alibaba.sdk.android.oss.internal.OSSAsyncTask;
  25. import com.elvishew.xlog.XLog;
  26. import com.fxy.R;
  27. import com.fxy.adapter.GridImageAdapter;
  28. import com.fxy.baselibrary.util.DateUtil;
  29. import com.fxy.baselibrary.util.JsonUtil;
  30. import com.fxy.baselibrary.util.RxTimeTool;
  31. import com.fxy.bean.ActionBean;
  32. import com.fxy.constant.SPCache;
  33. import com.fxy.net.MyDialogCallback;
  34. import com.fxy.net.Urls;
  35. import com.fxy.realm.AsyncUploadRealm;
  36. import com.fxy.view.FullyGridLayoutManager;
  37. import com.google.gson.Gson;
  38. import com.google.gson.reflect.TypeToken;
  39. import com.luck.picture.lib.PictureSelector;
  40. import com.luck.picture.lib.config.PictureConfig;
  41. import com.luck.picture.lib.config.PictureMimeType;
  42. import com.luck.picture.lib.entity.LocalMedia;
  43. import com.luck.picture.lib.permissions.Permission;
  44. import com.luck.picture.lib.permissions.RxPermissions;
  45. import com.lzy.okgo.OkGo;
  46. import com.lzy.okgo.model.Response;
  47. import org.greenrobot.eventbus.EventBus;
  48. import org.json.JSONObject;
  49. import java.lang.reflect.Type;
  50. import java.util.ArrayList;
  51. import java.util.Date;
  52. import java.util.HashMap;
  53. import java.util.List;
  54. import java.util.Map;
  55. import java.util.UUID;
  56. import io.reactivex.functions.Consumer;
  57. import io.realm.Realm;
  58. import io.realm.RealmResults;
  59. public class AsyncUpload {
  60. private final Activity mActivity;
  61. private final Context mContext;
  62. private int maxSelectNum = 9;
  63. private GridImageAdapter adapter;
  64. private final RecyclerView mRecyclerView;
  65. private PopupWindow pop;
  66. private boolean onlyCamera = false;
  67. private boolean isCompress = false;
  68. private int compressQuality = 100;//默认值
  69. private int minimumCompressSize = 100;//最小压缩
  70. //资源类型
  71. private int pictureType=1;
  72. private String uploadType = "";
  73. //文件上传类型
  74. protected String fileKey = "";
  75. //通知地址
  76. private String notifyUrl = "";
  77. //唯一标识
  78. private String uniqueTag = "";
  79. //通知地址
  80. private HashMap<String, Object> notifyParam = new HashMap<>();
  81. private HashMap<String, Object> limitOperate = new HashMap<>();
  82. protected Realm mRealm;
  83. private List<AsyncUploadRealm> awaitUploadList=new ArrayList<>();
  84. //
  85. private List<LocalMedia> selectList = new ArrayList<>();
  86. //上传图片路径
  87. private ArrayList<String> ossPhotoList =new ArrayList<>();
  88. private String mPrefix="tally";
  89. //是否停止上传
  90. private String resourceUrl = "";
  91. private String resourceType = "";
  92. private String resourcePrefix = "/fxy";
  93. private OssService ossService;
  94. private CosService cosService;
  95. //是自动上传
  96. private boolean isAutoUpload = true;
  97. private boolean allowUpload = false;
  98. public AsyncUpload(Activity activity, RecyclerView rvShowImg, String prefix,String fileKey, String notifyUrl,boolean isAutoUpload){
  99. mActivity = activity;
  100. mContext = activity.getBaseContext();
  101. mRecyclerView = rvShowImg;
  102. this.fileKey = fileKey;
  103. this.mPrefix = prefix;
  104. this.notifyUrl = notifyUrl;
  105. this.isAutoUpload = isAutoUpload;
  106. //自动上传则允许继续上次
  107. this.allowUpload = isAutoUpload;
  108. initAdapter();
  109. initData();
  110. }
  111. private void initData() {
  112. SPCache spCache = SPCache.getInstance(mContext);
  113. resourceUrl = spCache.getResourceHost()+"/";
  114. resourceType = spCache.getResourceType();
  115. resourcePrefix = spCache.getResourcePrefix();
  116. mRealm = Realm.getDefaultInstance();
  117. uploadType = mActivity.getClass().getSimpleName();
  118. limitOperate = new HashMap<>();
  119. uniqueTag = this.fileKey+UUID.randomUUID().toString();
  120. }
  121. public void setCompress(Boolean isCompress) {
  122. this.isCompress = isCompress;
  123. }
  124. public void setCompress(Boolean isCompress,int compressQuality,int minimumCompressSize) {
  125. this.isCompress = isCompress;
  126. this.compressQuality = compressQuality;
  127. this.minimumCompressSize = minimumCompressSize;
  128. }
  129. public void setUploadType(String fileKey) {
  130. this.fileKey = fileKey;
  131. }
  132. public void setPictureType(int pictureType){
  133. this.pictureType = pictureType;
  134. }
  135. public void setOnlyCamera(boolean onlyCamera){
  136. this.onlyCamera = onlyCamera;
  137. }
  138. public void setMaxSelectNum(int num){
  139. this.maxSelectNum = num;
  140. }
  141. public void setNotifyParam( HashMap<String, Object> map){
  142. this.notifyParam = map;
  143. }
  144. //操作限制
  145. public void setLimitOperate(HashMap<String, Object> map){
  146. this.limitOperate = map;
  147. }
  148. /**
  149. * 设置操作类型
  150. * @return
  151. */
  152. public String getUploadType() {
  153. return fileKey;
  154. }
  155. public int getAwaitNum(){
  156. RealmResults<AsyncUploadRealm> realmResults = mRealm.where(AsyncUploadRealm.class)
  157. .equalTo("isDelete",0)
  158. .equalTo("pushStatus",0)
  159. .equalTo("uploadType",uploadType)
  160. .sort("pushStatus").findAll();
  161. realmResults.load();
  162. return realmResults.size();
  163. }
  164. public List<LocalMedia> getSelectList (){
  165. return selectList;
  166. }
  167. public List<String> getOssPhotoList (){
  168. return ossPhotoList;
  169. }
  170. public void emptyRemake(){
  171. selectList.clear();
  172. ossPhotoList.clear();
  173. adapter.clearData();
  174. uniqueTag = this.fileKey+UUID.randomUUID().toString();
  175. }
  176. //销毁
  177. public void removeHandler(){
  178. if (uploadHandler!=null){
  179. uploadHandler.removeCallbacksAndMessages(null);
  180. }
  181. }
  182. /**
  183. * 获取选中图片
  184. * @param data
  185. */
  186. public void getSelectImg (Intent data){
  187. List<LocalMedia> fileList = PictureSelector.obtainMultipleResult(data);
  188. for (int i = 0; i < fileList.size(); i++) {
  189. addUploadFile(fileList.get(i));
  190. selectList.add(fileList.get(i));
  191. }
  192. adapter.setList(selectList);
  193. adapter.notifyDataSetChanged();
  194. //设置自动
  195. if (isAutoUpload){
  196. asyncUpload();
  197. }
  198. }
  199. public String getUniqueTag(){
  200. return this.uniqueTag;
  201. }
  202. @SuppressLint("HandlerLeak")
  203. private Handler uploadHandler = new Handler() {
  204. @Override
  205. public void handleMessage(Message msg) {
  206. try {
  207. //XLog.e(msg);
  208. int current = (Integer) msg.arg1;
  209. switch (msg.what){
  210. case 0:
  211. Toast.makeText(mActivity, "error", Toast.LENGTH_SHORT).show();
  212. break;
  213. case 1://失败
  214. if (awaitUploadList.size()>0){
  215. AsyncUploadRealm asyncUploadRealm = awaitUploadList.get(current);
  216. awaitUploadList.remove(current);
  217. resultUpload(asyncUploadRealm.getId(),0,"");
  218. String message = (String) msg.obj;
  219. if (!message.isEmpty() && mActivity!=null){
  220. Toast.makeText(mActivity, message, Toast.LENGTH_SHORT).show();
  221. }
  222. }
  223. break;
  224. case 2://成功
  225. //表示数据存在
  226. if (awaitUploadList.size()>0){
  227. AsyncUploadRealm asyncUploadRealm = awaitUploadList.get(current);
  228. awaitUploadList.remove(current);
  229. resultUpload(asyncUploadRealm.getId(),1,(String) msg.obj);
  230. }
  231. break;
  232. case 3:
  233. //设置进度条
  234. EventBus.getDefault().post(new UploadProgressEvent(msg.arg2));
  235. //progressDialog.show();
  236. return;
  237. case 4:
  238. //获取上传状态
  239. return;
  240. default:
  241. break;
  242. }
  243. // 通过接口对象传上传状态
  244. if (uploadChangeListener!=null){
  245. uploadChangeListener.uploadResult(true,fileKey);
  246. }
  247. } catch (Exception e) {
  248. XLog.e(e.getMessage());
  249. e.printStackTrace();
  250. // 通过接口对象传上传状态
  251. if (uploadChangeListener!=null){
  252. uploadChangeListener.uploadResult(false,fileKey);
  253. }
  254. }
  255. }
  256. };
  257. // 持有一个接口对象
  258. UploadChangeListener uploadChangeListener;
  259. // 状态变化监听
  260. public interface UploadChangeListener {
  261. // 回调方法 可以多个
  262. void uploadResult(boolean State, String actionType);
  263. void uploadFileKey(String actionType);
  264. }
  265. // 提供注册事件监听的方法
  266. public void setOnChangeListener(UploadChangeListener uploadChangeListener) {
  267. this.uploadChangeListener = uploadChangeListener;
  268. }
  269. // 调用回调方法
  270. //uploadChangeListener.uploadResult(false);
  271. public void filedUpload(int num){
  272. // 例如 LocalMedia 里面返回三种path
  273. // 1.media.getPath(); 为原图path
  274. // 2.media.getCutPath();为裁剪后path,需判断media.isCut();是否为true
  275. // 3.media.getCompressPath();为压缩后path,需判断media.isCompressed();是否为true
  276. // 如果裁剪并压缩了,以取压缩路径为准,因为是先裁剪后压缩的
  277. LocalMedia localMedia = awaitUploadList.get(num).getLocalMedia();
  278. String urlPath =localMedia.getPath();
  279. if (isCompress && localMedia.getCompressPath()!=null){
  280. urlPath = localMedia.getCompressPath();
  281. }
  282. if (urlPath.isEmpty()){
  283. Message msg = new Message();
  284. msg.obj = "文件路径不存在";
  285. msg.what = 1;
  286. uploadHandler.sendMessage(msg);
  287. return;
  288. }
  289. String fileName = "";
  290. String path_prefix = "";
  291. String ossUrl = awaitUploadList.get(num).getOssUrl();
  292. if (!ossUrl.isEmpty()){
  293. // 找到最后一个斜杠的位置
  294. int lastSlashIndex = ossUrl.lastIndexOf('/');
  295. // 如果找到了斜杠,则从斜杠之后的位置开始切割
  296. fileName = ossUrl.substring(lastSlashIndex + 1);
  297. path_prefix = ossUrl.substring(0,lastSlashIndex+ 1);
  298. }else{
  299. path_prefix = resourcePrefix+"/android/"+mPrefix+"/"+RxTimeTool.getYestoryDate("yyyyMMd")+"/";
  300. String fileSuffix = urlPath.lastIndexOf(".")>-1 ? urlPath.substring(urlPath.lastIndexOf(".")) : "";
  301. fileName = UUID.randomUUID().toString() + fileSuffix;
  302. }
  303. if (resourceType.equals("tencent")){
  304. if (cosService==null){
  305. cosService = new CosService(mActivity.getBaseContext(),path_prefix);
  306. }
  307. //new cosThread(urlPath, fileName , num).start();
  308. cosService.cosUpload(urlPath, fileName , num,uploadHandler);
  309. }else{
  310. if (ossService ==null){
  311. ossService = new OssService(mActivity,path_prefix);
  312. }
  313. ossService.ossUpload(urlPath, fileName , num,uploadHandler);
  314. //new ossThread(urlPath, fileName , num).start();
  315. }
  316. // task.cancel(); // 可以取消任务
  317. // task.waitUntilFinished(); // 可以等待直到任务完成
  318. EventBus.getDefault().post(new UploadProgressEvent(0));
  319. }
  320. private void initAdapter() {
  321. FullyGridLayoutManager manager = new FullyGridLayoutManager(mActivity, 3, GridLayoutManager.VERTICAL, false);
  322. mRecyclerView.setLayoutManager(manager);
  323. adapter = new GridImageAdapter(mActivity,mActivity, onAddPicClickListener,pictureType);
  324. adapter.setList(selectList);
  325. adapter.setSelectMax(maxSelectNum);
  326. mRecyclerView.setAdapter(adapter);
  327. adapter.setOnItemClickListener(new GridImageAdapter.OnItemClickListener() {
  328. @Override
  329. public void onItemClick(int position, View v) {
  330. if (selectList.size() > 0) {
  331. LocalMedia media = selectList.get(position);
  332. String pictureType = media.getPictureType();
  333. int mediaType = PictureMimeType.pictureToVideo(pictureType);
  334. switch (mediaType) {
  335. case 1:
  336. // 预览图片 可自定长按保存路径
  337. //PictureSelector.create(MainActivity.this).externalPicturePreview(position, "/custom_file", selectList);
  338. PictureSelector.create(mActivity).externalPicturePreview(position, selectList);
  339. break;
  340. case 2:
  341. // 预览视频
  342. PictureSelector.create(mActivity).externalPictureVideo(media.getPath());
  343. break;
  344. case 3:
  345. // 预览音频
  346. PictureSelector.create(mActivity).externalPictureAudio(media.getPath());
  347. break;
  348. }
  349. }
  350. }
  351. });
  352. //回调语音
  353. adapter.setOnAudioListener(new GridImageAdapter.OnAudioListener() {
  354. @Override
  355. public void onSaveResult(Intent data) {
  356. getSelectImg(data);
  357. }
  358. });
  359. }
  360. public GridImageAdapter.onAddPicClickListener onAddPicClickListener = new GridImageAdapter.onAddPicClickListener() {
  361. @SuppressLint("CheckResult")
  362. @Override
  363. public void onAddPicClick() {
  364. //获取写的权限
  365. RxPermissions rxPermission = new RxPermissions(mActivity);
  366. rxPermission.requestEach(Manifest.permission.WRITE_EXTERNAL_STORAGE)
  367. .subscribe(new Consumer<Permission>() {
  368. @Override
  369. public void accept(Permission permission) {
  370. if (permission.granted) {// 用户已经同意该权限
  371. //第一种方式,弹出选择和拍照的dialog
  372. if (limitOperate.containsKey("disabled")){
  373. String message = "暂时无法拍照";
  374. if(limitOperate.containsKey("error")){
  375. message = limitOperate.get("error").toString();
  376. }
  377. if ( mActivity!=null){
  378. Toast.makeText(mActivity, message, Toast.LENGTH_SHORT).show();
  379. }
  380. return;
  381. }
  382. if (pictureType==PictureConfig.TYPE_AUDIO){
  383. authAudio();
  384. }else {
  385. if (onlyCamera){
  386. //第二种方式,直接进入相册,但是 是有拍照得按钮的
  387. authCamera();
  388. }else{
  389. showPop();
  390. }
  391. }
  392. } else {
  393. Toast.makeText(mContext, "拒绝", Toast.LENGTH_SHORT).show();
  394. }
  395. }
  396. });
  397. //监听返回当前某个上传类型
  398. if (uploadChangeListener!=null){
  399. uploadChangeListener.uploadFileKey(fileKey);
  400. }
  401. }
  402. };
  403. private void showAlbum() {
  404. //参数很多,根据需要添加
  405. PictureSelector.create(mActivity)
  406. .openGallery(PictureMimeType.ofImage())// 全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
  407. .maxSelectNum(maxSelectNum)// 最大图片选择数量
  408. .minSelectNum(1)// 最小选择数量
  409. .imageSpanCount(4)// 每行显示个数
  410. .selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选PictureConfig.MULTIPLE : PictureConfig.SINGLE
  411. .previewImage(true)// 是否可预览图片
  412. .isCamera(true)// 是否显示拍照按钮
  413. .isZoomAnim(true)// 图片列表点击 缩放效果 默认true
  414. //.setOutputCameraPath("/CustomPath")// 自定义拍照保存路径
  415. .enableCrop(true)// 是否裁剪
  416. .compress(true)// 是否压缩
  417. //.sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效
  418. .glideOverride(160, 160)// glide 加载宽高,越小图片列表越流畅,但会影响列表图片浏览的清晰度
  419. .withAspectRatio(1, 1)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
  420. //.selectionMedia(selectList)// 是否传入已选图片
  421. //.previewEggs(false)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
  422. //.cropCompressQuality(90)// 裁剪压缩质量 默认100
  423. //.compressMaxKB()//压缩最大值kb compressGrade()为Luban.CUSTOM_GEAR有效
  424. //.compressWH() // 压缩宽高比 compressGrade()为Luban.CUSTOM_GEAR有效
  425. //.cropWH()// 裁剪宽高比,设置如果大于图片本身宽高则无效
  426. .rotateEnabled(false) // 裁剪是否可旋转图片
  427. //.scaleEnabled()// 裁剪是否可放大缩小图片
  428. //.recordVideoSecond()//录制视频秒数 默认60s
  429. .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
  430. }
  431. private void showPop() {
  432. View bottomView = View.inflate(mContext, R.layout.layout_bottom_dialog, null);
  433. TextView mAlbum = bottomView.findViewById(R.id.tv_album);
  434. TextView mCamera = bottomView.findViewById(R.id.tv_camera);
  435. TextView mCancel = bottomView.findViewById(R.id.tv_cancel);
  436. pop = new PopupWindow(bottomView, -1, -2);
  437. pop.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
  438. pop.setOutsideTouchable(true);
  439. pop.setFocusable(true);
  440. WindowManager.LayoutParams lp = mActivity.getWindow().getAttributes();
  441. lp.alpha = 0.5f;
  442. mActivity.getWindow().setAttributes(lp);
  443. pop.setOnDismissListener(new PopupWindow.OnDismissListener() {
  444. @Override
  445. public void onDismiss() {
  446. WindowManager.LayoutParams lp = mActivity.getWindow().getAttributes();
  447. lp.alpha = 1f;
  448. mActivity.getWindow().setAttributes(lp);
  449. }
  450. });
  451. pop.setAnimationStyle(R.style.main_menu_photo_anim);
  452. pop.showAtLocation(mActivity.getWindow().getDecorView(), Gravity.BOTTOM, 0, 0);
  453. View.OnClickListener clickListener = new View.OnClickListener() {
  454. @Override
  455. public void onClick(View view) {
  456. switch (view.getId()) {
  457. case R.id.tv_album:
  458. //相册
  459. PictureSelector.create(mActivity)
  460. .openGallery(PictureMimeType.ofImage())
  461. .maxSelectNum(maxSelectNum)
  462. .minSelectNum(1)
  463. .imageSpanCount(4)
  464. .selectionMode(PictureConfig.MULTIPLE)
  465. .compress(isCompress) // 压缩
  466. .cropCompressQuality(compressQuality)// 裁剪压缩质量 默认100
  467. .minimumCompressSize(minimumCompressSize) //最新压缩图片
  468. .forResult(PictureConfig.CHOOSE_REQUEST);
  469. break;
  470. case R.id.tv_camera:
  471. //拍照
  472. PictureSelector.create(mActivity)
  473. .openCamera(PictureMimeType.ofImage())
  474. //只需要拍照
  475. //.selectionMode(PictureConfig.SINGLE)
  476. //.isCamera(true)
  477. .compress(isCompress) // 压缩
  478. .cropCompressQuality(compressQuality)// 裁剪压缩质量 默认100
  479. .minimumCompressSize(minimumCompressSize) //最新压缩图片
  480. .forResult(PictureConfig.CHOOSE_REQUEST);
  481. break;
  482. case R.id.tv_cancel:
  483. //取消
  484. //closePopupWindow();
  485. break;
  486. }
  487. closePopupWindow();
  488. }
  489. };
  490. mAlbum.setOnClickListener(clickListener);
  491. mCamera.setOnClickListener(clickListener);
  492. mCancel.setOnClickListener(clickListener);
  493. }
  494. /**
  495. * 外部直接调取拍照接口
  496. */
  497. public void authCamera(){
  498. //拍照
  499. PictureSelector.create(mActivity)
  500. .openCamera(PictureMimeType.ofImage())
  501. //只需要拍照
  502. //.selectionMode(PictureConfig.SINGLE)
  503. //.isCamera(true)
  504. //.compressMaxKB()//压缩最大值kb compressGrade()为Luban.CUSTOM_GEAR有效
  505. .compress(isCompress) // 压缩
  506. .cropCompressQuality(compressQuality)// 裁剪压缩质量 默认100
  507. .minimumCompressSize(minimumCompressSize) //最新压缩图片
  508. .forResult(PictureConfig.CHOOSE_REQUEST);
  509. //监听返回当前某个上传类型
  510. if (uploadChangeListener!=null){
  511. uploadChangeListener.uploadFileKey(fileKey);
  512. }
  513. }
  514. /**
  515. * 自动打开录音
  516. */
  517. public void authAudio(){
  518. // 自带音频
  519. PictureSelector.create(mActivity)
  520. .openCamera(PictureMimeType.ofAudio())
  521. //只需要音频
  522. .selectionMode(PictureConfig.TYPE_AUDIO)
  523. .compress(isCompress) // 压缩
  524. .forResult(PictureConfig.CHOOSE_REQUEST);
  525. //监听返回当前某个上传类型
  526. if (uploadChangeListener!=null){
  527. uploadChangeListener.uploadFileKey(fileKey);
  528. }
  529. }
  530. /**
  531. * 关闭弹窗
  532. */
  533. public void closePopupWindow() {
  534. if (pop != null && pop.isShowing()) {
  535. pop.dismiss();
  536. pop = null;
  537. }
  538. }
  539. //存储数据问题
  540. private void asyncUpload(){
  541. if (!getIsNetwork()){
  542. //无网络时在请求检查是否有网络
  543. return;
  544. }
  545. if (awaitUploadList==null || awaitUploadList.size()==0){
  546. RealmResults<AsyncUploadRealm> realmResults = mRealm.where(AsyncUploadRealm.class)
  547. .equalTo("isDelete",0)
  548. .equalTo("pushStatus",0)
  549. // .equalTo("notifyKey",fileKey)
  550. .equalTo("uploadType",uploadType)
  551. .sort("pushStatus").findAll();
  552. realmResults.load();
  553. awaitUploadList.addAll(realmResults);
  554. }
  555. if (awaitUploadList.size()>0){
  556. filedUpload(0);
  557. }
  558. }
  559. //取消任务
  560. public void taskCancel(){
  561. }
  562. public void setStartUpload(){
  563. allowUpload = true;
  564. asyncUpload();
  565. }
  566. public void setStopUpload(){
  567. if(ossService !=null){
  568. ossService.taskCancel();
  569. }
  570. allowUpload = false;
  571. EventBus.getDefault().post(new UploadProgressEvent(0));
  572. }
  573. private void addUploadFile(LocalMedia localMedia){
  574. String realmId = UUID.randomUUID().toString();
  575. String scan_date = DateUtil.getCurDateStr(DateUtil.FORMAT_YMDHMS);
  576. //同步操作写法一:
  577. mRealm.beginTransaction();
  578. //会创建对象和user表
  579. AsyncUploadRealm takePhotosRealm = mRealm.createObject(AsyncUploadRealm.class,realmId);
  580. Gson gson = new Gson();
  581. String localMediaStr = gson.toJson(localMedia);
  582. takePhotosRealm.setLocalMediaStr(localMediaStr);
  583. takePhotosRealm.setOssUrl("");
  584. takePhotosRealm.setScanDate(scan_date);
  585. takePhotosRealm.setUploadType(uploadType);
  586. takePhotosRealm.setNotifyKey(fileKey);
  587. takePhotosRealm.setNotifyParam(gson.toJson(notifyParam));
  588. takePhotosRealm.setNotifyUrl(notifyUrl);
  589. takePhotosRealm.setUniqueTag(uniqueTag);
  590. String path_prefix = resourcePrefix+"/android/"+mPrefix+"/"+RxTimeTool.getYestoryDate("yyyyMMd")+"/";
  591. String urlPath = isCompress && localMedia.getCompressPath()!=null ? localMedia.getCompressPath() : localMedia.getPath();
  592. String fileSuffix = urlPath.lastIndexOf(".")>-1 ? urlPath.substring(urlPath.lastIndexOf(".")) : "";
  593. String fileName = UUID.randomUUID().toString() + fileSuffix;
  594. takePhotosRealm.setOssUrl(path_prefix+fileName);
  595. ossPhotoList.add("/"+path_prefix+fileName);
  596. //
  597. Date date = new Date();
  598. takePhotosRealm.setCreateTime(date.getTime());
  599. takePhotosRealm.setPushStatus(0);
  600. //提交事务,操作就被执行
  601. mRealm.commitTransaction();
  602. }
  603. /**
  604. * 设置是否完成
  605. * @param realmId
  606. * @param isFinish
  607. */
  608. private void setIsFinish(String realmId,Integer isFinish){
  609. //更新值
  610. mRealm.beginTransaction();
  611. AsyncUploadRealm myObject = mRealm.where(AsyncUploadRealm.class).equalTo("id",realmId).findFirst();
  612. myObject.setIsFinish(isFinish);
  613. mRealm.commitTransaction();
  614. }
  615. /**
  616. * 上传结果
  617. * @param tmpRealmId String
  618. * @param status Integer
  619. * @param photoPath String
  620. */
  621. private void resultUpload(String tmpRealmId,Integer status,String photoPath){
  622. if (tmpRealmId!=null && !tmpRealmId.isEmpty()){
  623. int rePush = 0;
  624. //遍历删除
  625. if (awaitUploadList.size()>0){
  626. for (int i=0;i<awaitUploadList.size();i++){
  627. if (awaitUploadList.get(i).getId().equals(tmpRealmId)){
  628. rePush = awaitUploadList.get(i).getRePush();
  629. awaitUploadList.remove(i);
  630. break;
  631. }
  632. }
  633. }
  634. int pushStatus = 2;
  635. if (status==0){
  636. pushStatus = rePush>4 ? 1 : 0;
  637. }
  638. //更新值
  639. mRealm.beginTransaction();
  640. AsyncUploadRealm myObject = mRealm.where(AsyncUploadRealm.class).equalTo("id",tmpRealmId).findFirst();
  641. assert myObject != null;
  642. myObject.setPushStatus(pushStatus);
  643. if (pushStatus == 1){
  644. myObject.setIsFinish(pushStatus);
  645. }
  646. myObject.setOssUrl(photoPath);
  647. if (getIsNetwork() && status==0 ){
  648. myObject.setRePush(myObject.getRePush()+1);
  649. }
  650. mRealm.commitTransaction();
  651. }
  652. //可以允许上传
  653. if (allowUpload){
  654. //上传完,继续执行
  655. asyncUpload();
  656. }
  657. }
  658. //异步通知结果
  659. private void asyncNotify(AsyncUploadRealm myObject){
  660. try {
  661. JSONObject jsonObject = new JSONObject(myObject.getNotifyParam());
  662. jsonObject.put(myObject.getNotifyKey(),myObject.getOssUrl());
  663. jsonObject.put("realm_id",myObject.getId());
  664. jsonObject.put("unique_tag",myObject.getUniqueTag());
  665. final String tmpRealmId1 = myObject.getId();
  666. OkGo.<String>post(myObject.getNotifyUrl()).upJson(jsonObject)
  667. .execute(new MyDialogCallback(mContext, true, false) {
  668. @Override
  669. public void onSuccess(Response<String> response) {
  670. super.onSuccess(response);
  671. try {
  672. ActionBean bean = JsonUtil.getObject(response.body(), ActionBean.class);
  673. if(bean.code == 1){
  674. setIsFinish(tmpRealmId1,1);
  675. }
  676. } catch (Exception e) {
  677. e.printStackTrace();
  678. XLog.e("回传图片地址错误",e.getMessage());
  679. setIsFinish(tmpRealmId1,2);
  680. }
  681. }
  682. });
  683. } catch (Exception e) {
  684. e.printStackTrace();
  685. XLog.e("异步通知"+e.getMessage());
  686. }
  687. }
  688. /**
  689. * 获取当前网络
  690. * @return Boolean
  691. */
  692. private Boolean getIsNetwork(){
  693. boolean isNetwork = false;
  694. try {
  695. if (mActivity==null){
  696. return isNetwork;
  697. }
  698. ConnectivityManager connectivityManager = (ConnectivityManager) mActivity.getSystemService(Context.CONNECTIVITY_SERVICE);
  699. if (connectivityManager == null) {
  700. XLog.d( "无法获取ConnectivityManager实例");
  701. return isNetwork;
  702. }
  703. NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
  704. if (networkInfo != null) {
  705. XLog.d( "当前网络状态:" + networkInfo.getState());
  706. isNetwork = true;
  707. } else {
  708. XLog.d( "当前无网络连接");
  709. isNetwork = false;
  710. }
  711. } catch (Exception e) {
  712. e.printStackTrace();
  713. }
  714. return isNetwork;
  715. }
  716. }