">523
                .setCompressEngine(new ImageFileCompressEngine()) //设置压缩
524
                .setSandboxFileEngine(new MeSandboxFileEngine()) //设置相册沙盒目录拷贝引擎
525
                .setCameraInterceptListener(new MeOnCameraInterceptListener())
526
                .setSelectionMode(SelectModeConfig.SINGLE)
527
                .setMaxSelectNum(1)
528
                .isEmptyResultReturn(true) //支持未选择返回
529
                .setImageSpanCount(4)
530
                .isPageStrategy(true)   // 是否开启分页模式
531
                .isDisplayCamera(true) //是否显示相机入口
532
                .isPreviewFullScreenMode(true)//预览点击全屏效果
533
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
534
                .isEmptyResultReturn(true)//支持未选择返回
535
                .isWithSelectVideoImage(false)//是否支持视频图片同选
536
                .isSelectZoomAnim(true)// 选择缩略图缩放效果
537
                .isCameraAroundState(false)// 是否开启前置摄像头;系统相机 只支持部分机型
538
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
539
                .isGif(false)// 是否显示gif文件
540
                .isWebp(true)// 是否显示webp文件
541
                .isBmp(true)//是否显示bmp文件
542
                .setFilterMinFileSize(1) //过滤最小文件
543
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
544
                .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
545
                .isFastSlidingSelect(true) //快速滑动选择
546
                .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回
547
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
548
                .isPreviewImage(true)//是否预览图片
547 549
                .forResult(REQUEST_CODE_CHOOSE);
548 550
549 551
    }
@ -671,33 +673,30 @@ public class EditAnswerActivity extends AppCompatActivity implements View.OnClic
671 673
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics);
672 674
    }
673 675
674
    @Override
675
    public void onPermissionsGranted(int requestCode, List<String> perms) {
676
    }
677
678
    @Override
679
    public void onPermissionsDenied(int requestCode, List<String> perms) {
680
    }
681
682
    @AfterPermissionGranted(RC_ALBUM_PERM)
683 676
    public void permissionTask() {
684
        if (isPermissionOK()) {
685
            callGallery();
686
        } else {
687
            EasyPermissions.requestPermissions(
688
                    this, "充电桩想要获取您的图片读取权限,是否允许?",
689
                    RC_ALBUM_PERM,
690
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
691
                    Manifest.permission.READ_EXTERNAL_STORAGE,
692
                    Manifest.permission.CAMERA);
693
        }
694
    }
695
696
    private boolean isPermissionOK() {
697
        return EasyPermissions.hasPermissions(this,
698
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
699
                Manifest.permission.READ_EXTERNAL_STORAGE,
700
                Manifest.permission.CAMERA
701
        );
677
        String[] callPhone  =
678
                new String[]{READ_MEDIA_IMAGES, CAMERA};
679
        XXPermissions.with(this)
680
                // 申请单个权限
681
                .permission(callPhone)
682
                .request(new OnPermissionCallback() {
683
                    @Override
684
                    public void onGranted(List<String> permissions, boolean all) {
685
                        if (all) {
686
                            callGallery();
687
                        }else{
688
                            ToastUtil.showToast(getApplicationContext(), "获取部分权限成功,但部分权限未正常授予", Toast.LENGTH_SHORT);
689
                        }
690
                    }
691
                    @Override
692
                    public void onDenied(List<String> permissions, boolean never) {
693
                        if (never) {
694
                            // 如果是被永久拒绝就跳转到应用权限系统设置页面
695
                            XXPermissions.startPermissionActivity(EditAnswerActivity.this, permissions);
696
                        } else {
697
                            ToastUtil.showToast(getApplicationContext(), "获取权限失败", Toast.LENGTH_SHORT);
698
                        }
699
                    }
700
                });
702 701
    }
703 702
}

+ 73 - 69
app/src/main/java/com/electric/chargingpile/activity/EditQuestionTwoActivity.java

@ -14,6 +14,7 @@ import android.os.Handler;
14 14
15 15
import androidx.appcompat.app.AppCompatActivity;
16 16
17
import android.provider.MediaStore;
17 18
import android.util.Log;
18 19
import android.view.KeyEvent;
19 20
import android.view.View;
@ -31,9 +32,14 @@ import com.electric.chargingpile.application.MainApplication;
31 32
import com.electric.chargingpile.engine.GlideEngine;
32 33
import com.electric.chargingpile.util.AndroidBug5497Workaround;
33 34
import com.electric.chargingpile.util.BarColorUtil;
35
import com.electric.chargingpile.util.Bimp;
34 36
import com.electric.chargingpile.util.FileUtils;
37
import com.electric.chargingpile.util.ImageFileCompressEngine;
35 38
import com.electric.chargingpile.util.ImageUitl;
36 39
import com.electric.chargingpile.util.JsonUtils;
40
import com.electric.chargingpile.util.MeOnCameraInterceptListener;
41
import com.electric.chargingpile.util.MeSandboxFileEngine;
42
import com.electric.chargingpile.util.PictureUtlis;
37 43
import com.electric.chargingpile.util.ScreenUtils;
38 44
import com.electric.chargingpile.util.StringUtils;
39 45
import com.electric.chargingpile.util.ToastUtil;
@ -41,10 +47,15 @@ import com.electric.chargingpile.util.Util;
41 47
import com.electric.chargingpile.view.CarTypeDialog;
42 48
import com.electric.chargingpile.view.xrichtext.RichTextEditor;
43 49
import com.electric.chargingpile.view.xrichtext.SDCardUtil;
44
import com.luck.picture.lib.PictureSelector;
50
51
import com.hjq.permissions.OnPermissionCallback;
52
import com.hjq.permissions.XXPermissions;
45 53
import com.luck.picture.lib.animators.AnimationType;
54
import com.luck.picture.lib.basic.PictureSelector;
46 55
import com.luck.picture.lib.config.PictureConfig;
47 56
import com.luck.picture.lib.config.PictureMimeType;
57
import com.luck.picture.lib.config.SelectMimeType;
58
import com.luck.picture.lib.config.SelectModeConfig;
48 59
import com.luck.picture.lib.entity.LocalMedia;
49 60
import com.umeng.analytics.MobclickAgent;
50 61
@ -73,8 +84,10 @@ import top.zibin.luban.Luban;
73 84
import top.zibin.luban.OnCompressListener;
74 85
75 86
import static com.electric.chargingpile.activity.EditAnswerActivity.dpToPx;
76
77
public class EditQuestionTwoActivity extends AppCompatActivity implements View.OnClickListener, EasyPermissions.PermissionCallbacks {
87
import static com.hjq.permissions.Permission.CAMERA;
88
import static com.hjq.permissions.Permission.READ_MEDIA_IMAGES;
89
@Deprecated
90
public class EditQuestionTwoActivity extends AppCompatActivity implements View.OnClickListener {
78 91
    private static final String TAG = "EditQuestionTwoActivity";
79 92
    private TextView tv_submit, tv_back, tv_point;
80 93
    private RichTextEditor et_new_content;
@ -358,7 +371,7 @@ public class EditQuestionTwoActivity extends AppCompatActivity implements View.O
358 371
359 372
                try {
360 373
                    et_new_content.measure(0, 0);
361
                    List<LocalMedia> selectionData= PictureSelector.obtainMultipleResult(data);
374
                    List<LocalMedia> selectionData= PictureSelector.obtainSelectorList(data);
362 375
                    if (selectionData!=null && selectionData.size()>0) {
363 376
                        LocalMedia media = selectionData.get(0);
364 377
                        /*List<Uri> uriList = Matisse.obtainResult(data);
@ -369,12 +382,7 @@ public class EditQuestionTwoActivity extends AppCompatActivity implements View.O
369 382
                        bitmap = FileUtils.rotateIfRequired(file, bitmap);
370 383
                        bitmap = imageZoom(bitmap);
371 384
                        insertBitmap = bitmap;*/
372
                        String path="";
373
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
374
                            path= media.getAndroidQToPath();
375
                        }else{
376
                            path=media.getPath();
377
                        }
385
                        String path = Util.getCompressAbsolutePath(media);
378 386
                        insertBitmap = imageZoom(BitmapFactory.decodeFile(path));
379 387
380 388
                        u_path = path;
@ -433,14 +441,14 @@ public class EditQuestionTwoActivity extends AppCompatActivity implements View.O
433 441
            }
434 442
435 443
            @Override
436
            public void onSuccess(File file) {
444
            public void onSuccess(int index, File compressFile) {
437 445
                Log.e(TAG, "onSuccess: path= " + file.getPath());
438 446
                Log.e(TAG, "onSuccess: length= " + file.length() / 1024 + "kb");
439 447
                uploadPic(file.getPath(), u_path);
440 448
            }
441 449
442 450
            @Override
443
            public void onError(Throwable e) {
451
            public void onError(int index, Throwable e) {
444 452
                Log.e(TAG, "onError: " + e.getMessage());
445 453
            }
446 454
        }).launch();
@ -550,37 +558,37 @@ public class EditQuestionTwoActivity extends AppCompatActivity implements View.O
550 558
     * 调用图库选择
551 559
     */
552 560
    private void callGallery() {
553
//        Matisse.from(EditQuestionTwoActivity.this)
554
//                .choose(MimeType.of(MimeType.JPEG, MimeType.PNG, MimeType.GIF))
555
//                .showSingleMediaType(true)
556
//                .countable(true)
557
//                .maxSelectable(1)
558
//                .capture(true)
559
//                .captureStrategy(new CaptureStrategy(true, "com.electric.chargingpile.provider"))
560
//                .imageEngine(new GlideEngine())
561
//                .forResult(REQUEST_CODE_CHOOSE);
562
563 561
        PictureSelector.create(this)
564
                .openGallery(PictureMimeType.ofImage())
565
                .maxSelectNum(1)
566
                .selectionMode(PictureConfig.SINGLE)
567
                .isSingleDirectReturn(true)
568
                .isCompress(true)//是否压缩
569
                .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
570
                .isGif(true)//是否显示gif
571
                .isAndroidQTransform(true)
572
                .imageEngine(GlideEngine.createGlideEngine())
573
                .isWeChatStyle(false)// 是否开启微信图片选择风格
574
                .isUseCustomCamera(false)// 是否使用自定义相机
575
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
576
                .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
577
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
578
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
579
                .imageSpanCount(4)// 每行显示个数
580
                .isReturnEmpty(false)// 选择数据时点击按钮是否可以返回
581
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
562
                .openGallery(SelectMimeType.ofImage())
563
                .setSelectorUIStyle(PictureUtlis.getStyle())
564
                .setImageEngine(GlideEngine.createGlideEngine())
565
                .setCompressEngine(new ImageFileCompressEngine()) //设置压缩
566
                .setSandboxFileEngine(new MeSandboxFileEngine()) //设置相册沙盒目录拷贝引擎
567
                .setCameraInterceptListener(new MeOnCameraInterceptListener())
568
                .setSelectionMode(SelectModeConfig.SINGLE)
569
                .setMaxSelectNum(1)
570
                .isEmptyResultReturn(true) //支持未选择返回
571
                .setImageSpanCount(4)
572
                .isPageStrategy(true)   // 是否开启分页模式
573
                .isDisplayCamera(true) //是否显示相机入口
574
                .isPreviewFullScreenMode(true)//预览点击全屏效果
575
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
576
                .isEmptyResultReturn(true)//支持未选择返回
577
                .isWithSelectVideoImage(false)//是否支持视频图片同选
578
                .isSelectZoomAnim(true)// 选择缩略图缩放效果
579
                .isCameraAroundState(false)// 是否开启前置摄像头;系统相机 只支持部分机型
580
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
581
                .isGif(false)// 是否显示gif文件
582
                .isWebp(true)// 是否显示webp文件
583
                .isBmp(true)//是否显示bmp文件
584
                .setFilterMinFileSize(1) //过滤最小文件
585
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
586
                .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
587
                .isFastSlidingSelect(true) //快速滑动选择
588
                .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回
589
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
590
                .isPreviewImage(true)//是否预览图片
582 591
                .forResult(REQUEST_CODE_CHOOSE);
583
584 592
    }
585 593
586 594
    @Override
@ -728,36 +736,32 @@ public class EditQuestionTwoActivity extends AppCompatActivity implements View.O
728 736
        MobclickAgent.onResume(this);
729 737
    }
730 738
731
    @Override
732
    public void onPermissionsGranted(int requestCode, List<String> perms) {
733
734
    }
735
736
    @Override
737
    public void onPermissionsDenied(int requestCode, List<String> perms) {
738
739
    }
740 739
741 740
    @AfterPermissionGranted(RC_ALBUM_PERM)
742 741
    public void permissionTask() {
743
        if (isPermissionOK()) {
744
            callGallery();
745
        } else {
746
            EasyPermissions.requestPermissions(
747
                    this, "充电桩想要获取您的图片读取权限,是否允许?",
748
                    RC_ALBUM_PERM,
749
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
750
                    Manifest.permission.READ_EXTERNAL_STORAGE,
751
                    Manifest.permission.CAMERA
752
            );
753
        }
754
    }
755
756
    private boolean isPermissionOK() {
757
        return EasyPermissions.hasPermissions(this,
758
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
759
                Manifest.permission.READ_EXTERNAL_STORAGE,
760
                Manifest.permission.CAMERA
761
        );
742
        String[] callPhone  =
743
                new String[]{READ_MEDIA_IMAGES, CAMERA};
744
        XXPermissions.with(this)
745
                // 申请单个权限
746
                .permission(callPhone)
747
                .request(new OnPermissionCallback() {
748
                    @Override
749
                    public void onGranted(List<String> permissions, boolean all) {
750
                        if (all) {
751
                            callGallery();
752
                        }else{
753
                            ToastUtil.showToast(getApplicationContext(), "获取部分权限成功,但部分权限未正常授予", Toast.LENGTH_SHORT);
754
                        }
755
                    }
756
                    @Override
757
                    public void onDenied(List<String> permissions, boolean never) {
758
                        if (never) {
759
                            // 如果是被永久拒绝就跳转到应用权限系统设置页面
760
                            XXPermissions.startPermissionActivity(EditQuestionTwoActivity.this, permissions);
761
                        } else {
762
                            ToastUtil.showToast(getApplicationContext(), "获取权限失败", Toast.LENGTH_SHORT);
763
                        }
764
                    }
765
                });
762 766
    }
763 767
}

+ 70 - 69
app/src/main/java/com/electric/chargingpile/activity/FeedbackActivity.java

@ -1,5 +1,8 @@
1 1
package com.electric.chargingpile.activity;
2 2

3
import static com.hjq.permissions.Permission.CAMERA;
4
import static com.hjq.permissions.Permission.READ_MEDIA_IMAGES;
5

3 6
import android.Manifest;
4 7
import android.app.Activity;
5 8
import android.app.ProgressDialog;
@ -21,6 +24,7 @@ import android.os.Bundle;
21 24
import android.os.Handler;
22 25
import android.os.Message;
23 26

27
import android.provider.MediaStore;
24 28
import android.text.Editable;
25 29
import android.text.TextWatcher;
26 30
import android.util.Base64;
@ -50,18 +54,27 @@ import com.electric.chargingpile.engine.GlideEngine;
50 54
import com.electric.chargingpile.util.BarColorUtil;
51 55
import com.electric.chargingpile.util.Bimp;
52 56
import com.electric.chargingpile.util.FileUtils;
57
import com.electric.chargingpile.util.ImageFileCompressEngine;
53 58
import com.electric.chargingpile.util.ImageItem;
54 59
import com.electric.chargingpile.util.JsonUtils;
55 60
import com.electric.chargingpile.util.LoadingDialog;
61
import com.electric.chargingpile.util.MeOnCameraInterceptListener;
62
import com.electric.chargingpile.util.MeSandboxFileEngine;
63
import com.electric.chargingpile.util.PictureUtlis;
56 64
import com.electric.chargingpile.util.PublicWay;
57 65
import com.electric.chargingpile.util.Res;
58 66
import com.electric.chargingpile.util.ToastUtil;
59 67
import com.electric.chargingpile.util.UploadUtil;
60 68
import com.electric.chargingpile.util.Util;
61
import com.luck.picture.lib.PictureSelector;
69

70
import com.hjq.permissions.OnPermissionCallback;
71
import com.hjq.permissions.XXPermissions;
62 72
import com.luck.picture.lib.animators.AnimationType;
73
import com.luck.picture.lib.basic.PictureSelector;
63 74
import com.luck.picture.lib.config.PictureConfig;
64 75
import com.luck.picture.lib.config.PictureMimeType;
76
import com.luck.picture.lib.config.SelectMimeType;
77
import com.luck.picture.lib.config.SelectModeConfig;
65 78
import com.luck.picture.lib.entity.LocalMedia;
66 79
import com.umeng.analytics.MobclickAgent;
67 80

@ -88,7 +101,7 @@ import okhttp3.Call;
88 101
import pub.devrel.easypermissions.AfterPermissionGranted;
89 102
import pub.devrel.easypermissions.EasyPermissions;
90 103

91
public class FeedbackActivity extends Activity implements OnClickListener, EasyPermissions.PermissionCallbacks {
104
public class FeedbackActivity extends Activity implements OnClickListener{
92 105
    private static final String TAG = "FeedbackActivity";
93 106
    private static final int PIC_NUM = 3;
94 107
    private ImageView ivBack;
@ -299,40 +312,37 @@ public class FeedbackActivity extends Activity implements OnClickListener, EasyP
299 312
     * 调用图库选择
300 313
     */
301 314
    private void callGallery() {
302
/*
303
        Matisse.from(FeedbackActivity.this)
304
                .choose(MimeType.of(MimeType.JPEG, MimeType.PNG, MimeType.GIF))
305
                .showSingleMediaType(true)
306
                .countable(true)
307
                .maxSelectable(PIC_NUM - Bimp.tempSelectBitmap.size())
308
                .capture(true)
309
                .captureStrategy(new CaptureStrategy(true, "com.electric.chargingpile.provider"))
310
                .imageEngine(new GlideEngine())
311
                .forResult(REQUEST_CODE_CHOOSE);
312
*/
313

314 315
        PictureSelector.create(this)
315
                .openGallery(PictureMimeType.ofImage())
316
                .maxSelectNum(PIC_NUM)
317
                .selectionMode(PictureConfig.MULTIPLE)
318
                .selectionData(mSelectionData)//是否传入已选图片
319
                .isCompress(true)//是否压缩
320
                .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
321
                .isGif(true)//是否显示gif
322
                .isAndroidQTransform(true)
323
                .imageEngine(GlideEngine.createGlideEngine())
324
                .isWeChatStyle(false)// 是否开启微信图片选择风格
325
                .isUseCustomCamera(false)// 是否使用自定义相机
326
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
327
                .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
328
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
329
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
330
                .imageSpanCount(4)// 每行显示个数
331
                .isReturnEmpty(false)// 选择数据时点击按钮是否可以返回
332
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
316
                .openGallery(SelectMimeType.ofImage())
317
                .setSelectorUIStyle(PictureUtlis.getStyle())
318
                .setImageEngine(GlideEngine.createGlideEngine())
319
                .setCompressEngine(new ImageFileCompressEngine()) //设置压缩
320
                .setSandboxFileEngine(new MeSandboxFileEngine()) //设置相册沙盒目录拷贝引擎
321
                .setCameraInterceptListener(new MeOnCameraInterceptListener())
322
                .setSelectionMode(SelectModeConfig.SINGLE)
323
                .setMaxSelectNum(1)
324
                .isEmptyResultReturn(true) //支持未选择返回
325
                .setImageSpanCount(4)
326
                .isPageStrategy(true)   // 是否开启分页模式
327
                .isDisplayCamera(true) //是否显示相机入口
328
                .isPreviewFullScreenMode(true)//预览点击全屏效果
329
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
330
                .isEmptyResultReturn(true)//支持未选择返回
331
                .isWithSelectVideoImage(false)//是否支持视频图片同选
332
                .isSelectZoomAnim(true)// 选择缩略图缩放效果
333
                .isCameraAroundState(false)// 是否开启前置摄像头;系统相机 只支持部分机型
334
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
335
                .isGif(false)// 是否显示gif文件
336
                .isWebp(true)// 是否显示webp文件
337
                .isBmp(true)//是否显示bmp文件
338
                .setFilterMinFileSize(1) //过滤最小文件
339
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
340
                .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
341
                .isFastSlidingSelect(true) //快速滑动选择
342
                .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回
343
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
344
                .isPreviewImage(true)//是否预览图片
333 345
                .forResult(REQUEST_CODE_CHOOSE);
334

335

336 346
    }
337 347

338 348
    @Override
@ -363,19 +373,14 @@ public class FeedbackActivity extends Activity implements OnClickListener, EasyP
363 373

364 374
                try {
365 375
//                    List<Uri> uriList = Matisse.obtainResult(data);
366
                    mSelectionData = PictureSelector.obtainMultipleResult(data);
376
                    mSelectionData = PictureSelector.obtainSelectorList(data);
367 377
                    for (LocalMedia media: mSelectionData) {
368 378
//                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
369 379
//                        File file = FileUtils.from(FeedbackActivity.this, uri);
370 380
//
371 381
//                        bitmap = FileUtils.rotateIfRequired(file, bitmap);
372 382
//                        bitmap = imageZoom(bitmap);
373
                        String path="";
374
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
375
                            path= media.getAndroidQToPath();
376
                        }else{
377
                            path=media.getPath();
378
                        }
383
                        String path = Util.getCompressAbsolutePath(media);
379 384
                        ImageItem takePhoto = new ImageItem();
380 385
                        takePhoto.setBitmap(imageZoom(BitmapFactory.decodeFile(path)));
381 386
                        Bimp.tempSelectBitmap.add(takePhoto);
@ -726,36 +731,32 @@ public class FeedbackActivity extends Activity implements OnClickListener, EasyP
726 731
                && (codePoint <= 0x10FFFF));
727 732
    }
728 733

729
    @Override
730
    public void onPermissionsGranted(int requestCode, List<String> perms) {
731

732
    }
733 734

734
    @Override
735
    public void onPermissionsDenied(int requestCode, List<String> perms) {
736

737
    }
738 735

739
    @AfterPermissionGranted(RC_ALBUM_PERM)
740 736
    public void permissionTask() {
741
        if (isPermissionOK()) {
742
            callGallery();
743
        } else {
744
            EasyPermissions.requestPermissions(
745
                    this, "充电桩想要获取您的图片读取权限,是否允许?",
746
                    RC_ALBUM_PERM,
747
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
748
                    Manifest.permission.READ_EXTERNAL_STORAGE,
749
                    Manifest.permission.CAMERA);
750
        }
751
    }
752

753
    private boolean isPermissionOK() {
754
        return EasyPermissions.hasPermissions(this,
755
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
756
                Manifest.permission.READ_EXTERNAL_STORAGE,
757
                Manifest.permission.CAMERA
758
        );
737
        String[] callPhone  =
738
                new String[]{READ_MEDIA_IMAGES, CAMERA};
739
        XXPermissions.with(this)
740
                // 申请单个权限
741
                .permission(callPhone)
742
                .request(new OnPermissionCallback() {
743
                    @Override
744
                    public void onGranted(List<String> permissions, boolean all) {
745
                        if (all) {
746
                            callGallery();
747
                        }else{
748
                            ToastUtil.showToast(getApplicationContext(), "获取部分权限成功,但部分权限未正常授予", Toast.LENGTH_SHORT);
749
                        }
750
                    }
751
                    @Override
752
                    public void onDenied(List<String> permissions, boolean never) {
753
                        if (never) {
754
                            // 如果是被永久拒绝就跳转到应用权限系统设置页面
755
                            XXPermissions.startPermissionActivity(FeedbackActivity.this, permissions);
756
                        } else {
757
                            ToastUtil.showToast(getApplicationContext(), "获取权限失败", Toast.LENGTH_SHORT);
758
                        }
759
                    }
760
                });
759 761
    }
760

761 762
}

+ 2 - 2
app/src/main/java/com/electric/chargingpile/activity/GalleryActivityFeedback.java

@ -27,7 +27,7 @@ import java.io.ByteArrayInputStream;
27 27
import java.io.ByteArrayOutputStream;
28 28
import java.util.ArrayList;
29 29
import java.util.List;
30
30
@Deprecated
31 31
public class GalleryActivityFeedback extends Activity {
32 32
    private Intent intent;
33 33
    // 返回按钮
@ -161,7 +161,7 @@ public class GalleryActivityFeedback extends Activity {
161 161
            MobclickAgent.onEvent(getApplicationContext(), "1028");
162 162
            finish();
163 163
            if (!TextUtils.isEmpty(type) && "1".equals(type)) {
164
                intent.setClass(GalleryActivityFeedback.this, PublishPicTopicActivity.class);
164
//                intent.setClass(GalleryActivityFeedback.this, PublishPicTopicActivity.class);
165 165
            } else {
166 166
                intent.setClass(GalleryActivityFeedback.this, FeedbackActivity.class);
167 167
            }

+ 2 - 1
app/src/main/java/com/electric/chargingpile/activity/ImageDisplayActivity.java

@ -22,6 +22,7 @@ import com.electric.chargingpile.util.Bimp;
22 22
import com.electric.chargingpile.util.PublicWayFour;
23 23
import com.electric.chargingpile.util.PublicWayONE;
24 24
import com.electric.chargingpile.util.Res;
25
import com.electric.chargingpile.util.Util;
25 26
import com.electric.chargingpile.widge.photoview.PhotoView;
26 27
import com.electric.chargingpile.widge.photoview.ZoomingViewpager;
27 28
import com.luck.picture.lib.entity.LocalMedia;
@ -117,7 +118,7 @@ public class ImageDisplayActivity extends AppCompatActivity implements View.OnCl
117 118
        for (LocalMedia media:list){
118 119
            PhotoView img = new PhotoView(this);
119 120
            img.setBackgroundColor(0xffffffff);
120
            String path = TextUtils.isEmpty(media.getAndroidQToPath()) ? media.getPath() : media.getAndroidQToPath();
121
            String path = Util.getCompressAbsolutePath(media);
121 122
            Glide.with(this)
122 123
                    .load(path)
123 124
                    .into(img);

+ 71 - 77
app/src/main/java/com/electric/chargingpile/activity/PrivateZhuangInfoActivity.java

@ -1,5 +1,8 @@
1 1
package com.electric.chargingpile.activity;
2 2
3
import static com.hjq.permissions.Permission.CAMERA;
4
import static com.hjq.permissions.Permission.READ_MEDIA_IMAGES;
5
3 6
import android.Manifest;
4 7
import android.app.Activity;
5 8
import android.app.ProgressDialog;
@ -15,6 +18,7 @@ import android.os.Build;
15 18
import android.os.Bundle;
16 19
import android.os.Handler;
17 20
import android.os.Message;
21
import android.provider.MediaStore;
18 22
import android.util.Base64;
19 23
import android.util.Log;
20 24
import android.view.Gravity;
@ -57,19 +61,28 @@ import com.electric.chargingpile.util.BarColorUtil;
57 61
import com.electric.chargingpile.util.Bimp;
58 62
import com.electric.chargingpile.util.CheckMobileNum;
59 63
import com.electric.chargingpile.util.DensityUtil;
64
import com.electric.chargingpile.util.ImageFileCompressEngine;
60 65
import com.electric.chargingpile.util.ImageItem;
61 66
import com.electric.chargingpile.util.JsonUtils;
67
import com.electric.chargingpile.util.MeOnCameraInterceptListener;
68
import com.electric.chargingpile.util.MeSandboxFileEngine;
62 69
import com.electric.chargingpile.util.OkHttpUtil;
70
import com.electric.chargingpile.util.PictureUtlis;
63 71
import com.electric.chargingpile.util.PublicWay;
64 72
import com.electric.chargingpile.util.Res;
65 73
import com.electric.chargingpile.util.ToastUtil;
66 74
import com.electric.chargingpile.util.UploadUtil;
67 75
import com.electric.chargingpile.util.Util;
68 76
import com.electric.chargingpile.view.CustomProgressDialog;
69
import com.luck.picture.lib.PictureSelector;
77
78
import com.hjq.permissions.OnPermissionCallback;
79
import com.hjq.permissions.XXPermissions;
70 80
import com.luck.picture.lib.animators.AnimationType;
81
import com.luck.picture.lib.basic.PictureSelector;
71 82
import com.luck.picture.lib.config.PictureConfig;
72 83
import com.luck.picture.lib.config.PictureMimeType;
84
import com.luck.picture.lib.config.SelectMimeType;
85
import com.luck.picture.lib.config.SelectModeConfig;
73 86
import com.luck.picture.lib.entity.LocalMedia;
74 87
import com.squareup.okhttp.Request;
75 88
import com.squareup.okhttp.Response;
@ -104,7 +117,7 @@ import pub.devrel.easypermissions.AfterPermissionGranted;
104 117
import pub.devrel.easypermissions.EasyPermissions;
105 118
106 119
107
public class PrivateZhuangInfoActivity extends Activity implements View.OnClickListener, EasyPermissions.PermissionCallbacks {
120
public class PrivateZhuangInfoActivity extends Activity implements View.OnClickListener{
108 121
    private static final String TAG = "PrivateZhuangInfoActivi";
109 122
    private static final int PIC_NUM = 3;
110 123
    private ImageView ivBack, ivType;
@ -323,35 +336,36 @@ public class PrivateZhuangInfoActivity extends Activity implements View.OnClickL
323 336
     * 调用图库选择
324 337
     */
325 338
    private void callGallery() {
326
/*
327
        Matisse.from(PrivateZhuangInfoActivity.this)
328
                .choose(MimeType.of(MimeType.JPEG, MimeType.PNG, MimeType.GIF))
329
                .showSingleMediaType(true)
330
                .countable(true)
331
                .maxSelectable(1)
332
                .capture(true)
333
                .captureStrategy(new CaptureStrategy(true, "com.electric.chargingpile.provider"))
334
                .imageEngine(new GlideEngine())
335
                .forResult(REQUEST_CODE_CHOOSE);
336
*/
337 339
        PictureSelector.create(this)
338
                .openGallery(PictureMimeType.ofImage())
339
                .selectionMode(PictureConfig.SINGLE)
340
                .isSingleDirectReturn(true)
341
                .isCompress(true)//是否压缩
342
                .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
343
                .isGif(true)//是否显示gif
344
                .isAndroidQTransform(true)
345
                .imageEngine(GlideEngine.createGlideEngine())
346
                .isWeChatStyle(false)// 是否开启微信图片选择风格
347
                .isUseCustomCamera(false)// 是否使用自定义相机
348
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
349
                .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
350
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
351
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
352
                .imageSpanCount(4)// 每行显示个数
353
                .isReturnEmpty(false)// 未选择数据时点击按钮是否可以返回
354
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
340
                .openGallery(SelectMimeType.ofImage())
341
                .setSelectorUIStyle(PictureUtlis.getStyle())
342
                .setImageEngine(GlideEngine.createGlideEngine())
343
                .setCompressEngine(new ImageFileCompressEngine()) //设置压缩
344
                .setSandboxFileEngine(new MeSandboxFileEngine()) //设置相册沙盒目录拷贝引擎
345
                .setCameraInterceptListener(new MeOnCameraInterceptListener())
346
                .setSelectionMode(SelectModeConfig.SINGLE)
347
                .setMaxSelectNum(1)
348
                .isEmptyResultReturn(true) //支持未选择返回
349
                .setImageSpanCount(4)
350
                .isPageStrategy(true)   // 是否开启分页模式
351
                .isDisplayCamera(true) //是否显示相机入口
352
                .isPreviewFullScreenMode(true)//预览点击全屏效果
353
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
354
                .setFilterMinFileSize(1) //过滤最小文件
355
                .isEmptyResultReturn(true)//支持未选择返回
356
                .isWithSelectVideoImage(false)//是否支持视频图片同选
357
                .isSelectZoomAnim(true)// 选择缩略图缩放效果
358
                .isCameraAroundState(false)// 是否开启前置摄像头;系统相机 只支持部分机型
359
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
360
                .isGif(false)// 是否显示gif文件
361
                .isWebp(true)// 是否显示webp文件
362
                .isBmp(true)//是否显示bmp文件
363
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
364
                .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
365
                .isFastSlidingSelect(true) //快速滑动选择
366
                .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回
367
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
368
                .isPreviewImage(true)//是否预览图片
355 369
                .forResult(REQUEST_CODE_CHOOSE);
356 370
357 371
    }
@ -389,22 +403,10 @@ public class PrivateZhuangInfoActivity extends Activity implements View.OnClickL
389 403
            @Override
390 404
            public void subscribe(ObservableEmitter<String> subscriber) {
391 405
                try {
392
                    List<LocalMedia> mediaList = PictureSelector.obtainMultipleResult(data);
406
                    List<LocalMedia> mediaList = PictureSelector.obtainSelectorList(data);
393 407
                    if (mediaList!=null && mediaList.size()>0){
394
                     /*   List<Uri> uriList = Matisse.obtainResult(data);
395
                        Uri uri = uriList.get(0);
396
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
397
                        File file = FileUtils.from(PrivateZhuangInfoActivity.this, uri);
398
399
                        bitmap = FileUtils.rotateIfRequired(file, bitmap);
400
                        bitmap = imageZoom(bitmap);*/
401 408
402
                        String path="";
403
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
404
                            path= mediaList.get(0).getAndroidQToPath();
405
                        }else{
406
                            path=mediaList.get(0).getPath();
407
                        }
409
                        String path = Util.getCompressAbsolutePath(mediaList.get(0));
408 410
                        ImageItem takePhoto = new ImageItem();
409 411
                        takePhoto.setBitmap(imageZoom(BitmapFactory.decodeFile(path)));
410 412
                        selectBitmap[selectIndex] = takePhoto;
@ -1014,44 +1016,36 @@ public class PrivateZhuangInfoActivity extends Activity implements View.OnClickL
1014 1016
        }
1015 1017
    }
1016 1018
1017
    @Override
1018
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
1019
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
1020
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
1021
    }
1022
1023
    @Override
1024
    public void onPermissionsGranted(int requestCode, List<String> perms) {
1025
1026
    }
1019
    public void permissionTask() {
1027 1020
1028
    @Override
1029
    public void onPermissionsDenied(int requestCode, List<String> perms) {
1021
        String[] callPhone  =
1022
                new String[]{READ_MEDIA_IMAGES, CAMERA};
1023
        XXPermissions.with(this)
1024
                // 申请单个权限
1025
                .permission(callPhone)
1026
                .request(new OnPermissionCallback() {
1027
                    @Override
1028
                    public void onGranted(List<String> permissions, boolean all) {
1029
                        if (all) {
1030
                            callGallery();
1031
                        }else{
1032
                            ToastUtil.showToast(getApplicationContext(), "获取部分权限成功,但部分权限未正常授予", Toast.LENGTH_SHORT);
1033
                        }
1034
                    }
1035
                    @Override
1036
                    public void onDenied(List<String> permissions, boolean never) {
1037
                        if (never) {
1038
                            // 如果是被永久拒绝就跳转到应用权限系统设置页面
1039
                            XXPermissions.startPermissionActivity(PrivateZhuangInfoActivity.this, permissions);
1040
                        } else {
1041
                            ToastUtil.showToast(getApplicationContext(), "获取权限失败", Toast.LENGTH_SHORT);
1042
                        }
1043
                    }
1044
                });
1030 1045
1031 1046
    }
1032 1047
1033
    @AfterPermissionGranted(RC_ALBUM_PERM)
1034
    public void permissionTask() {
1035
        if (isPermissionOK()) {
1036
            callGallery();
1037
        } else {
1038
            EasyPermissions.requestPermissions(
1039
                    this, "充电桩想要获取您的图片读取权限,是否允许?",
1040
                    RC_ALBUM_PERM,
1041
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
1042
                    Manifest.permission.READ_EXTERNAL_STORAGE,
1043
                    Manifest.permission.CAMERA
1044
            );
1045
        }
1046
    }
1047 1048
1048
    private boolean isPermissionOK() {
1049
        return EasyPermissions.hasPermissions(this,
1050
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
1051
                Manifest.permission.READ_EXTERNAL_STORAGE,
1052
                Manifest.permission.CAMERA
1053
        );
1054
    }
1055 1049
1056 1050
    public String getString(String s) {
1057 1051
        String path = null;

+ 0 - 185
app/src/main/java/com/electric/chargingpile/activity/PublishItemsActivity.java

@ -1,185 +0,0 @@
1
package com.electric.chargingpile.activity;
2
3
import android.app.AlertDialog;
4
import android.content.DialogInterface;
5
import android.content.Intent;
6
import android.os.Bundle;
7
import androidx.appcompat.app.AppCompatActivity;
8
import android.text.TextUtils;
9
import android.view.View;
10
import android.widget.ImageView;
11
import android.widget.LinearLayout;
12
import android.widget.RelativeLayout;
13
import android.widget.TextView;
14
15
import com.electric.chargingpile.R;
16
import com.electric.chargingpile.application.MainApplication;
17
import com.electric.chargingpile.data.PublishItemSerializable;
18
import com.electric.chargingpile.manager.ProfileManager;
19
import com.electric.chargingpile.util.BarColorUtil;
20
import com.umeng.analytics.MobclickAgent;
21
22
/**
23
 * @author dxh
24
 * 发布类型选择页
25
 * 已废弃,不在维护。
26
 */
27
@Deprecated
28
public class PublishItemsActivity extends AppCompatActivity implements View.OnClickListener {
29
    private static final String TAG = "PublishItemsActivity";
30
31
    public static final String FROM_CHAT_HOME = "from_chat_home";
32
    public static final String FROM_TOPIC_DETAIL = "from_topic_detail";
33
34
    private RelativeLayout mBottomView;
35
    private TextView mRulePublish;
36
    private ImageView mSharePublishClose;
37
    private LinearLayout mPublishPicture;
38
    private LinearLayout mPublishVideo;
39
    private LinearLayout mPublishQa;
40
    private ImageView mShareScanIcon;
41
    private ImageView publish_radio;
42
    private boolean publishRadioSelected = false;
43
    private PublishItemSerializable intentData;
44
45
    @Override
46
    protected void onCreate(Bundle savedInstanceState) {
47
        super.onCreate(savedInstanceState);
48
        setContentView(R.layout.activity_publish_items);
49
        BarColorUtil.initStatusBarColor(PublishItemsActivity.this);
50
        initView();
51
    }
52
53
    private void initView() {
54
        intentData = (PublishItemSerializable) getIntent().getSerializableExtra("intent_data");
55
56
        mBottomView = (RelativeLayout) findViewById(R.id.bottom_view);
57
        mRulePublish = (TextView) findViewById(R.id.rule_publish);
58
        mSharePublishClose = (ImageView) findViewById(R.id.share_publish_close);
59
        mPublishPicture = (LinearLayout) findViewById(R.id.publish_picture);
60
        mPublishVideo = (LinearLayout) findViewById(R.id.publish_video);
61
        mPublishQa = (LinearLayout) findViewById(R.id.publish_qa);
62
63
        if (intentData.getFrom().equals(FROM_TOPIC_DETAIL)) {
64
            mPublishQa.setVisibility(View.GONE);
65
        }
66
67
        mShareScanIcon = (ImageView) findViewById(R.id.share_scan_icon);
68
        publish_radio = findViewById(R.id.publish_radio);
69
70
        mSharePublishClose.setOnClickListener(this);
71
        mPublishPicture.setOnClickListener(this);
72
        mRulePublish.setOnClickListener(this);
73
        mPublishVideo.setOnClickListener(this);
74
        mPublishQa.setOnClickListener(this);
75
        publish_radio.setOnClickListener(this);
76
        findViewById(R.id.iv_back).setOnClickListener(this);
77
78
        String isFirstClick = ProfileManager.getInstance().getClickedUserPublishRole(getApplicationContext());
79
        if (TextUtils.isEmpty(isFirstClick)) {
80
            publish_radio.setImageDrawable(getResources().getDrawable(R.drawable.radio_unselected));
81
            publishRadioSelected = false;
82
        } else {
83
            publish_radio.setImageDrawable(getResources().getDrawable(R.drawable.radio_selected));
84
            publishRadioSelected = true;
85
        }
86
    }
87
88
    @Override
89
    public void onClick(View v) {
90
        Intent intent = new Intent();
91
        switch (v.getId()) {
92
            case R.id.publish_qa: // 提问
93
                if (checkPublishRadio()) {
94
                    MobclickAgent.onEvent(this.getApplicationContext(), "1039");
95
                    intent.setClass(this, EditQuestionOneActivity.class);
96
                    startActivity(intent);
97
                }
98
                break;
99
            case R.id.publish_picture: // 图文
100
                if (checkPublishRadio()) {
101
                    if (FROM_TOPIC_DETAIL.equals(intentData.getFrom())) {
102
                        MobclickAgent.onEvent(getApplicationContext(), "1043");
103
                    } else {
104
                        MobclickAgent.onEvent(getApplicationContext(), "1038");
105
                    }
106
                    intent.setClass(this, PublishPicTopicActivity.class);
107
                    intent.putExtra("intent_data", intentData);
108
                    startActivity(intent);
109
                }
110
                break;
111
            case R.id.publish_video: // 视频
112
                if (checkPublishRadio()) {
113
                    if (FROM_TOPIC_DETAIL.equals(intentData.getFrom())) {
114
                        MobclickAgent.onEvent(getApplicationContext(), "1042");
115
                    } else {
116
                        MobclickAgent.onEvent(getApplicationContext(), "1005");
117
                    }
118
                    intent.setClass(this, PublishVideoTopicActivity.class);
119
                    intent.putExtra("intent_data", intentData);
120
                    startActivity(intent);
121
                }
122
                break;
123
            case R.id.rule_publish: // 用户发布内容规则
124
                intent.setClass(this, MyWebViewActivity.class).putExtra("url", MainApplication.urlNew + "/topic/rule.do");
125
                startActivity(intent);
126
                break;
127
            case R.id.share_publish_close:
128
                backOperate();
129
                break;
130
            case R.id.iv_back:
131
                backOperate();
132
                break;
133
            case R.id.publish_radio: // 用户发布内容规则radio
134
                publishRadioClick();
135
                break;
136
            default:
137
                break;
138
        }
139
    }
140
141
    private boolean checkPublishRadio() {
142
        if (!publishRadioSelected) {
143
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
144
            builder.setMessage("请先阅读《用户发布内容规则》,再分享内容,勾选后,默认同意该规则。");
145
            builder.setCancelable(false);
146
            builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
147
                @Override
148
                public void onClick(DialogInterface dialogInterface, int i) {
149
                }
150
            });
151
            builder.show();
152
            return false;
153
        }
154
155
        return true;
156
    }
157
158
    private void publishRadioClick() {
159
        publishRadioSelected = !publishRadioSelected;
160
        if (publishRadioSelected) {
161
            publish_radio.setImageDrawable(getResources().getDrawable(R.drawable.radio_selected));
162
            String isFirstClick = ProfileManager.getInstance().getClickedUserPublishRole(getApplicationContext());
163
            if (TextUtils.isEmpty(isFirstClick)) {
164
                ProfileManager.getInstance().setClickedUserPublishRole(getApplicationContext(), "click");
165
            }
166
        } else {
167
            publish_radio.setImageDrawable(getResources().getDrawable(R.drawable.radio_unselected));
168
        }
169
    }
170
171
    @Override
172
    public void onBackPressed() {
173
        backOperate();
174
    }
175
176
    private void backOperate() {
177
        if (FROM_TOPIC_DETAIL.equals(intentData.getFrom())) {
178
            MobclickAgent.onEvent(this.getApplicationContext(), "1044");
179
        } else {
180
            MobclickAgent.onEvent(this.getApplicationContext(), "1040");
181
        }
182
183
        PublishItemsActivity.this.finish();
184
    }
185
}

+ 0 - 942
app/src/main/java/com/electric/chargingpile/activity/PublishPicTopicActivity.java

@ -1,942 +0,0 @@
1
package com.electric.chargingpile.activity;
2
3
import android.Manifest;
4
import android.annotation.SuppressLint;
5
import android.app.Activity;
6
import android.app.ProgressDialog;
7
import android.content.Context;
8
import android.content.DialogInterface;
9
import android.content.Intent;
10
import android.graphics.Bitmap;
11
import android.graphics.BitmapFactory;
12
import android.graphics.Color;
13
import android.graphics.Matrix;
14
import android.graphics.drawable.BitmapDrawable;
15
import android.graphics.drawable.ColorDrawable;
16
import android.net.Uri;
17
import android.os.Build;
18
import android.os.Bundle;
19
20
import android.os.Handler;
21
import android.os.Message;
22
import android.provider.MediaStore;
23
24
import androidx.appcompat.app.AlertDialog;
25
26
import android.text.Editable;
27
import android.text.Html;
28
import android.text.TextUtils;
29
import android.text.TextWatcher;
30
import android.util.Log;
31
import android.view.KeyEvent;
32
import android.view.LayoutInflater;
33
import android.view.View;
34
import android.view.View.OnClickListener;
35
import android.view.ViewGroup;
36
import android.view.animation.AnimationUtils;
37
import android.view.inputmethod.InputMethodManager;
38
import android.widget.AdapterView;
39
import android.widget.BaseAdapter;
40
import android.widget.Button;
41
import android.widget.EditText;
42
import android.widget.GridView;
43
import android.widget.ImageView;
44
import android.widget.LinearLayout;
45
import android.widget.PopupWindow;
46
import android.widget.RelativeLayout;
47
import android.widget.TextView;
48
import android.widget.Toast;
49
50
import com.electric.chargingpile.R;
51
import com.electric.chargingpile.application.MainApplication;
52
import com.electric.chargingpile.data.AuthSignBean;
53
import com.electric.chargingpile.data.ChatRecommendBean;
54
import com.electric.chargingpile.data.PhotoUploadResult;
55
import com.electric.chargingpile.data.PublishItemSerializable;
56
import com.electric.chargingpile.data.UploadPic;
57
import com.electric.chargingpile.engine.GlideEngine;
58
import com.electric.chargingpile.util.BarColorUtil;
59
import com.electric.chargingpile.util.Base64;
60
import com.electric.chargingpile.util.Bimp;
61
import com.electric.chargingpile.util.CommonParams;
62
import com.electric.chargingpile.util.DateUtils;
63
import com.electric.chargingpile.util.DensityUtil;
64
import com.electric.chargingpile.util.FileUtils;
65
import com.electric.chargingpile.util.ImageItem;
66
import com.electric.chargingpile.util.JsonUtils;
67
import com.electric.chargingpile.util.LoadingDialog;
68
import com.electric.chargingpile.util.PublicWay;
69
import com.electric.chargingpile.util.Res;
70
import com.electric.chargingpile.util.ToastUtil;
71
import com.electric.chargingpile.util.Util;
72
import com.luck.picture.lib.PictureSelector;
73
import com.luck.picture.lib.animators.AnimationType;
74
import com.luck.picture.lib.config.PictureConfig;
75
import com.luck.picture.lib.config.PictureMimeType;
76
import com.luck.picture.lib.entity.LocalMedia;
77
import com.luck.picture.lib.tools.ScreenUtils;
78
import com.umeng.analytics.MobclickAgent;
79
import com.upyun.library.common.ParallelUploader;
80
import com.upyun.library.common.UploadEngine;
81
import com.upyun.library.listener.UpCompleteListener;
82
import com.upyun.library.listener.UpProgressListener;
83
84
import com.zhy.http.okhttp.OkHttpUtils;
85
import com.zhy.http.okhttp.callback.StringCallback;
86
87
import java.io.ByteArrayOutputStream;
88
import java.io.File;
89
import java.io.IOException;
90
import java.util.ArrayList;
91
import java.util.HashMap;
92
import java.util.List;
93
import java.util.Map;
94
95
import cn.jpush.android.api.JPushInterface;
96
import io.reactivex.Observable;
97
import io.reactivex.ObservableEmitter;
98
import io.reactivex.ObservableOnSubscribe;
99
import io.reactivex.Observer;
100
import io.reactivex.android.schedulers.AndroidSchedulers;
101
import io.reactivex.disposables.Disposable;
102
import io.reactivex.schedulers.Schedulers;
103
import okhttp3.Call;
104
import pub.devrel.easypermissions.AfterPermissionGranted;
105
import pub.devrel.easypermissions.EasyPermissions;
106
107
/**
108
 * @desc : 发布话题
109
 */
110
@Deprecated
111
public class PublishPicTopicActivity extends Activity implements OnClickListener, EasyPermissions.PermissionCallbacks {
112
    private static final String TAG = "PublishPicTopicActivity";
113
    private static final int PIC_NUM = 9;
114
    private ImageView ivBack;
115
    private TextView tv_right;
116
    private GridView noScrollgridview;
117
118
119
    Bitmap bm = null;
120
    private static final int PHOTO_REQUEST_CAMERA = 1;
121
    private static final int PHOTO_REQUEST_GALLERY = 2;
122
    private static final int PHOTO_REQUEST_CUT = 3;
123
    private GridAdapter adapter;
124
    private EditText et_context;
125
    private TextView tvSubmit;
126
    private ImageView point;
127
    private ImageView mPublishTopicDe;
128
    private TextView tv_point;
129
    private RelativeLayout rl_point;
130
    private android.view.animation.Animation animation;
131
    InputMethodManager imm;
132
    private String userContact;
133
    private LinearLayout ll_contact;
134
    List<UploadPic> list;
135
    String json;
136
    LoadingDialog dialog;
137
    private ProgressDialog insertDialog;
138
    private static final int RC_ALBUM_PERM = 123;
139
    private int screenWidth;
140
    private int itemWidth;
141
142
143
    private TextView publishtopic_choose_topic, mPublishtopicChooseTopic, publishtopic_word_num;
144
145
    private String topicId = "";
146
    //空间名
147
    public static String SPACE = "d1evcom01-fs";
148
    private String policy = "";
149
    private String OPERATER = "d1evvideo01";
150
    @SuppressLint("SdCardPath")
151
    private ParallelUploader parallelUploader;
152
    private ProgressDialog uploadDialog;
153
    private PublishItemSerializable intentData;
154
155
    public static final int REQUEST_CODE_CHOOSE = 342;
156
157
    private List<LocalMedia> mSelectionData =new ArrayList<LocalMedia>();
158
    @Override
159
    protected void onCreate(Bundle savedInstanceState) {
160
        super.onCreate(savedInstanceState);
161
        setContentView(R.layout.activity_publish_picture_content);
162
        BarColorUtil.initStatusBarColor(PublishPicTopicActivity.this);
163
164
        initView();
165
        Res.init(this);
166
        PublicWay.activityList.add(this);
167
        dialog = new LoadingDialog(this);
168
        dialog.setCanceledOnTouchOutside(false);
169
        Init();
170
171
        initYouPaiYun();
172
173
    }
174
175
    /**
176
     * 初始化 又拍云
177
     */
178
    private void initYouPaiYun() {
179
180
        //初始化断点续传 (服务端签名可用)
181
        if (parallelUploader == null) {
182
            parallelUploader = new ParallelUploader();
183
        }
184
    }
185
186
    private void initView() {
187
        intentData = (PublishItemSerializable) getIntent().getSerializableExtra("intent_data");
188
        screenWidth = ScreenUtils.getScreenWidth(this);
189
        itemWidth = (int) ((screenWidth - DensityUtil.dip2px(this, 15 * 2 + 10 * 2)) / 3f);
190
        uploadDialog = new ProgressDialog(this);
191
        uploadDialog.setMessage("图片上传中...");
192
        uploadDialog.setCanceledOnTouchOutside(false);
193
        mPublishTopicDe = (ImageView) findViewById(R.id.publishtopic_choose_topic_de);
194
        mPublishTopicDe.setOnClickListener(this);
195
        mPublishtopicChooseTopic = (TextView) findViewById(R.id.publishtopic_choose_topic);
196
        publishtopic_choose_topic = (TextView) findViewById(R.id.publishtopic_choose_topic);
197
        publishtopic_word_num = (TextView) findViewById(R.id.publishtopic_word_num);
198
        publishtopic_choose_topic.setOnClickListener(this);
199
        insertDialog = new ProgressDialog(this);
200
        insertDialog.setMessage("正在插入图片...");
201
        insertDialog.setCanceledOnTouchOutside(false);
202
        tv_right = (TextView) findViewById(R.id.tv_right);
203
        tv_right.setOnClickListener(new OnClickListener() {
204
            @Override
205
            public void onClick(View view) {
206
                if (imm.isActive()) {
207
                    view = getWindow().peekDecorView();
208
                    if (view != null) {
209
                        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
210
                    }
211
                }
212
213
                MobclickAgent.onEvent(getApplicationContext(), "1035");
214
                uploadDialog.show();
215
                //获取又拍云数据
216
                getYouPaiData();
217
            }
218
        });
219
        rl_point = (RelativeLayout) findViewById(R.id.rl_point);
220
        tv_point = (TextView) findViewById(R.id.tv_point);
221
        animation = AnimationUtils.loadAnimation(PublishPicTopicActivity.this, R.anim.nn);
222
        point = (ImageView) findViewById(R.id.tv_one);
223
        ivBack = (ImageView) findViewById(R.id.iv_back);
224
        ivBack.setOnClickListener(this);
225
        et_context = (EditText) findViewById(R.id.et_context);
226
        et_context.setOnFocusChangeListener(new View.OnFocusChangeListener() {
227
            @Override
228
            public void onFocusChange(View view, boolean b) {
229
                if (b) {
230
                    MobclickAgent.onEvent(getApplicationContext(), "1023");
231
                }
232
            }
233
        });
234
235
236
        et_context.addTextChangedListener(new TextWatcher() {
237
            @Override
238
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
239
240
            }
241
242
            @Override
243
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
244
245
            }
246
247
            @Override
248
            public void afterTextChanged(Editable editable) {
249
                String s = et_context.getText().toString().trim();
250
                if (s.length() > 500) {
251
                    et_context.setText(s.subSequence(0, 500));
252
                    et_context.setSelection(500);
253
                }
254
255
                if (TextUtils.isEmpty(s))
256
                    publishtopic_word_num.setText("0");
257
                else
258
                    publishtopic_word_num.setText(s.length() + "");
259
            }
260
        });
261
        imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
262
263
        if (intentData.getFrom().equals(PublishItemsActivity.FROM_TOPIC_DETAIL)) {
264
            chatRecommendBean = new ChatRecommendBean();
265
            chatRecommendBean.topicId = Long.parseLong(intentData.getTopicId());
266
            mPublishtopicChooseTopic.setText(intentData.getName());
267
            mPublishTopicDe.setVisibility(View.VISIBLE);
268
        }
269
    }
270
271
    private void getYouPaiData() {
272
273
        if (null == Bimp.tempSelectBitmap)
274
            return;
275
        String fileNames = "";
276
        for (int i = 0; i < Bimp.tempSelectBitmap.size(); i++) {
277
278
            ImageItem imageItem = Bimp.tempSelectBitmap.get(i);
279
            if (TextUtils.isEmpty(fileNames)) {
280
                fileNames = imageItem.fName;
281
            } else {
282
                fileNames += "," + imageItem.fName;
283
            }
284
        }
285
286
        String url = MainApplication.urlNew + "/topic/sign.do";
287
        Map<String, String> map = new HashMap<>();
288
        map.put("fileNames", fileNames);
289
        map.put("targetType", ChatRecommendBean.TARGET_TYPE_IMAGE_TEXT + "");
290
        CommonParams.addCommonParams(map);
291
        OkHttpUtils.post().params(map).url(url).build().connTimeOut(6000).readTimeOut(6000).execute(new StringCallback() {
292
            @Override
293
            public void onError(Call call, Exception e) {
294
                MobclickAgent.onEvent(getApplicationContext(), "1037");
295
                uploadDialog.dismiss();
296
                ToastUtil.showToast(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT);
297
            }
298
299
            @Override
300
            public void onResponse(String response) {
301
                String code = JsonUtils.getKeyResult(response, "code");
302
                String desc = JsonUtils.getKeyResult(response, "desc");
303
                if ("1000".equals(code)) {
304
                    String data = JsonUtils.getKeyResult(response, "data");
305
                    ArrayList<AuthSignBean> signBeans = (ArrayList<AuthSignBean>) JsonUtils.parseToObjectList(data, AuthSignBean.class);
306
                    if (null != signBeans && signBeans.size() > 0) {
307
                        publishCount = signBeans.size();
308
                        for (int i = 0; i < publishCount; i++) {
309
                            String sign = signBeans.get(i).sign;
310
                            String policy = signBeans.get(i).policy;
311
                            formUpload(Bimp.tempSelectBitmap.get(i).getFile(), sign, policy);
312
                        }
313
                    }
314
                } else if ("8010".equals(code)) {
315
                    MobclickAgent.onEvent(getApplicationContext(), "1037");
316
                    uploadDialog.dismiss();
317
                    startActivity(new Intent(getApplicationContext(), LoginActivity.class));
318
                    ToastUtil.showToast(getApplicationContext(), desc, Toast.LENGTH_SHORT);
319
                } else {
320
                    MobclickAgent.onEvent(getApplicationContext(), "1037");
321
                    uploadDialog.dismiss();
322
                    ToastUtil.showToast(getApplicationContext(), desc, Toast.LENGTH_SHORT);
323
                }
324
            }
325
        });
326
327
    }
328
329
    private ArrayList<String> publishArray = new ArrayList<>();
330
    private int publishCount = 0;
331
    final int reqTopic = 100;
332
333
    @Override
334
    public void onClick(View v) {
335
        switch (v.getId()) {
336
            case R.id.publishtopic_choose_topic_de: // 取消选择的话题
337
                MobclickAgent.onEvent(getApplicationContext(), "1034");
338
                mPublishtopicChooseTopic.setText("# 选择话题");
339
                mPublishTopicDe.setVisibility(View.GONE);
340
                chatRecommendBean = null;
341
                break;
342
            case R.id.publishtopic_choose_topic: // 选择话题
343
                MobclickAgent.onEvent(getApplicationContext(), "1031");
344
                et_context.clearFocus();
345
                startActivityForResult(new Intent(this, TopicActivity.class), reqTopic);
346
                break;
347
            case R.id.iv_back:
348
                if (imm.isActive()) {
349
                    View view = getWindow().peekDecorView();
350
                    if (view != null) {
351
                        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
352
                    }
353
                }
354
                showDialogToExit();
355
                break;
356
        }
357
    }
358
359
    ChatRecommendBean chatRecommendBean = null;
360
361
    @Override
362
    protected void onPause() {
363
        super.onPause();
364
//		requestManager.removeOnRequestFinishedListener(this);
365
        MobclickAgent.onPause(this);
366
    }
367
368
    @Override
369
    protected void onResume() {
370
        super.onResume();
371
//		requestManager.addOnRequestFinishedListener(this);
372
        MobclickAgent.onResume(this);
373
    }
374
375
    private File getFile(String path) {
376
        File f = new File(path);
377
        if (!f.exists()) {
378
            try {
379
                f.createNewFile();
380
            } catch (IOException e) {
381
                e.printStackTrace();
382
            }
383
        }
384
        return f;
385
    }
386
387
388
    public void Init() {
389
        noScrollgridview = (GridView) findViewById(R.id.noScrollgridview);
390
        noScrollgridview.setSelector(new ColorDrawable(Color.TRANSPARENT));
391
        adapter = new GridAdapter(this);
392
        adapter.update();
393
        noScrollgridview.setAdapter(adapter);
394
        noScrollgridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
395
396
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
397
                                    long arg3) {
398
                imm.hideSoftInputFromWindow(arg1.getWindowToken(), 0);
399
                if (arg2 == Bimp.tempSelectBitmap.size()) {
400
                    permissionTask();
401
                } else {
402
                    MobclickAgent.onEvent(getApplicationContext(), "1027");
403
                    Intent intent = new Intent(PublishPicTopicActivity.this,
404
                            GalleryActivityFeedback.class);
405
                    intent.putExtra("position", "1");
406
                    intent.putExtra("type", "1");
407
                    intent.putExtra("ID", arg2);
408
                    startActivity(intent);
409
                }
410
            }
411
        });
412
    }
413
414
    /**
415
     * 调用图库选择
416
     */
417
    private void callGallery() {
418
        MobclickAgent.onEvent(getApplicationContext(), "1024");
419
//        Matisse.from(PublishPicTopicActivity.this)
420
//                .choose(MimeType.of(MimeType.JPEG, MimeType.PNG, MimeType.GIF))
421
//                .showSingleMediaType(true)
422
//                .countable(true)
423
//                .maxSelectable(PIC_NUM - Bimp.tempSelectBitmap.size())
424
//                .capture(true)
425
//                .captureStrategy(new CaptureStrategy(true, "com.electric.chargingpile.provider"))
426
//                .imageEngine(new GlideEngine())
427
//                .forResult(REQUEST_CODE_CHOOSE);
428
        PictureSelector.create(this)
429
                .openGallery(PictureMimeType.ofImage())
430
                .maxSelectNum(PIC_NUM)
431
                .selectionData(mSelectionData)//是否传入已选图片
432
                .selectionMode(PictureConfig.MULTIPLE)
433
                .isCompress(true)//是否压缩
434
                .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
435
                .isGif(true)//是否显示gif
436
                .isAndroidQTransform(true)
437
                .imageEngine(GlideEngine.createGlideEngine())
438
                .isWeChatStyle(false)// 是否开启微信图片选择风格
439
                .isUseCustomCamera(false)// 是否使用自定义相机
440
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
441
                .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
442
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
443
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
444
                .imageSpanCount(4)// 每行显示个数
445
                .isReturnEmpty(false)// 未选择数据时点击按钮是否可以返回
446
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
447
                .forResult(REQUEST_CODE_CHOOSE);
448
449
    }
450
451
    @Override
452
    protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
453
        super.onActivityResult(requestCode, resultCode, data);
454
        if (requestCode == reqTopic && resultCode == -100) { // 选择话题完成
455
            chatRecommendBean = (ChatRecommendBean) data.getSerializableExtra("topic");
456
            if (chatRecommendBean != null) {
457
                mPublishtopicChooseTopic.setText(Html.fromHtml(chatRecommendBean.name));
458
                mPublishTopicDe.setVisibility(View.VISIBLE);
459
            }
460
        }
461
462
        if (resultCode == RESULT_OK) {
463
            if (data != null) {
464
                if (requestCode == 1) {
465
                    //处理调用系统图库
466
                } else if (requestCode == REQUEST_CODE_CHOOSE) {
467
                    MobclickAgent.onEvent(getApplicationContext(), "1026");
468
                    //异步方式插入图片
469
                    insertImagesSync(data);
470
                }
471
            }
472
        }
473
    }
474
475
    /**
476
     * 异步方式插入图片
477
     *
478
     * @param data
479
     */
480
    private void insertImagesSync(final Intent data) {
481
        insertDialog.show();
482
        Observable.create(new ObservableOnSubscribe<String>() {
483
            @Override
484
            public void subscribe(ObservableEmitter<String> subscriber) throws Exception {
485
                try {
486
//                    List<Uri> uriList = Matisse.obtainResult(data);
487
                    mSelectionData= PictureSelector.obtainMultipleResult(data);
488
489
                    int i = 0;
490
                    for (LocalMedia localMedia : mSelectionData) {
491
                        i++;
492
//                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
493
//                        File file = FileUtils.from(PublishPicTopicActivity.this, uri);
494
//
495
//                        bitmap = FileUtils.rotateIfRequired(file, bitmap);
496
//                        bitmap = imageZoom(bitmap);
497
                        ImageItem takePhoto = new ImageItem();
498
//                        String deviceId = JPushInterface.getUdid(MainApplication.context);
499
//                        takePhoto.fName = DateUtils.getSimpleCurrentDate();
500
//                        if (TextUtils.isEmpty(deviceId)) {
501
//                            takePhoto.fName += "_" + Util.getRandom(15);
502
//                        } else {
503
//                            takePhoto.fName += "_" + deviceId;
504
//                        }
505
//                        takePhoto.fName += "_00" + i;
506
//
507
//                        String filePath = file.getAbsolutePath();
508
//                        String suffix = filePath.substring(filePath.lastIndexOf(".") + 1);
509
//                        takePhoto.fName += "." + suffix;
510
                        String path="";
511
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
512
                            path= localMedia.getAndroidQToPath();
513
                        }else{
514
                            path=localMedia.getPath();
515
                        }
516
                        takePhoto.setBitmap(imageZoom(BitmapFactory.decodeFile(path)));
517
                        takePhoto.setFile(new File(path));
518
                        Bimp.tempSelectBitmap.add(takePhoto);
519
                        subscriber.onNext("");
520
                    }
521
                    subscriber.onComplete();
522
                } catch (Exception e) {
523
                    e.printStackTrace();
524
                    subscriber.onError(e);
525
                }
526
            }
527
        })
528
                .subscribeOn(Schedulers.io())//生产事件在io
529
                .observeOn(AndroidSchedulers.mainThread())//消费事件在UI线程
530
                .subscribe(new Observer<String>() {
531
                    @Override
532
                    public void onComplete() {
533
                        Log.e(TAG, "onCompleted: -------------");
534
                        insertDialog.dismiss();
535
                        adapter.update();
536
537
                    }
538
539
                    @Override
540
                    public void onError(Throwable e) {
541
                        insertDialog.dismiss();
542
                        Log.e(TAG, "onError: " + "图片插入失败:" + e.getMessage());
543
                        ToastUtil.showToast(getApplicationContext(), "图片插入失败", Toast.LENGTH_SHORT);
544
                    }
545
546
                    @Override
547
                    public void onSubscribe(Disposable d) {
548
549
                    }
550
551
                    @Override
552
                    public void onNext(String imagePath) {
553
554
                    }
555
                });
556
    }
557
558
    public class GridAdapter extends BaseAdapter {
559
        private LayoutInflater inflater;
560
        private int selectedPosition = -1;
561
        private boolean shape;
562
563
        public boolean isShape() {
564
            return shape;
565
        }
566
567
        public void setShape(boolean shape) {
568
            this.shape = shape;
569
        }
570
571
        public GridAdapter(Context context) {
572
            inflater = LayoutInflater.from(context);
573
        }
574
575
        public void update() {
576
            loading();
577
        }
578
579
        public int getCount() {
580
            if (Bimp.tempSelectBitmap.size() == 9) {
581
                return 9;
582
            }
583
            return (Bimp.tempSelectBitmap.size() + 1);
584
        }
585
586
        public Object getItem(int arg0) {
587
            return null;
588
        }
589
590
        public long getItemId(int arg0) {
591
            return 0;
592
        }
593
594
        public void setSelectedPosition(int position) {
595
            selectedPosition = position;
596
        }
597
598
        public int getSelectedPosition() {
599
            return selectedPosition;
600
        }
601
602
        public View getView(final int position, View convertView, ViewGroup parent) {
603
            GridAdapter.ViewHolder holder = null;
604
            if (convertView == null) {
605
                convertView = inflater.inflate(R.layout.item_publish_picture,
606
                        parent, false);
607
                holder = new GridAdapter.ViewHolder();
608
                holder.image = (ImageView) convertView
609
                        .findViewById(R.id.item_publish_image);
610
                holder.imageDelete = convertView.findViewById(R.id.item_publish_image_delete);
611
                convertView.setTag(holder);
612
            } else {
613
                holder = (GridAdapter.ViewHolder) convertView.getTag();
614
            }
615
616
617
            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.image.getLayoutParams();
618
            params.width = itemWidth;
619
            params.height = itemWidth;
620
            if (position % 3 != 0) {
621
                params.leftMargin = DensityUtil.dip2px(getApplicationContext(), 10);
622
            }
623
            holder.image.setLayoutParams(params);
624
625
            if (position == Bimp.tempSelectBitmap.size()) {
626
                holder.imageDelete.setVisibility(View.GONE);
627
                holder.image.setImageResource(R.drawable.add_picture);
628
                holder.image.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
629
                holder.image.setBackgroundColor(Color.parseColor("#f5f5f5"));
630
                if (position == 9) {
631
                    holder.image.setVisibility(View.GONE);
632
                }
633
            } else {
634
                holder.imageDelete.setVisibility(View.VISIBLE);
635
                holder.image.setImageBitmap(Bimp.tempSelectBitmap.get(position).getBitmap());
636
                holder.image.setScaleType(ImageView.ScaleType.CENTER_CROP);
637
                holder.image.setBackgroundColor(Color.WHITE);
638
            }
639
640
            holder.imageDelete.setOnClickListener(new OnClickListener() {
641
                @Override
642
                public void onClick(View view) {
643
                    MobclickAgent.onEvent(getApplicationContext(), "1030");
644
                    Bimp.tempSelectBitmap.remove(position);
645
                    Bimp.max--;
646
                    Message message = new Message();
647
                    message.what = 1;
648
                    handler.sendMessage(message);
649
                }
650
            });
651
652
            return convertView;
653
        }
654
655
        public class ViewHolder {
656
            public ImageView image;
657
            public ImageView imageDelete;
658
        }
659
660
        Handler handler = new Handler() {
661
            public void handleMessage(Message msg) {
662
                switch (msg.what) {
663
                    case 1:
664
                        if (null != Bimp.tempSelectBitmap && Bimp.tempSelectBitmap.size() > 0) {
665
                            tv_right.setEnabled(true);
666
                            tv_right.setBackgroundColor(Color.parseColor("#02b637"));
667
                        } else {
668
                            tv_right.setEnabled(false);
669
                            tv_right.setBackgroundColor(Color.parseColor("#9ed3ae"));
670
                        }
671
                        adapter.notifyDataSetChanged();
672
                        break;
673
                }
674
                super.handleMessage(msg);
675
            }
676
        };
677
678
        public void loading() {
679
            new Thread(new Runnable() {
680
                public void run() {
681
                    while (true) {
682
                        if (Bimp.max == Bimp.tempSelectBitmap.size()) {
683
                            Message message = new Message();
684
                            message.what = 1;
685
                            handler.sendMessage(message);
686
                            break;
687
                        } else {
688
                            Bimp.max += 1;
689
                            Message message = new Message();
690
                            message.what = 1;
691
                            handler.sendMessage(message);
692
                        }
693
                    }
694
                }
695
            }).start();
696
        }
697
    }
698
699
700
    @Override
701
    protected void onRestart() {
702
        adapter.update();
703
        super.onRestart();
704
    }
705
706
    @Override
707
    protected void onDestroy() {
708
        super.onDestroy();
709
        Bimp.tempSelectBitmap.clear();
710
        Bimp.max = 0;
711
    }
712
713
    private Bitmap imageZoom(Bitmap bm) {
714
        // 图片允许最大空间 单位:KB
715
        double maxSize = 200.00;
716
        // 将bitmap放至数组中,意在bitmap的大小(与实际读取的原文件要大)
717
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
718
        bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
719
        byte[] b = baos.toByteArray();
720
        // 将字节换成KB
721
        double mid = b.length / 1024;
722
        // 判断bitmap占用空间是否大于允许最大空间 如果大于则压缩 小于则不压缩
723
        if (mid > maxSize) {
724
            // 获取bitmap大小 是允许最大大小的多少倍
725
            double i = mid / maxSize;
726
            // 开始压缩 此处用到平方根 将宽带和高度压缩掉对应的平方根倍
727
            // (1.保持刻度和高度和原bitmap比率一致,压缩后也达到了最大大小占用空间的大小)
728
            bm = zoomImage(bm, bm.getWidth() / Math.sqrt(i), bm.getHeight() / Math.sqrt(i));
729
        }
730
731
        return bm;
732
    }
733
734
    public Bitmap zoomImage(Bitmap bgimage, double newWidth, double newHeight) {
735
        // 获取这个图片的宽和高
736
        float width = bgimage.getWidth();
737
        float height = bgimage.getHeight();
738
        // 创建操作图片用的matrix对象
739
        Matrix matrix = new Matrix();
740
        // 计算宽高缩放率
741
        float scaleWidth = ((float) newWidth) / width;
742
        float scaleHeight = ((float) newHeight) / height;
743
        // 缩放图片动作
744
        matrix.postScale(scaleWidth, scaleHeight);
745
        Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width,
746
                (int) height, matrix, true);
747
        return bitmap;
748
    }
749
750
751
    /**
752
     * 检测是否有emoji表情
753
     *
754
     * @param source
755
     * @return
756
     */
757
    public static boolean containsEmoji(String source) {
758
        int len = source.length();
759
        for (int i = 0; i < len; i++) {
760
            char codePoint = source.charAt(i);
761
            if (!isEmojiCharacter(codePoint)) { //如果不能匹配,则该字符是Emoji表情
762
                return true;
763
            }
764
        }
765
        return false;
766
    }
767
768
    /**
769
     * 判断是否是Emoji
770
     *
771
     * @param codePoint 比较的单个字符
772
     * @return
773
     */
774
    private static boolean isEmojiCharacter(char codePoint) {
775
        return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) ||
776
                (codePoint == 0xD) || ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||
777
                ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) || ((codePoint >= 0x10000)
778
                && (codePoint <= 0x10FFFF));
779
    }
780
781
    @Override
782
    public void onPermissionsGranted(int requestCode, List<String> perms) {
783
784
    }
785
786
    @Override
787
    public void onPermissionsDenied(int requestCode, List<String> perms) {
788
789
    }
790
791
    @AfterPermissionGranted(RC_ALBUM_PERM)
792
    public void permissionTask() {
793
        if (isPermissionOK()) {
794
            callGallery();
795
        } else {
796
            EasyPermissions.requestPermissions(
797
                    this, "充电桩想要获取您的图片读取权限,是否允许?",
798
                    RC_ALBUM_PERM,
799
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
800
                    Manifest.permission.READ_EXTERNAL_STORAGE,
801
                    Manifest.permission.CAMERA
802
            );
803
        }
804
    }
805
806
    private boolean isPermissionOK() {
807
        return EasyPermissions.hasPermissions(this,
808
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
809
                Manifest.permission.READ_EXTERNAL_STORAGE,
810
                Manifest.permission.CAMERA
811
        );
812
    }
813
814
815
    /**
816
     * 表单上传
817
     *
818
     * @param sign
819
     * @param policyServer
820
     */
821
    private void formUpload(File file, String sign, String policyServer) {
822
//        //进度回调,可为空
823
        UpProgressListener progressListener = new UpProgressListener() {
824
            @Override
825
            public void onRequestProgress(long bytesWrite, long contentLength) {
826
//                bp_form.setProgress((int) ((100 * bytesWrite) / contentLength));
827
//                tv_form.setText((100 * bytesWrite) / contentLength + "%");
828
                Log.e(TAG, (100 * bytesWrite) / contentLength + "%");
829
                Log.e(TAG, bytesWrite + "::" + contentLength);
830
                uploadDialog.setProgress((int) (100 * bytesWrite / contentLength));
831
            }
832
        };
833
834
        //结束回调,不可为空
835
        UpCompleteListener completeListener = new UpCompleteListener() {
836
            @Override
837
            public void onComplete(boolean isSuccess, String result) {
838
//                tv_form.setText(isSuccess + ":" + result);
839
                Log.e(TAG, isSuccess + result);
840
                if (isSuccess) {
841
                    PhotoUploadResult photoUploadResult = new PhotoUploadResult(result);
842
                    publishArray.add(photoUploadResult.formatResult());
843
                }
844
845
                if (publishCount == publishArray.size()) {
846
                    String urls = "";
847
                    for (int i = 0; i < publishArray.size(); i++) {
848
                        if (TextUtils.isEmpty(urls))
849
                            urls = publishArray.get(i);
850
                        else
851
                            urls = urls + "," + publishArray.get(i);
852
                    }
853
                    requestPublishServer("[" + urls + "]");
854
                }
855
            }
856
        };
857
858
        //表单上传(服务器签名方式)
859
        UploadEngine.getInstance().formUpload(file, policyServer, OPERATER, sign, completeListener,
860
                progressListener);
861
862
    }
863
864
865
    private void requestPublishServer(String urls) {
866
        String url = MainApplication.urlNew + "/topic/publish.do";
867
        Map<String, String> map = new HashMap<>();
868
        map.put("content", et_context.getText().toString().trim());
869
        map.put("urls", Base64.encode(urls.getBytes()).replaceAll("\\s*", ""));
870
        if (chatRecommendBean != null) {
871
            map.put("topicId", chatRecommendBean.topicId + "");
872
        }
873
        map.put("targetType", ChatRecommendBean.TARGET_TYPE_IMAGE_TEXT + "");
874
        CommonParams.addCommonParams(map);
875
876
        OkHttpUtils.post().params(map).url(url).build().connTimeOut(6000).readTimeOut(6000).execute(new StringCallback() {
877
            @Override
878
            public void onError(Call call, Exception e) {
879
                MobclickAgent.onEvent(getApplicationContext(), "1037");
880
                uploadDialog.dismiss();
881
                dialog.cancel();
882
                publishArray.clear();
883
                publishCount = 0;
884
                ToastUtil.showToast(getApplicationContext(), "发布失败,请重试", Toast.LENGTH_SHORT);
885
            }
886
887
            @Override
888
            public void onResponse(String response) {
889
                uploadDialog.dismiss();
890
                dialog.cancel();
891
                publishArray.clear();
892
                publishCount = 0;
893
                String code = JsonUtils.getKeyResult(response, "code");
894
                String desc = JsonUtils.getKeyResult(response, "desc");
895
                if ("1000".equals(code)) { // 图文发布成功
896
                    MobclickAgent.onEvent(getApplicationContext(), "1036");
897
                    ToastUtil.showToast(getApplicationContext(), "发布成功", Toast.LENGTH_SHORT);
898
                    if (intentData.getFrom().equals(PublishItemsActivity.FROM_CHAT_HOME)) {
899
                        startActivity(new Intent(getApplicationContext(), ChatActivity.class));
900
                    } else {
901
                        startActivity(new Intent(getApplicationContext(), TopicDetailActivity.class));
902
                    }
903
904
                } else {
905
                    MobclickAgent.onEvent(getApplicationContext(), "1037");
906
                    ToastUtil.showToast(getApplicationContext(), desc, Toast.LENGTH_SHORT);
907
                }
908
            }
909
        });
910
    }
911
912
    private void showDialogToExit() {
913
        String s = et_context.getText().toString().trim();
914
        if (s.length() > 0 || Bimp.tempSelectBitmap.size() > 0) {
915
            AlertDialog.Builder builder = new AlertDialog.Builder(PublishPicTopicActivity.this);
916
            builder.setTitle("离开发布页");
917
            builder.setMessage("小主您是否要离开发布页呢?");
918
            builder.setCancelable(false);
919
            builder.setPositiveButton("是", new DialogInterface.OnClickListener() {
920
                @Override
921
                public void onClick(DialogInterface dialog, int which) {
922
                    MobclickAgent.onEvent(getApplicationContext(), "1022");
923
                    finish();
924
                }
925
            });
926
            builder.setNegativeButton("继续编辑", null);
927
            builder.create().show();
928
        } else {
929
            MobclickAgent.onEvent(getApplicationContext(), "1022");
930
            finish();
931
        }
932
    }
933
934
    @Override
935
    public boolean onKeyUp(int keyCode, KeyEvent event) {
936
        if (keyCode == KeyEvent.KEYCODE_BACK) {
937
            showDialogToExit();
938
            return true;
939
        }
940
        return false;
941
    }
942
}

+ 0 - 538
app/src/main/java/com/electric/chargingpile/activity/PublishVideoTopicActivity.java

@ -1,538 +0,0 @@
1
package com.electric.chargingpile.activity;
2
3
import android.app.Activity;
4
import android.app.ProgressDialog;
5
import android.content.BroadcastReceiver;
6
import android.content.Context;
7
import android.content.DialogInterface;
8
import android.content.Intent;
9
import android.content.IntentFilter;
10
import android.content.pm.ActivityInfo;
11
import android.graphics.Color;
12
import android.net.Uri;
13
import android.os.Bundle;
14
import android.text.Editable;
15
import android.text.Html;
16
import android.text.TextUtils;
17
import android.text.TextWatcher;
18
import android.util.Log;
19
import android.view.KeyEvent;
20
import android.view.View;
21
import android.view.View.OnClickListener;
22
import android.widget.EditText;
23
import android.widget.ImageView;
24
import android.widget.RelativeLayout;
25
import android.widget.TextView;
26
import android.widget.Toast;
27
28
import androidx.appcompat.app.AlertDialog;
29
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
30
31
import com.blankj.utilcode.util.ToastUtils;
32
import com.bumptech.glide.Glide;
33
import com.bumptech.glide.request.RequestOptions;
34
import com.electric.chargingpile.R;
35
import com.electric.chargingpile.application.MainApplication;
36
import com.electric.chargingpile.data.AuthSignBean;
37
import com.electric.chargingpile.data.ChatRecommendBean;
38
import com.electric.chargingpile.data.PublishItemSerializable;
39
import com.electric.chargingpile.data.VideoUploadResult;
40
import com.electric.chargingpile.util.BarColorUtil;
41
import com.electric.chargingpile.util.Base64;
42
import com.electric.chargingpile.util.CommonParams;
43
import com.electric.chargingpile.util.DateUtils;
44
import com.electric.chargingpile.util.JsonUtils;
45
import com.electric.chargingpile.util.PhotoUtils;
46
import com.electric.chargingpile.util.ToastUtil;
47
import com.electric.chargingpile.util.Util;
48
import com.luck.picture.lib.PictureSelector;
49
import com.luck.picture.lib.animators.AnimationType;
50
import com.luck.picture.lib.config.PictureConfig;
51
import com.luck.picture.lib.config.PictureMimeType;
52
import com.luck.picture.lib.entity.LocalMedia;
53
import com.electric.chargingpile.engine.GlideEngine;
54
import com.umeng.analytics.MobclickAgent;
55
import com.upyun.library.common.UploadEngine;
56
import com.upyun.library.listener.UpCompleteListener;
57
import com.upyun.library.listener.UpProgressListener;
58
import com.zhy.http.okhttp.OkHttpUtils;
59
import com.zhy.http.okhttp.callback.StringCallback;
60
61
import java.io.File;
62
import java.util.ArrayList;
63
import java.util.HashMap;
64
import java.util.List;
65
import java.util.Map;
66
67
import cn.jpush.android.api.JPushInterface;
68
import okhttp3.Call;
69
@Deprecated
70
public class PublishVideoTopicActivity extends Activity implements OnClickListener {
71
    private static final String TAG = "PublishVideoTopicActivity";
72
    Context mContext;
73
    private ImageView mPublishtopicBack;
74
    private TextView mPublishtopicPublish;
75
    private EditText mPublishtopicCon;
76
    private ImageView mPublishtopicGv;
77
    private TextView mPublishtopicChooseTopic;
78
    private TextView mPublishtopicChoosePreview;
79
    private TextView mPublishtopicWordNum;
80
    private ImageView mPublishTopicDe;
81
82
    private RelativeLayout mItemVideoLl;
83
    private ImageView mItemVideo;
84
    private View mItemVideoDelete;
85
    private String fileName;
86
87
88
    public static final String CACHE_DIR = PhotoUtils.CACHE_DIR;
89
90
91
    public static final String IMAGE_CACHE = CACHE_DIR + "/cache/image/";
92
    LocalMedia media;
93
    ProgressDialog uploadDialog;
94
    private PublishItemSerializable intentData;
95
    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
96
97
        @Override
98
        public void onReceive(Context context, Intent intent) {
99
            String message = intent.getStringExtra("message");
100
            if ("take_video".equals(message)) {
101
                MobclickAgent.onEvent(context, "1009");
102
            } else if ("preview_video".equals(message)) {
103
                MobclickAgent.onEvent(context, "1011");
104
            } else if ("finish_preview_video".equals(message)) {
105
                MobclickAgent.onEvent(context, "1012");
106
            } else if ("cancel_choosed_video".equals(message)) {
107
                MobclickAgent.onEvent(context, "1013");
108
            }
109
        }
110
    };
111
112
    @Override
113
    protected void onCreate(Bundle savedInstanceState) {
114
        super.onCreate(savedInstanceState);
115
        setContentView(R.layout.activity_publishtopic);
116
        mContext = this;
117
        uploadDialog = new ProgressDialog(this);
118
        uploadDialog.setMessage("视频上传中...");
119
        uploadDialog.setCanceledOnTouchOutside(false);
120
121
        BarColorUtil.initStatusBarColor(PublishVideoTopicActivity.this);
122
        LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, new IntentFilter("publish-video-topic-activity"));
123
        initView();
124
    }
125
126
127
    private void initView() {
128
        intentData = (PublishItemSerializable) getIntent().getSerializableExtra("intent_data");
129
        mPublishtopicBack = (ImageView) findViewById(R.id.publishtopic_back);
130
        mPublishtopicPublish = (TextView) findViewById(R.id.publishtopic_publish);
131
        mPublishtopicCon = (EditText) findViewById(R.id.publishtopic_con);
132
        mPublishtopicGv = (ImageView) findViewById(R.id.item_choose_video);
133
        mPublishtopicChooseTopic = (TextView) findViewById(R.id.publishtopic_choose_topic);
134
        mPublishtopicChoosePreview = (TextView) findViewById(R.id.publishtopic_choose_preview);
135
        mPublishtopicWordNum = (TextView) findViewById(R.id.publishtopic_word_num);
136
        mPublishTopicDe = (ImageView) findViewById(R.id.publishtopic_choose_topic_de);
137
138
        mItemVideoLl = (RelativeLayout) findViewById(R.id.item_video_ll);
139
        mItemVideo = (ImageView) findViewById(R.id.item_video);
140
        mItemVideoDelete = (View) findViewById(R.id.item_video_delete);
141
142
        if (intentData.getFrom().equals(PublishItemsActivity.FROM_TOPIC_DETAIL)) {
143
            chatRecommendBean = new ChatRecommendBean();
144
            chatRecommendBean.topicId = Long.parseLong(intentData.getTopicId());
145
            mPublishtopicChooseTopic.setText(intentData.getName());
146
            mPublishTopicDe.setVisibility(View.VISIBLE);
147
        }
148
149
        mPublishtopicCon.setOnFocusChangeListener(new View.OnFocusChangeListener() {
150
            @Override
151
            public void onFocusChange(View view, boolean b) {
152
                if (b) { // 获得焦点
153
                    MobclickAgent.onEvent(getApplicationContext(), "1007");
154
                }
155
156
            }
157
        });
158
159
160
        mPublishtopicCon.addTextChangedListener(new TextWatcher() {
161
            @Override
162
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
163
            }
164
165
            @Override
166
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
167
            }
168
169
            @Override
170
            public void afterTextChanged(Editable editable) {
171
                String s = mPublishtopicCon.getText().toString().trim();
172
173
                if (s.length() > 500) {
174
                    mPublishtopicCon.setText(s.subSequence(0, 500));
175
                    mPublishtopicCon.setSelection(500);
176
                }
177
                updatePublishBtn();
178
                if (TextUtils.isEmpty(s)) {
179
                    mPublishtopicWordNum.setText("0/500");
180
                } else {
181
                    mPublishtopicWordNum.setText(s.length() + "/500");
182
                }
183
            }
184
        });
185
186
        mPublishtopicBack.setOnClickListener(this);
187
        mPublishtopicPublish.setOnClickListener(this);
188
        mPublishtopicChoosePreview.setOnClickListener(this);
189
        mPublishtopicChooseTopic.setOnClickListener(this);
190
        mPublishTopicDe.setOnClickListener(this);
191
        mItemVideo.setOnClickListener(this);
192
        mItemVideoDelete.setOnClickListener(this);
193
        mPublishtopicGv.setOnClickListener(this);
194
    }
195
196
    private void updatePublishBtn() {
197
        if (null != media) {
198
            mPublishtopicPublish.setEnabled(true);
199
            mPublishtopicPublish.setBackgroundColor(Color.parseColor("#02b637"));
200
        } else {
201
            mPublishtopicPublish.setEnabled(false);
202
            mPublishtopicPublish.setBackgroundColor(Color.parseColor("#9ed3ae"));
203
        }
204
    }
205
206
207
    @Override
208
    public void onClick(View v) {
209
        switch (v.getId()) {
210
            case R.id.publishtopic_back: // 左上返回按钮事件
211
                showDialogToExit();
212
                break;
213
            case R.id.publishtopic_publish: // 右上发布事件
214
                if (media == null) {
215
                    ToastUtils.showLong("请选择视频!");
216
                    return;
217
                }
218
                MobclickAgent.onEvent(getApplicationContext(), "1035");
219
                uploadDialog.show();
220
                getYouPaiData();
221
                break;
222
            case R.id.publishtopic_choose_topic: // 选择话题事件
223
                MobclickAgent.onEvent(getApplicationContext(), "1031");
224
                mPublishtopicCon.clearFocus();
225
                startActivityForResult(new Intent(this, TopicActivity.class), reqTopic);
226
                break;
227
            case R.id.publishtopic_choose_preview: // 预览事件 暂时隐藏
228
                break;
229
            case R.id.publishtopic_choose_topic_de: // 取消选择话题事件
230
                MobclickAgent.onEvent(getApplicationContext(), "1034");
231
                mPublishtopicChooseTopic.setText("# 选择话题");
232
                mPublishTopicDe.setVisibility(View.GONE);
233
                chatRecommendBean = null;
234
                break;
235
            case R.id.item_choose_video: // 选择视频事件
236
                MobclickAgent.onEvent(getApplicationContext(), "1008");
237
                mPublishtopicCon.clearFocus();
238
239
                PictureSelector.create(PublishVideoTopicActivity.this)
240
                        .openGallery(PictureMimeType.ofVideo())// 全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
241
                        .imageEngine(GlideEngine.createGlideEngine())
242
                        .theme(R.style.picture_white_style)// 主题样式设置 具体参考 values/styles   用法:R.style.picture.white.style v2.3.3后 建议使用setPictureStyle()动态方式
243
                        .isWeChatStyle(false)// 是否开启微信图片选择风格
244
                        .isUseCustomCamera(false)// 是否使用自定义相机
245
                        .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
246
                        .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
247
//                        .setPictureWindowAnimationStyle(mWindowAnimationStyle)// 自定义相册启动退出动画
248
                        .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
249
                        .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
250
//                        .setButtonFeatures(CustomCameraView.BUTTON_STATE_ONLY_RECORDER)// 设置自定义相机按钮状态
251
                        .maxVideoSelectNum(1) // 视频最大选择数量
252
                        .minVideoSelectNum(1)// 视频最小选择数量
253
                        //.closeAndroidQChangeVideoWH(!SdkVersionUtils.checkedAndroid_Q())// 关闭在AndroidQ下获取图片或视频宽高相反自动转换
254
                        .imageSpanCount(4)// 每行显示个数
255
                        .isReturnEmpty(false)// 未选择数据时点击按钮是否可以返回
256
//                        .closeAndroidQChangeWH(true)//如果图片有旋转角度则对换宽高,默认为true
257
//                        .closeAndroidQChangeVideoWH(!SdkVersionUtils.checkedAndroid_Q())// 如果视频有旋转角度则对换宽高,默认为false
258
                        .setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)// 设置相册Activity方向,不设置默认使用系统
259
                        .selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选
260
                        .isPreviewVideo(true)// 是否可预览视频
261
                        .setOutputCameraPath(IMAGE_CACHE)
262
                        .isCamera(true)// 是否显示拍照按钮
263
                        .isZoomAnim(true)// 图片列表点击 缩放效果 默认true
264
                        .isCompress(true)// 是否压缩
265
                        .synOrAsy(true)//同步true或异步false 压缩 默认同步
266
                        .minimumCompressSize(500)// 小于多少kb的图片不压缩
267
                        .videoMaxSecond(120)
268
                        .videoMinSecond(2)
269
                        .recordVideoSecond(15)
270
                        .forResult(PictureConfig.CHOOSE_REQUEST);
271
                break;
272
            case R.id.item_video:
273
                if (media != null) {
274
                    // 预览视频
275
                    PictureSelector.create(PublishVideoTopicActivity.this)
276
                            .themeStyle(R.style.picture_default_style)
277
                            .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
278
                            .externalPictureVideo(TextUtils.isEmpty(media.getAndroidQToPath()) ? media.getPath() : media.getAndroidQToPath());
279
                }
280
                break;
281
            case R.id.item_video_delete: // 删除视频事件
282
                MobclickAgent.onEvent(getApplicationContext(), "1014");
283
                mItemVideoLl.setVisibility(View.GONE);
284
                mPublishtopicGv.setVisibility(View.VISIBLE);
285
                media = null;
286
                updatePublishBtn();
287
                break;
288
            default:
289
                break;
290
        }
291
    }
292
293
    private void getYouPaiData() {
294
        String url = MainApplication.urlNew + "/topic/sign.do";
295
        if (TextUtils.isEmpty(fileName)) {
296
            ToastUtil.showToast(getApplicationContext(), "请重新选择视频", Toast.LENGTH_SHORT);
297
            return;
298
        }
299
        Map<String, String> map = new HashMap<>();
300
        map.put("fileNames", fileName);
301
        map.put("targetType", ChatRecommendBean.TARGET_TYPE_VIDEO + "");
302
        CommonParams.addCommonParams(map);
303
304
        OkHttpUtils.post().params(map).url(url).build().connTimeOut(6000).readTimeOut(6000).execute(new StringCallback() {
305
            @Override
306
            public void onError(Call call, Exception e) {
307
                ToastUtil.showToast(getApplicationContext(), "发布失败,请重试", Toast.LENGTH_SHORT);
308
                uploadDialog.dismiss();
309
            }
310
311
            @Override
312
            public void onResponse(String response) {
313
                String code = JsonUtils.getKeyResult(response, "code");
314
                String desc = JsonUtils.getKeyResult(response, "desc");
315
                if ("1000".equals(code)) {
316
                    String data = JsonUtils.getKeyResult(response, "data");
317
                    ArrayList<AuthSignBean> signBeans = (ArrayList<AuthSignBean>) JsonUtils.parseToObjectList(data, AuthSignBean.class);
318
                    if (null != signBeans && signBeans.size() > 0) {
319
                        String sign = signBeans.get(0).sign;
320
                        String policy = signBeans.get(0).policy;
321
                        formUpload(TextUtils.isEmpty(media.getAndroidQToPath()) ? media.getPath() : media.getAndroidQToPath(), sign, policy);
322
                    }
323
                } else {
324
                    ToastUtil.showToast(getApplicationContext(), desc, Toast.LENGTH_SHORT);
325
                    uploadDialog.dismiss();
326
                }
327
            }
328
        });
329
330
    }
331
332
    /**
333
     * 表单上传
334
     *
335
     * @param SAMPLE_PIC_FILE
336
     * @param sign
337
     * @param policyServer
338
     */
339
    private void formUpload(String SAMPLE_PIC_FILE, String sign, String policyServer) {
340
        File temp = new File(SAMPLE_PIC_FILE);
341
//        //进度回调,可为空
342
        UpProgressListener progressListener = new UpProgressListener() {
343
            @Override
344
            public void onRequestProgress(long bytesWrite, long contentLength) {
345
            }
346
        };
347
348
        //结束回调,不可为空
349
        UpCompleteListener completeListener = new UpCompleteListener() {
350
            @Override
351
            public void onComplete(boolean isSuccess, String result) {
352
                if (isSuccess) {
353
                    VideoUploadResult videoUploadResult = new VideoUploadResult(result);
354
                    requestPublishServer("[" + videoUploadResult.formatResult() + "]");
355
                } else {
356
                    ToastUtil.showToast(getApplicationContext(), "发布失败,请重试", Toast.LENGTH_SHORT);
357
                    uploadDialog.dismiss();
358
                    MobclickAgent.onEvent(getApplicationContext(), "1037");
359
                }
360
            }
361
        };
362
363
        //表单上传(服务器签名方式)
364
        UploadEngine.getInstance().formUpload(temp, policyServer, "d1evvideo01", sign, completeListener,
365
                progressListener);
366
367
    }
368
369
    private void requestPublishServer(String urls) {
370
371
        String url = MainApplication.urlNew + "/topic/publish.do";
372
        Map<String, String> map = new HashMap<>();
373
        map.put("content", mPublishtopicCon.getText().toString().trim());
374
        map.put("urls", Base64.encode(urls.getBytes()).replaceAll("\\s*", ""));
375
        if (chatRecommendBean != null) {
376
            map.put("topicId", chatRecommendBean.topicId + "");
377
        }
378
        map.put("targetType", ChatRecommendBean.TARGET_TYPE_VIDEO + "");
379
        CommonParams.addCommonParams(map);
380
381
        OkHttpUtils.post().params(map).url(url).build().connTimeOut(6000).readTimeOut(6000).execute(new StringCallback() {
382
            @Override
383
            public void onError(Call call, Exception e) {
384
                ToastUtil.showToast(getApplicationContext(), "发布失败,请重试", Toast.LENGTH_SHORT);
385
                uploadDialog.dismiss();
386
                MobclickAgent.onEvent(getApplicationContext(), "1037");
387
            }
388
389
            @Override
390
            public void onResponse(String response) {
391
                String code = JsonUtils.getKeyResult(response, "code");
392
                if ("1000".equals(code)) { // 视频发布成功
393
                    ToastUtil.showToast(getApplicationContext(), "发布成功", Toast.LENGTH_SHORT);
394
                    if (intentData.getFrom().equals(PublishItemsActivity.FROM_CHAT_HOME)) {
395
                        startActivity(new Intent(getApplicationContext(), ChatActivity.class));
396
                    } else {
397
                        startActivity(new Intent(getApplicationContext(), TopicDetailActivity.class));
398
                    }
399
                    MobclickAgent.onEvent(getApplicationContext(), "1036");
400
                } else {
401
                    String desc = JsonUtils.getKeyResult(response, "desc");
402
                    ToastUtil.showToast(getApplicationContext(), desc, Toast.LENGTH_SHORT);
403
                    MobclickAgent.onEvent(getApplicationContext(), "1037");
404
                }
405
                uploadDialog.dismiss();
406
            }
407
        });
408
    }
409
410
411
    final int reqTopic = 100;
412
    ChatRecommendBean chatRecommendBean = null;
413
414
    @Override
415
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
416
        super.onActivityResult(requestCode, resultCode, data);
417
        if (requestCode == reqTopic && resultCode == -100) { // 选择话题完成
418
            chatRecommendBean = (ChatRecommendBean) data.getSerializableExtra("topic");
419
            if (chatRecommendBean != null) {
420
                mPublishtopicChooseTopic.setText(Html.fromHtml(chatRecommendBean.name));
421
                mPublishTopicDe.setVisibility(View.VISIBLE);
422
            }
423
        } else if (requestCode == PictureConfig.CHOOSE_REQUEST && resultCode == RESULT_OK) {
424
            List<LocalMedia> selectList = PictureSelector.obtainMultipleResult(data);
425
            if (selectList != null && selectList.size() > 0) {
426
                MobclickAgent.onEvent(getApplicationContext(), "1010");
427
                media = selectList.get(0);
428
429
                String deviceId = JPushInterface.getUdid(MainApplication.context);
430
                fileName = DateUtils.getSimpleCurrentDate();
431
                if (TextUtils.isEmpty(deviceId)) {
432
                    fileName += "_" + Util.getRandom(15);
433
                } else {
434
                    fileName += "_" + deviceId;
435
                }
436
                String videoPath = TextUtils.isEmpty(media.getAndroidQToPath()) ? media.getPath() : media.getAndroidQToPath();
437
                if (TextUtils.isEmpty(videoPath)) {
438
                    fileName = "";
439
                } else {
440
                    String suffix = videoPath.substring(videoPath.lastIndexOf(".") + 1);
441
                    fileName += "." + suffix;
442
                }
443
444
                if (TextUtils.isEmpty(videoPath)) {
445
                    return;
446
                }
447
448
                if (!fileIsExists(videoPath)) {
449
                    Log.e("yopic", "文件可能不存在了~");
450
                    return;
451
                }
452
                if (isDestroyed()) {
453
                    return;
454
                }
455
456
                Glide.with(this)
457
                        .load(videoPath)
458
                        .apply(new RequestOptions().centerCrop())
459
                        .into(mItemVideo);
460
                mItemVideoLl.setVisibility(View.VISIBLE);
461
                mPublishtopicGv.setVisibility(View.GONE);
462
                updatePublishBtn();
463
                Log.e("yopic", "TEST===> video path = " + media.getPath()
464
                        + ",  compressPath = " + media.getCompressPath()
465
                        + ", height = " + media.getHeight()
466
                        + ", width = " + media.getWidth());
467
            }
468
469
        }
470
    }
471
472
    public static boolean fileIsExists(String strFile) {
473
        if (TextUtils.isEmpty(strFile)) {
474
            return false;
475
        }
476
        try {
477
            File f = new File(strFile);
478
            if (!f.exists()) {
479
                return false;
480
            }
481
482
        } catch (Exception e) {
483
            return false;
484
        }
485
486
        return true;
487
    }
488
489
    @Override
490
    protected void onResume() {
491
        super.onResume();
492
        MobclickAgent.onResume(this);
493
    }
494
495
    @Override
496
    protected void onPause() {
497
        super.onPause();
498
        MobclickAgent.onPause(this);
499
    }
500
501
    @Override
502
    protected void onDestroy() {
503
        LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver);
504
        super.onDestroy();
505
    }
506
507
    private void showDialogToExit() {
508
509
        String s = mPublishtopicCon.getText().toString().trim();
510
        if (s.length() > 0 || media != null) {
511
            AlertDialog.Builder builder = new AlertDialog.Builder(PublishVideoTopicActivity.this);
512
            builder.setTitle("离开发布页");
513
            builder.setMessage("小主您是否要离开发布页呢?");
514
            builder.setCancelable(false);
515
            builder.setPositiveButton("是", new DialogInterface.OnClickListener() {
516
                @Override
517
                public void onClick(DialogInterface dialog, int which) {
518
                    MobclickAgent.onEvent(getApplicationContext(), "1006");
519
                    finish();
520
                }
521
            });
522
            builder.setNegativeButton("继续编辑", null);
523
            builder.create().show();
524
        } else {
525
            MobclickAgent.onEvent(getApplicationContext(), "1006");
526
            finish();
527
        }
528
    }
529
530
    @Override
531
    public boolean onKeyUp(int keyCode, KeyEvent event) {
532
        if (keyCode == KeyEvent.KEYCODE_BACK) {
533
            showDialogToExit();
534
            return true;
535
        }
536
        return false;
537
    }
538
}

+ 71 - 81
app/src/main/java/com/electric/chargingpile/activity/ShareTwoActivity.java

@ -1,5 +1,8 @@
1 1
package com.electric.chargingpile.activity;
2 2
3
import static com.hjq.permissions.Permission.CAMERA;
4
import static com.hjq.permissions.Permission.READ_MEDIA_IMAGES;
5
3 6
import android.Manifest;
4 7
import android.annotation.SuppressLint;
5 8
import android.app.Activity;
@ -17,6 +20,7 @@ import android.os.Build;
17 20
import android.os.Bundle;
18 21
import android.os.Handler;
19 22
import android.os.Message;
23
import android.provider.MediaStore;
20 24
import android.util.Base64;
21 25
import android.util.Log;
22 26
import android.view.KeyEvent;
@ -54,9 +58,13 @@ import com.electric.chargingpile.util.BarColorUtil;
54 58
import com.electric.chargingpile.util.Bimp;
55 59
import com.electric.chargingpile.util.DES3;
56 60
import com.electric.chargingpile.util.DensityUtil;
61
import com.electric.chargingpile.util.ImageFileCompressEngine;
57 62
import com.electric.chargingpile.util.ImageItem;
58 63
import com.electric.chargingpile.util.JsonUtils;
64
import com.electric.chargingpile.util.MeOnCameraInterceptListener;
65
import com.electric.chargingpile.util.MeSandboxFileEngine;
59 66
import com.electric.chargingpile.util.OkHttpUtil;
67
import com.electric.chargingpile.util.PictureUtlis;
60 68
import com.electric.chargingpile.util.PublicWayFour;
61 69
import com.electric.chargingpile.util.Res;
62 70
import com.electric.chargingpile.util.SharedPreferencesUtil;
@ -67,10 +75,15 @@ import com.electric.chargingpile.view.CustomProgressDialog;
67 75
import com.electric.chargingpile.view.ShareDialog;
68 76
import com.google.gson.Gson;
69 77
import com.google.gson.reflect.TypeToken;
70
import com.luck.picture.lib.PictureSelector;
78
79
import com.hjq.permissions.OnPermissionCallback;
80
import com.hjq.permissions.XXPermissions;
71 81
import com.luck.picture.lib.animators.AnimationType;
82
import com.luck.picture.lib.basic.PictureSelector;
72 83
import com.luck.picture.lib.config.PictureConfig;
73 84
import com.luck.picture.lib.config.PictureMimeType;
85
import com.luck.picture.lib.config.SelectMimeType;
86
import com.luck.picture.lib.config.SelectModeConfig;
74 87
import com.luck.picture.lib.entity.LocalMedia;
75 88
import com.squareup.okhttp.Request;
76 89
import com.squareup.okhttp.Response;
@ -102,7 +115,7 @@ import okhttp3.Call;
102 115
import pub.devrel.easypermissions.AfterPermissionGranted;
103 116
import pub.devrel.easypermissions.EasyPermissions;
104 117
105
public class ShareTwoActivity extends Activity implements View.OnClickListener, EasyPermissions.PermissionCallbacks {
118
public class ShareTwoActivity extends Activity implements View.OnClickListener {
106 119
    private static final String TAG = "ShareTwoActivity";
107 120
    private static final int PIC_NUM = 4;
108 121
    private ImageView ivBack, ivType;
@ -344,35 +357,36 @@ public class ShareTwoActivity extends Activity implements View.OnClickListener,
344 357
     * 调用图库选择
345 358
     */
346 359
    private void callGallery() {
347
/*
348
        Matisse.from(ShareTwoActivity.this)
349
                .choose(MimeType.of(MimeType.JPEG, MimeType.PNG, MimeType.GIF))
350
                .showSingleMediaType(true)
351
                .countable(true)
352
                .maxSelectable(1)
353
                .capture(true)
354
                .captureStrategy(new CaptureStrategy(true, "com.electric.chargingpile.provider"))
355
                .imageEngine(new GlideEngine())
356
                .forResult(REQUEST_CODE_CHOOSE);
357
*/
358 360
        PictureSelector.create(this)
359
                .openGallery(PictureMimeType.ofImage())
360
                .selectionMode(PictureConfig.SINGLE)
361
                .isCompress(true)//是否压缩
362
                .isSingleDirectReturn(true)
363
                .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
364
                .isGif(true)//是否显示gif
365
                .isAndroidQTransform(true)
366
                .imageEngine(GlideEngine.createGlideEngine())
367
                .isWeChatStyle(false)// 是否开启微信图片选择风格
368
                .isUseCustomCamera(false)// 是否使用自定义相机
369
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
370
                .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
371
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
372
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
373
                .imageSpanCount(4)// 每行显示个数
374
                .isReturnEmpty(false)// 未选择数据时点击按钮是否可以返回
375
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
361
                .openGallery(SelectMimeType.ofImage())
362
                .setSelectorUIStyle(PictureUtlis.getStyle())
363
                .setImageEngine(GlideEngine.createGlideEngine())
364
                .setCompressEngine(new ImageFileCompressEngine()) //设置压缩
365
                .setSandboxFileEngine(new MeSandboxFileEngine()) //设置相册沙盒目录拷贝引擎
366
                .setCameraInterceptListener(new MeOnCameraInterceptListener())
367
                .setSelectionMode(SelectModeConfig.SINGLE)
368
                .setMaxSelectNum(1)
369
                .isEmptyResultReturn(true) //支持未选择返回
370
                .setImageSpanCount(4)
371
                .isPageStrategy(true)   // 是否开启分页模式
372
                .isDisplayCamera(true) //是否显示相机入口
373
                .isPreviewFullScreenMode(true)//预览点击全屏效果
374
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
375
                .isEmptyResultReturn(true)//支持未选择返回
376
                .isWithSelectVideoImage(false)//是否支持视频图片同选
377
                .isSelectZoomAnim(true)// 选择缩略图缩放效果
378
                .isCameraAroundState(false)// 是否开启前置摄像头;系统相机 只支持部分机型
379
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
380
                .isGif(false)// 是否显示gif文件
381
                .isWebp(true)// 是否显示webp文件
382
                .isBmp(true)//是否显示bmp文件
383
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
384
                .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
385
                .isFastSlidingSelect(true) //快速滑动选择
386
                .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回
387
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
388
                .isPreviewImage(true)//是否预览图片
389
                .setFilterMinFileSize(1) //过滤最小文件
376 390
                .forResult(REQUEST_CODE_CHOOSE);
377 391
    }
378 392
@ -403,22 +417,9 @@ public class ShareTwoActivity extends Activity implements View.OnClickListener,
403 417
            public void subscribe(ObservableEmitter<String> subscriber) throws Exception {
404 418
405 419
                try {
406
                    List<LocalMedia> mediaList = PictureSelector.obtainMultipleResult(data);
420
                    List<LocalMedia> mediaList = PictureSelector.obtainSelectorList(data);
407 421
                    if (mediaList!=null && mediaList.size()>0){
408
                       /* List<Uri> uriList = Matisse.obtainResult(data);
409
                        Uri uri = uriList.get(0);
410
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
411
                        File file = FileUtils.from(ShareTwoActivity.this, uri);
412
413
                        bitmap = FileUtils.rotateIfRequired(file, bitmap);
414
                        bitmap = imageZoom(bitmap);
415
*/
416
                        String path="";
417
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
418
                            path= mediaList.get(0).getAndroidQToPath();
419
                        }else{
420
                            path=mediaList.get(0).getPath();
421
                        }
422
                        String path = Util.getCompressAbsolutePath(mediaList.get(0));
422 423
                        ImageItem takePhoto = new ImageItem();
423 424
                        takePhoto.setBitmap(imageZoom(BitmapFactory.decodeFile(path)));
424 425
                        selectBitmap[selectIndex] = takePhoto;
@ -953,48 +954,37 @@ public class ShareTwoActivity extends Activity implements View.OnClickListener,
953 954
        }
954 955
    }
955 956
956
    @Override
957
    public void onRequestPermissionsResult(int requestCode,
958
                                           @NonNull String[] permissions,
959
                                           @NonNull int[] grantResults) {
960
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
961
962
        // EasyPermissions handles the request result.
963
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
964
    }
965
966
    @Override
967
    public void onPermissionsGranted(int requestCode, List<String> perms) {
968 957
969
    }
970 958
971
    @Override
972
    public void onPermissionsDenied(int requestCode, List<String> perms) {
973
974
    }
975 959
976
    @AfterPermissionGranted(RC_ALBUM_PERM)
977 960
    public void permissionTask() {
978
        if (isPermissionOK()) {
979
            callGallery();
980
        } else {
981
            // Ask for one permission
982
            EasyPermissions.requestPermissions(
983
                    this, "充电桩想要获取您的图片读取权限,是否允许?",
984
                    RC_ALBUM_PERM,
985
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
986
                    Manifest.permission.READ_EXTERNAL_STORAGE,
987
                    Manifest.permission.CAMERA);
988
        }
961
        String[] callPhone  =
962
                new String[]{READ_MEDIA_IMAGES, CAMERA};
963
        XXPermissions.with(this)
964
                // 申请单个权限
965
                .permission(callPhone)
966
                .request(new OnPermissionCallback() {
967
                    @Override
968
                    public void onGranted(List<String> permissions, boolean all) {
969
                        if (all) {
970
                            callGallery();
971
                        }else{
972
                            ToastUtil.showToast(getApplicationContext(), "获取部分权限成功,但部分权限未正常授予", Toast.LENGTH_SHORT);
973
                        }
974
                    }
975
                    @Override
976
                    public void onDenied(List<String> permissions, boolean never) {
977
                        if (never) {
978
                            // 如果是被永久拒绝就跳转到应用权限系统设置页面
979
                            XXPermissions.startPermissionActivity(ShareTwoActivity.this, permissions);
980
                        } else {
981
                            ToastUtil.showToast(getApplicationContext(), "获取权限失败", Toast.LENGTH_SHORT);
982
                        }
983
                    }
984
                });
989 985
    }
990 986
991
    private boolean isPermissionOK() {
992
        return EasyPermissions.hasPermissions(this,
993
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
994
                Manifest.permission.READ_EXTERNAL_STORAGE,
995
                Manifest.permission.CAMERA
996
        );
997
    }
987
998 988
999 989
    @SuppressLint("HandlerLeak")
1000 990
    public class GridAdapter extends BaseAdapter {

+ 71 - 73
app/src/main/java/com/electric/chargingpile/activity/ShareTwoEditActivity.java

@ -1,5 +1,8 @@
1 1
package com.electric.chargingpile.activity;
2 2
3
import static com.hjq.permissions.Permission.CAMERA;
4
import static com.hjq.permissions.Permission.READ_MEDIA_IMAGES;
5
3 6
import android.Manifest;
4 7
import android.app.Activity;
5 8
import android.app.ProgressDialog;
@ -50,11 +53,16 @@ import com.electric.chargingpile.application.MainApplication;
50 53
import com.electric.chargingpile.data.Zhan;
51 54
import com.electric.chargingpile.engine.GlideEngine;
52 55
import com.electric.chargingpile.util.BarColorUtil;
56
import com.electric.chargingpile.util.Bimp;
53 57
import com.electric.chargingpile.util.DES3;
54 58
import com.electric.chargingpile.util.DensityUtil;
59
import com.electric.chargingpile.util.ImageFileCompressEngine;
55 60
import com.electric.chargingpile.util.ImageItem;
56 61
import com.electric.chargingpile.util.JsonUtils;
62
import com.electric.chargingpile.util.MeOnCameraInterceptListener;
63
import com.electric.chargingpile.util.MeSandboxFileEngine;
57 64
import com.electric.chargingpile.util.OkHttpUtil;
65
import com.electric.chargingpile.util.PictureUtlis;
58 66
import com.electric.chargingpile.util.PublicWayFour;
59 67
import com.electric.chargingpile.util.Res;
60 68
import com.electric.chargingpile.util.SharedPreferencesUtil;
@ -63,10 +71,15 @@ import com.electric.chargingpile.util.UploadUtil;
63 71
import com.electric.chargingpile.util.Util;
64 72
import com.electric.chargingpile.view.CustomProgressDialog;
65 73
import com.electric.chargingpile.view.ShareDialog;
66
import com.luck.picture.lib.PictureSelector;
74
75
import com.hjq.permissions.OnPermissionCallback;
76
import com.hjq.permissions.XXPermissions;
67 77
import com.luck.picture.lib.animators.AnimationType;
78
import com.luck.picture.lib.basic.PictureSelector;
68 79
import com.luck.picture.lib.config.PictureConfig;
69 80
import com.luck.picture.lib.config.PictureMimeType;
81
import com.luck.picture.lib.config.SelectMimeType;
82
import com.luck.picture.lib.config.SelectModeConfig;
70 83
import com.luck.picture.lib.entity.LocalMedia;
71 84
import com.squareup.okhttp.Request;
72 85
import com.squareup.okhttp.Response;
@ -101,7 +114,7 @@ import okhttp3.Call;
101 114
import pub.devrel.easypermissions.AfterPermissionGranted;
102 115
import pub.devrel.easypermissions.EasyPermissions;
103 116
104
public class ShareTwoEditActivity extends Activity implements View.OnClickListener, EasyPermissions.PermissionCallbacks {
117
public class ShareTwoEditActivity extends Activity implements View.OnClickListener{
105 118
    private static final String TAG = "ShareTwoActivity";
106 119
    private static final int PIC_NUM = 4;
107 120
    private ImageView ivBack, ivType;
@ -299,35 +312,36 @@ public class ShareTwoEditActivity extends Activity implements View.OnClickListen
299 312
     * 调用图库选择
300 313
     */
301 314
    private void callGallery() {
302
/*
303
        Matisse.from(ShareTwoEditActivity.this)
304
                .choose(MimeType.of(MimeType.JPEG, MimeType.PNG, MimeType.GIF))
305
                .showSingleMediaType(true)
306
                .countable(true)
307
                .maxSelectable(1)
308
                .capture(true)
309
                .captureStrategy(new CaptureStrategy(true, "com.electric.chargingpile.provider"))
310
                .imageEngine(new GlideEngine())
311
                .forResult(REQUEST_CODE_CHOOSE);
312
*/
313 315
        PictureSelector.create(this)
314
                .openGallery(PictureMimeType.ofImage())
315
                .selectionMode(PictureConfig.SINGLE)
316
                .isSingleDirectReturn(true)
317
                .isCompress(true)//是否压缩
318
                .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
319
                .isGif(true)//是否显示gif
320
                .isAndroidQTransform(true)
321
                .imageEngine(GlideEngine.createGlideEngine())
322
                .isWeChatStyle(false)// 是否开启微信图片选择风格
323
                .isUseCustomCamera(false)// 是否使用自定义相机
324
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
325
                .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
326
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
327
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
328
                .imageSpanCount(4)// 每行显示个数
329
                .isReturnEmpty(false)// 未选择数据时点击按钮是否可以返回
330
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
316
                .openGallery(SelectMimeType.ofImage())
317
                .setSelectorUIStyle(PictureUtlis.getStyle())
318
                .setImageEngine(GlideEngine.createGlideEngine())
319
                .setCompressEngine(new ImageFileCompressEngine()) //设置压缩
320
                .setSandboxFileEngine(new MeSandboxFileEngine()) //设置相册沙盒目录拷贝引擎
321
                .setCameraInterceptListener(new MeOnCameraInterceptListener())
322
                .setSelectionMode(SelectModeConfig.SINGLE)
323
                .setMaxSelectNum(1)
324
                .isEmptyResultReturn(true) //支持未选择返回
325
                .setImageSpanCount(4)
326
                .isPageStrategy(true)   // 是否开启分页模式
327
                .isDisplayCamera(true) //是否显示相机入口
328
                .isPreviewFullScreenMode(true)//预览点击全屏效果
329
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
330
                .isEmptyResultReturn(true)//支持未选择返回
331
                .isWithSelectVideoImage(false)//是否支持视频图片同选
332
                .isSelectZoomAnim(true)// 选择缩略图缩放效果
333
                .isCameraAroundState(false)// 是否开启前置摄像头;系统相机 只支持部分机型
334
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
335
                .isGif(false)// 是否显示gif文件
336
                .isWebp(true)// 是否显示webp文件
337
                .isBmp(true)//是否显示bmp文件
338
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
339
                .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
340
                .isFastSlidingSelect(true) //快速滑动选择
341
                .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回
342
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
343
                .isPreviewImage(true)//是否预览图片
344
                .setFilterMinFileSize(1) //过滤最小文件
331 345
                .forResult(REQUEST_CODE_CHOOSE);
332 346
333 347
    }
@ -358,22 +372,9 @@ public class ShareTwoEditActivity extends Activity implements View.OnClickListen
358 372
            @Override
359 373
            public void subscribe(ObservableEmitter<String> subscriber) throws Exception {
360 374
                try {
361
                    List<LocalMedia> mediaList = PictureSelector.obtainMultipleResult(data);
375
                    List<LocalMedia> mediaList = PictureSelector.obtainSelectorList(data);
362 376
                    if (mediaList!=null && mediaList.size()>0){
363
                      /*  List<Uri> uriList = Matisse.obtainResult(data);
364
                        Uri uri = uriList.get(0);
365
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
366
                        File file = FileUtils.from(ShareTwoEditActivity.this, uri);
367
368
                        bitmap = FileUtils.rotateIfRequired(file, bitmap);
369
                        bitmap = imageZoom(bitmap);
370
*/
371
                        String path="";
372
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
373
                            path= mediaList.get(0).getAndroidQToPath();
374
                        }else{
375
                            path=mediaList.get(0).getPath();
376
                        }
377
                        String path = Util.getCompressAbsolutePath(mediaList.get(0));
377 378
                        ImageItem takePhoto = new ImageItem();
378 379
                        takePhoto.setBitmap(imageZoom(BitmapFactory.decodeFile(path)));
379 380
                        selectBitmap[selectIndex] = takePhoto;
@ -922,39 +923,36 @@ public class ShareTwoEditActivity extends Activity implements View.OnClickListen
922 923
        }
923 924
    }
924 925
925
    @Override
926
    public void onRequestPermissionsResult(int requestCode,
927
                                           @NonNull String[] permissions,
928
                                           @NonNull int[] grantResults) {
929
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
930 926
931
        // EasyPermissions handles the request result.
932
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
933
    }
934 927
935
    @Override
936
    public void onPermissionsGranted(int requestCode, List<String> perms) {
937
938
    }
939 928
940
    @Override
941
    public void onPermissionsDenied(int requestCode, List<String> perms) {
929
    public void permissionTask() {
942 930
943
    }
931
        String[] callPhone  =
932
                new String[]{READ_MEDIA_IMAGES, CAMERA};
933
        XXPermissions.with(this)
934
                // 申请单个权限
935
                .permission(callPhone)
936
                .request(new OnPermissionCallback() {
937
                    @Override
938
                    public void onGranted(List<String> permissions, boolean all) {
939
                        if (all) {
940
                            callGallery();
941
                        }else{
942
                            ToastUtil.showToast(getApplicationContext(), "获取部分权限成功,但部分权限未正常授予", Toast.LENGTH_SHORT);
943
                        }
944
                    }
945
                    @Override
946
                    public void onDenied(List<String> permissions, boolean never) {
947
                        if (never) {
948
                            // 如果是被永久拒绝就跳转到应用权限系统设置页面
949
                            XXPermissions.startPermissionActivity(ShareTwoEditActivity.this, permissions);
950
                        } else {
951
                            ToastUtil.showToast(getApplicationContext(), "获取权限失败", Toast.LENGTH_SHORT);
952
                        }
953
                    }
954
                });
944 955
945
    @AfterPermissionGranted(RC_ALBUM_PERM)
946
    public void permissionTask() {
947
        if (isPermissionOK()) {
948
            callGallery();
949
        } else {
950
            // Ask for one permission
951
            EasyPermissions.requestPermissions(
952
                    this, "充电桩想要获取您的图片读取权限,是否允许?",
953
                    RC_ALBUM_PERM,
954
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
955
                    Manifest.permission.READ_EXTERNAL_STORAGE,
956
                    Manifest.permission.CAMERA);
957
        }
958 956
    }
959 957
960 958
    private boolean isPermissionOK() {

+ 102 - 95
app/src/main/java/com/electric/chargingpile/activity/SkipUserInfoActivity.java

@ -1,5 +1,8 @@
1 1
package com.electric.chargingpile.activity;
2 2
3
import static com.hjq.permissions.Permission.CAMERA;
4
import static com.hjq.permissions.Permission.READ_MEDIA_IMAGES;
5
3 6
import android.Manifest;
4 7
import android.app.Activity;
5 8
import android.content.Context;
@ -54,12 +57,17 @@ import com.electric.chargingpile.manager.ProfileManager;
54 57
import com.electric.chargingpile.util.ActivityManagerApplication;
55 58
import com.electric.chargingpile.util.BarColorUtil;
56 59
import com.electric.chargingpile.util.DES3;
60
import com.electric.chargingpile.util.ImageCropEngine;
61
import com.electric.chargingpile.util.ImageFileCompressEngine;
57 62
import com.electric.chargingpile.util.ImageTools;
58 63
import com.electric.chargingpile.util.JsonUtils;
59 64
import com.electric.chargingpile.util.LoadingDialog;
60 65
import com.electric.chargingpile.util.LogUtils;
66
import com.electric.chargingpile.util.MeOnCameraInterceptListener;
67
import com.electric.chargingpile.util.MeSandboxFileEngine;
61 68
import com.electric.chargingpile.util.OkHttpUtil;
62 69
import com.electric.chargingpile.util.PhotoUtils;
70
import com.electric.chargingpile.util.PictureUtlis;
63 71
import com.electric.chargingpile.util.StatusConstants;
64 72
import com.electric.chargingpile.util.ToastUtil;
65 73
import com.electric.chargingpile.util.UploadUtil;
@ -68,10 +76,15 @@ import com.electric.chargingpile.view.CustomProgressDialog;
68 76
import com.electric.chargingpile.view.RoundImageView;
69 77
import com.electric.chargingpile.view.xrichtext.SDCardUtil;
70 78
import com.google.gson.Gson;
71
import com.luck.picture.lib.PictureSelector;
79
80
import com.hjq.permissions.OnPermissionCallback;
81
import com.hjq.permissions.XXPermissions;
72 82
import com.luck.picture.lib.animators.AnimationType;
83
import com.luck.picture.lib.basic.PictureSelector;
73 84
import com.luck.picture.lib.config.PictureConfig;
74 85
import com.luck.picture.lib.config.PictureMimeType;
86
import com.luck.picture.lib.config.SelectMimeType;
87
import com.luck.picture.lib.config.SelectModeConfig;
75 88
import com.luck.picture.lib.entity.LocalMedia;
76 89
import com.squareup.okhttp.Request;
77 90
import com.squareup.okhttp.Response;
@ -102,7 +115,7 @@ import pub.devrel.easypermissions.AfterPermissionGranted;
102 115
import pub.devrel.easypermissions.EasyPermissions;
103 116
104 117
105
public class SkipUserInfoActivity extends Activity implements View.OnClickListener, EasyPermissions.PermissionCallbacks {
118
public class SkipUserInfoActivity extends Activity implements View.OnClickListener {
106 119
    private ImageView back;
107 120
    private EditText et_nickName;
108 121
    private EditText et_realName;
@ -293,15 +306,6 @@ public class SkipUserInfoActivity extends Activity implements View.OnClickListen
293 306
        spinnerCity.setOnItemSelectedListener(new CityAdapter());
294 307
    }
295 308
296
    @Override
297
    public void onPermissionsGranted(int requestCode, List<String> perms) {
298
299
    }
300
301
    @Override
302
    public void onPermissionsDenied(int requestCode, List<String> perms) {
303
304
    }
305 309
306 310
    private void showWindow() {
307 311
        LayoutInflater inflater = (LayoutInflater) getSystemService(mContext.LAYOUT_INFLATER_SERVICE);
@ -369,31 +373,35 @@ public class SkipUserInfoActivity extends Activity implements View.OnClickListen
369 373
        popupWindow.showAtLocation(cancleButton, Gravity.CENTER, 0, 0);
370 374
    }
371 375
372
    @AfterPermissionGranted(RC_CAMERA_PERM)
376
373 377
    public void cameraTask() {
374
        if (hasCameraPermission()) {
375
            // Have permission, do the thing!
376
//            Toast.makeText(this, "TODO: Camera things", Toast.LENGTH_LONG).show();
377
            showWindow();
378
        } else {
379
            // Ask for one permission
380
            EasyPermissions.requestPermissions(
381
                    this,
382
                    "充电桩需要获取您相关权限,是否允许?",
383
                    RC_CAMERA_PERM,
384
                    Manifest.permission.CAMERA,
385
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
386
                    Manifest.permission.READ_EXTERNAL_STORAGE);
387
        }
378
        String[] callPhone  =
379
                new String[]{READ_MEDIA_IMAGES, CAMERA};
380
        XXPermissions.with(this)
381
                // 申请单个权限
382
                .permission(callPhone)
383
                .request(new OnPermissionCallback() {
384
                    @Override
385
                    public void onGranted(List<String> permissions, boolean all) {
386
                        if (all) {
387
                            showWindow();
388
                        }else{
389
                            ToastUtil.showToast(getApplicationContext(), "获取部分权限成功,但部分权限未正常授予", Toast.LENGTH_SHORT);
390
                        }
391
                    }
392
                    @Override
393
                    public void onDenied(List<String> permissions, boolean never) {
394
                        if (never) {
395
                            // 如果是被永久拒绝就跳转到应用权限系统设置页面
396
                            XXPermissions.startPermissionActivity(SkipUserInfoActivity.this, permissions);
397
                        } else {
398
                            ToastUtil.showToast(getApplicationContext(), "获取权限失败", Toast.LENGTH_SHORT);
399
                        }
400
                    }
401
                });
388 402
    }
389 403
390
    private boolean hasCameraPermission() {
391
        return EasyPermissions.hasPermissions(this,
392
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
393
                Manifest.permission.READ_EXTERNAL_STORAGE,
394
                Manifest.permission.CAMERA
395
        );
396
    }
404
397 405
398 406
    class ProvinceAdapter implements AdapterView.OnItemSelectedListener {
399 407
@ -515,65 +523,69 @@ public class SkipUserInfoActivity extends Activity implements View.OnClickListen
515 523
     */
516 524
    public void takePhoto(View view) {
517 525
        PictureSelector.create(this)
518
                .openCamera(PictureMimeType.ofImage())
519
                .selectionMode(PictureConfig.SINGLE)
520
                .isSingleDirectReturn(true)
521
                .isCompress(true)//是否压缩
522
                .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
523
                .isGif(false)//是否显示gif
524
                .isAndroidQTransform(true)
525
                .imageEngine(GlideEngine.createGlideEngine())
526
                .isWeChatStyle(false)// 是否开启微信图片选择风格
527
                .isUseCustomCamera(false)// 是否使用自定义相机
528
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
529
                .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
530
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
531
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
532
                .imageSpanCount(4)// 每行显示个数
533
                .isReturnEmpty(false)// 未选择数据时点击按钮是否可以返回
534
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
535
                .isEnableCrop(true)
536
                .rotateEnabled(false)//裁剪是否可旋转图片
537
                .setCircleStrokeWidth(8)//设置圆形裁剪边框粗细
538
                .freeStyleCropEnabled(true)// 裁剪框拖动模式
539
                //.isCropDragSmoothToCenter(true)// 裁剪框拖动时图片自动跟随居中
540
                .circleDimmedLayer(true)// 是否开启圆形裁剪
541
                .isDragFrame(true)//是否可拖动裁剪框(固定)
542
                .showCropFrame(false)// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
543
                .showCropGrid(false)//是否显示裁剪矩形网格 圆形裁剪时建议设为false
526
                .openGallery(SelectMimeType.ofImage())
527
                .setSelectorUIStyle(PictureUtlis.getStyle())
528
                .setImageEngine(GlideEngine.createGlideEngine())
529
                .setCompressEngine(new ImageFileCompressEngine()) //设置压缩
530
                .setSandboxFileEngine(new MeSandboxFileEngine()) //设置相册沙盒目录拷贝引擎
531
                .setCameraInterceptListener(new MeOnCameraInterceptListener())
532
                .setSelectionMode(SelectModeConfig.SINGLE)
533
                .setMaxSelectNum(1)
534
                .isEmptyResultReturn(true) //支持未选择返回
535
                .setImageSpanCount(4)
536
                .isPageStrategy(true)   // 是否开启分页模式
537
                .isDisplayCamera(true) //是否显示相机入口
538
                .isPreviewFullScreenMode(true)//预览点击全屏效果
539
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
540
                .isEmptyResultReturn(true)//支持未选择返回
541
                .isWithSelectVideoImage(false)//是否支持视频图片同选
542
                .isSelectZoomAnim(true)// 选择缩略图缩放效果
543
                .isCameraAroundState(false)// 是否开启前置摄像头;系统相机 只支持部分机型
544
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
545
                .isGif(false)// 是否显示gif文件
546
                .isWebp(true)// 是否显示webp文件
547
                .isBmp(true)//是否显示bmp文件
548
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
549
                .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
550
                .isFastSlidingSelect(true) //快速滑动选择
551
                .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回
552
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
553
                .isPreviewImage(true)//是否预览图片
554
                .setCropEngine(new ImageCropEngine(1F,1F,true))
555
                .setFilterMinFileSize(1) //过滤最小文件
544 556
                .forResult(2);
545
546 557
    }
547 558
    private void openPhotoAlbum() {
548 559
        PictureSelector.create(this)
549
                .openGallery(PictureMimeType.ofImage())
550
                .isCamera(false)//列表是否显示拍照按钮
551
                .selectionMode(PictureConfig.SINGLE)
552
                .isSingleDirectReturn(true)//PictureConfig.SINGLE模式下是否直接返回
553
                .isCompress(true)//是否压缩
554
                .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
555
                .isGif(false)//是否显示gif
556
                .isAndroidQTransform(true)
557
                .imageEngine(GlideEngine.createGlideEngine())
558
                .isWeChatStyle(false)// 是否开启微信图片选择风格
559
                .isUseCustomCamera(false)// 是否使用自定义相机
560
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
561
                .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
562
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
563
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
564
                .imageSpanCount(4)// 每行显示个数
565
                .isReturnEmpty(false)// 选择数据时点击按钮是否可以返回
566
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
567
                .rotateEnabled(false)//裁剪是否可旋转图片
568
                .isEnableCrop(true)
569
                .rotateEnabled(false)//裁剪是否可旋转图片
570
                .setCircleStrokeWidth(8)//设置圆形裁剪边框粗细
571
                .freeStyleCropEnabled(true)// 裁剪框拖动模式
572
                //.isCropDragSmoothToCenter(true)// 裁剪框拖动时图片自动跟随居中
573
                .circleDimmedLayer(true)// 是否开启圆形裁剪
574
                .isDragFrame(true)//是否可拖动裁剪框(固定)
575
                .showCropFrame(false)// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
576
                .showCropGrid(false)//是否显示裁剪矩形网格 圆形裁剪时建议设为false
560
                .openGallery(SelectMimeType.ofImage())
561
                .setSelectorUIStyle(PictureUtlis.getStyle())
562
                .setImageEngine(GlideEngine.createGlideEngine())
563
                .setCompressEngine(new ImageFileCompressEngine()) //设置压缩
564
                .setSandboxFileEngine(new MeSandboxFileEngine()) //设置相册沙盒目录拷贝引擎
565
                .setCameraInterceptListener(new MeOnCameraInterceptListener())
566
                .setSelectionMode(SelectModeConfig.SINGLE)
567
                .setMaxSelectNum(1)
568
                .isEmptyResultReturn(true) //支持未选择返回
569
                .setImageSpanCount(4)
570
                .isPageStrategy(true)   // 是否开启分页模式
571
                .isDisplayCamera(true) //是否显示相机入口
572
                .isPreviewFullScreenMode(true)//预览点击全屏效果
573
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
574
                .isEmptyResultReturn(true)//支持未选择返回
575
                .isWithSelectVideoImage(false)//是否支持视频图片同选
576
                .isSelectZoomAnim(true)// 选择缩略图缩放效果
577
                .isCameraAroundState(false)// 是否开启前置摄像头;系统相机 只支持部分机型
578
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
579
                .isGif(false)// 是否显示gif文件
580
                .isWebp(true)// 是否显示webp文件
581
                .isBmp(true)//是否显示bmp文件
582
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
583
                .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
584
                .isFastSlidingSelect(true) //快速滑动选择
585
                .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回
586
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
587
                .isPreviewImage(true)//是否预览图片
588
                .setCropEngine(new ImageCropEngine(1F,1F,true))
577 589
                .forResult(1);
578 590
    }
579 591
@ -735,14 +747,9 @@ public class SkipUserInfoActivity extends Activity implements View.OnClickListen
735 747
        ;
736 748
    }
737 749
    private void activityResult(Intent data) {
738
        List<LocalMedia> medias = PictureSelector.obtainMultipleResult(data);
750
        List<LocalMedia> medias = PictureSelector.obtainSelectorList(data);
739 751
        if (medias != null && medias.size() > 0) {
740
            String path = "";
741
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
742
                path = medias.get(0).getAndroidQToPath();
743
            } else {
744
                path = medias.get(0).getPath();
745
            }
752
            String path = Util.getCompressAbsolutePath(medias.get(0));
746 753
            photo = imageZoom(BitmapFactory.decodeFile(path));
747 754
            if (photo != null) {
748 755
                iconPic.setImageBitmap(photo);

+ 7 - 7
app/src/main/java/com/electric/chargingpile/activity/TopicDetailActivity.java

@ -263,13 +263,13 @@ public class TopicDetailActivity extends AppCompatActivity implements View.OnCli
263 263
                String code = JsonUtils.getKeyResult(response, "code");
264 264
                String desc = JsonUtils.getKeyResult(response, "desc");
265 265
                if ("1000".equals(code)) {
266
                    Intent intent = new Intent(getApplicationContext(), PublishItemsActivity.class);
267
                    PublishItemSerializable intentData = new PublishItemSerializable();
268
                    intentData.setFrom(PublishItemsActivity.FROM_TOPIC_DETAIL);
269
                    intentData.setTopicId(homePageBean.topicVo.topicId);
270
                    intentData.setName(homePageBean.topicVo.name);
271
                    intent.putExtra("intent_data", intentData);
272
                    startActivity(intent);
266
//                    Intent intent = new Intent(getApplicationContext(), PublishItemsActivity.class);
267
//                    PublishItemSerializable intentData = new PublishItemSerializable();
268
//                    intentData.setFrom(PublishItemsActivity.FROM_TOPIC_DETAIL);
269
//                    intentData.setTopicId(homePageBean.topicVo.topicId);
270
//                    intentData.setName(homePageBean.topicVo.name);
271
//                    intent.putExtra("intent_data", intentData);
272
//                    startActivity(intent);
273 273
                } else if ("8010".equals(code)) {
274 274
                    startActivity(new Intent(getApplicationContext(), LoginActivity.class));
275 275
                    ToastUtil.showToast(getApplicationContext(), desc, Toast.LENGTH_LONG);

+ 104 - 74
app/src/main/java/com/electric/chargingpile/activity/UserInfoActivity.java

@ -1,5 +1,8 @@
1 1
package com.electric.chargingpile.activity;
2 2
3
import static com.hjq.permissions.Permission.CAMERA;
4
import static com.hjq.permissions.Permission.READ_MEDIA_IMAGES;
5
3 6
import android.Manifest;
4 7
import android.app.Activity;
5 8
import android.content.Context;
@ -22,6 +25,7 @@ import android.os.Bundle;
22 25
import android.os.Handler;
23 26
import android.os.Looper;
24 27
import android.os.Message;
28
import android.provider.MediaStore;
25 29
import android.text.TextUtils;
26 30
import android.util.Log;
27 31
import android.view.Gravity;
@ -57,11 +61,16 @@ import com.electric.chargingpile.event.CarIntentModelEvent;
57 61
import com.electric.chargingpile.manager.ProfileManager;
58 62
import com.electric.chargingpile.util.BarColorUtil;
59 63
import com.electric.chargingpile.util.DES3;
64
import com.electric.chargingpile.util.ImageCropEngine;
65
import com.electric.chargingpile.util.ImageFileCompressEngine;
60 66
import com.electric.chargingpile.util.JsonUtils;
61 67
import com.electric.chargingpile.util.LoadingDialog;
62 68
import com.electric.chargingpile.util.LogUtils;
69
import com.electric.chargingpile.util.MeOnCameraInterceptListener;
70
import com.electric.chargingpile.util.MeSandboxFileEngine;
63 71
import com.electric.chargingpile.util.OkHttpUtil;
64 72
import com.electric.chargingpile.util.PhotoUtils;
73
import com.electric.chargingpile.util.PictureUtlis;
65 74
import com.electric.chargingpile.util.StatusConstants;
66 75
import com.electric.chargingpile.util.ToastUtil;
67 76
import com.electric.chargingpile.util.UploadUtil;
@ -69,10 +78,15 @@ import com.electric.chargingpile.util.Util;
69 78
import com.electric.chargingpile.view.CustomProgressDialog;
70 79
import com.electric.chargingpile.view.RoundImageView;
71 80
import com.google.gson.Gson;
72
import com.luck.picture.lib.PictureSelector;
81
82
import com.hjq.permissions.OnPermissionCallback;
83
import com.hjq.permissions.XXPermissions;
73 84
import com.luck.picture.lib.animators.AnimationType;
85
import com.luck.picture.lib.basic.PictureSelector;
74 86
import com.luck.picture.lib.config.PictureConfig;
75 87
import com.luck.picture.lib.config.PictureMimeType;
88
import com.luck.picture.lib.config.SelectMimeType;
89
import com.luck.picture.lib.config.SelectModeConfig;
76 90
import com.luck.picture.lib.entity.LocalMedia;
77 91
import com.squareup.okhttp.Request;
78 92
import com.squareup.okhttp.Response;
@ -104,7 +118,7 @@ import pub.devrel.easypermissions.AfterPermissionGranted;
104 118
import pub.devrel.easypermissions.EasyPermissions;
105 119
106 120
107
public class UserInfoActivity extends Activity implements View.OnClickListener, EasyPermissions.PermissionCallbacks {
121
public class UserInfoActivity extends Activity implements View.OnClickListener {
108 122
    private static final String TAG = "UserInfoActivity";
109 123
    private ImageView back;
110 124
    private EditText et_nickName;
@ -322,15 +336,6 @@ public class UserInfoActivity extends Activity implements View.OnClickListener,
322 336
        spinnerCity.setOnItemSelectedListener(new CityAdapter());
323 337
    }
324 338
325
    @Override
326
    public void onPermissionsGranted(int requestCode, List<String> perms) {
327
328
    }
329
330
    @Override
331
    public void onPermissionsDenied(int requestCode, List<String> perms) {
332
333
    }
334 339
335 340
    class ProvinceAdapter implements AdapterView.OnItemSelectedListener {
336 341
@ -579,71 +584,101 @@ public class UserInfoActivity extends Activity implements View.OnClickListener,
579 584
     * @param view
580 585
     */
581 586
    public void takePhoto(View view) {
582
583 587
        PictureSelector.create(this)
584
                .openCamera(PictureMimeType.ofImage())
585
                .selectionMode(PictureConfig.SINGLE)
586
                .isSingleDirectReturn(true)
587
                .isCompress(true)//是否压缩
588
                .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
589
                .isGif(false)//是否显示gif
590
                .isAndroidQTransform(true)
591
                .imageEngine(GlideEngine.createGlideEngine())
592
                .isWeChatStyle(false)// 是否开启微信图片选择风格
593
                .isUseCustomCamera(false)// 是否使用自定义相机
594
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
595
                .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
596
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
597
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
598
                .imageSpanCount(4)// 每行显示个数
599
                .isReturnEmpty(false)// 未选择数据时点击按钮是否可以返回
600
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
601
                .isEnableCrop(true)
602
                .rotateEnabled(false)//裁剪是否可旋转图片
603
                .setCircleStrokeWidth(8)//设置圆形裁剪边框粗细
604
                 .freeStyleCropEnabled(true)// 裁剪框拖动模式
605
                //.isCropDragSmoothToCenter(true)// 裁剪框拖动时图片自动跟随居中
606
                .circleDimmedLayer(true)// 是否开启圆形裁剪
607
                .isDragFrame(true)//是否可拖动裁剪框(固定)
608
                .showCropFrame(false)// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
609
                .showCropGrid(false)//是否显示裁剪矩形网格 圆形裁剪时建议设为false
588
                .openGallery(SelectMimeType.ofImage())
589
                .setSelectorUIStyle(PictureUtlis.getStyle())
590
                .setImageEngine(GlideEngine.createGlideEngine())
591
                .setCompressEngine(new ImageFileCompressEngine()) //设置压缩
592
                .setSandboxFileEngine(new MeSandboxFileEngine()) //设置相册沙盒目录拷贝引擎
593
                .setCameraInterceptListener(new MeOnCameraInterceptListener())
594
                .setSelectionMode(SelectModeConfig.SINGLE)
595
                .setMaxSelectNum(1)
596
                .isEmptyResultReturn(true) //支持未选择返回
597
                .setImageSpanCount(4)
598
                .isPageStrategy(true)   // 是否开启分页模式
599
                .isDisplayCamera(true) //是否显示相机入口
600
                .isPreviewFullScreenMode(true)//预览点击全屏效果
601
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
602
                .isEmptyResultReturn(true)//支持未选择返回
603
                .isWithSelectVideoImage(false)//是否支持视频图片同选
604
                .isSelectZoomAnim(true)// 选择缩略图缩放效果
605
                .isCameraAroundState(false)// 是否开启前置摄像头;系统相机 只支持部分机型
606
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
607
                .isGif(false)// 是否显示gif文件
608
                .isWebp(true)// 是否显示webp文件
609
                .isBmp(true)//是否显示bmp文件
610
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
611
                .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
612
                .isFastSlidingSelect(true) //快速滑动选择
613
                .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回
614
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
615
                .isPreviewImage(true)//是否预览图片
616
                .setCropEngine(new ImageCropEngine(1F,1F,true))
617
                .setFilterMinFileSize(1) //过滤最小文件
610 618
                .forResult(2);
611 619
    }
612 620
    private void openPhotoAlbum() {
613
        PictureSelector.create(UserInfoActivity.this)
614
                .openGallery(PictureMimeType.ofImage())
615
                .isCamera(false)//列表是否显示拍照按钮
616
                .selectionMode(PictureConfig.SINGLE)
617
                .isSingleDirectReturn(true)//PictureConfig.SINGLE模式下是否直接返回
618
                .isCompress(true)//是否压缩
619
                .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
620
                .isGif(false)//是否显示gif
621
                .isAndroidQTransform(true)
622
                .imageEngine(GlideEngine.createGlideEngine())
623
                .isWeChatStyle(false)// 是否开启微信图片选择风格
624
                .isUseCustomCamera(false)// 是否使用自定义相机
625
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
626
                .setPictureStyle(Util.getWhiteStyle(UserInfoActivity.this))// 动态自定义相册主题
627
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
628
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
629
                .imageSpanCount(4)// 每行显示个数
630
                .isReturnEmpty(false)// 选择数据时点击按钮是否可以返回
631
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
632
                .rotateEnabled(false)//裁剪是否可旋转图片
633
                .isEnableCrop(true)
634
                .rotateEnabled(false)//裁剪是否可旋转图片
635
                .setCircleStrokeWidth(8)//设置圆形裁剪边框粗细
636
                 .freeStyleCropEnabled(true)// 裁剪框拖动模式
637
                //.isCropDragSmoothToCenter(true)// 裁剪框拖动时图片自动跟随居中
638
                .circleDimmedLayer(true)// 是否开启圆形裁剪
639
                .isDragFrame(true)//是否可拖动裁剪框(固定)
640
                .showCropFrame(false)// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
641
                .showCropGrid(false)//是否显示裁剪矩形网格 圆形裁剪时建议设为false
621
        PictureSelector.create(this)
622
                .openGallery(SelectMimeType.ofImage())
623
                .setSelectorUIStyle(PictureUtlis.getStyle())
624
                .setImageEngine(GlideEngine.createGlideEngine())
625
                .setCompressEngine(new ImageFileCompressEngine()) //设置压缩
626
                .setSandboxFileEngine(new MeSandboxFileEngine()) //设置相册沙盒目录拷贝引擎
627
                .setCameraInterceptListener(new MeOnCameraInterceptListener())
628
                .setSelectionMode(SelectModeConfig.SINGLE)
629
                .setMaxSelectNum(1)
630
                .isEmptyResultReturn(true) //支持未选择返回
631
                .setImageSpanCount(4)
632
                .isPageStrategy(true)   // 是否开启分页模式
633
                .isDisplayCamera(true) //是否显示相机入口
634
                .isPreviewFullScreenMode(true)//预览点击全屏效果
635
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
636
                .isEmptyResultReturn(true)//支持未选择返回
637
                .isWithSelectVideoImage(false)//是否支持视频图片同选
638
                .isSelectZoomAnim(true)// 选择缩略图缩放效果
639
                .isCameraAroundState(false)// 是否开启前置摄像头;系统相机 只支持部分机型
640
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
641
                .isGif(false)// 是否显示gif文件
642
                .isWebp(true)// 是否显示webp文件
643
                .isBmp(true)//是否显示bmp文件
644
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
645
                .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
646
                .isFastSlidingSelect(true) //快速滑动选择
647
                .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回
648
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
649
                .isPreviewImage(true)//是否预览图片
650
                .setFilterMinFileSize(1) //过滤最小文件
651
                .setCropEngine(new ImageCropEngine(1F,1F,true))
642 652
                .forResult(1);
643 653
    }
644 654
645 655
    @AfterPermissionGranted(RC_CAMERA_PERM)
646 656
    public void cameraTask() {
657
        String[] callPhone  =
658
                new String[]{READ_MEDIA_IMAGES, CAMERA};
659
        XXPermissions.with(this)
660
                // 申请单个权限
661
                .permission(callPhone)
662
                .request(new OnPermissionCallback() {
663
                    @Override
664
                    public void onGranted(List<String> permissions, boolean all) {
665
                        if (all) {
666
                            showWindow();
667
                        }else{
668
                            ToastUtil.showToast(getApplicationContext(), "获取部分权限成功,但部分权限未正常授予", Toast.LENGTH_SHORT);
669
                        }
670
                    }
671
                    @Override
672
                    public void onDenied(List<String> permissions, boolean never) {
673
                        if (never) {
674
                            // 如果是被永久拒绝就跳转到应用权限系统设置页面
675
                            XXPermissions.startPermissionActivity(UserInfoActivity.this, permissions);
676
                        } else {
677
                            ToastUtil.showToast(getApplicationContext(), "获取权限失败", Toast.LENGTH_SHORT);
678
                        }
679
                    }
680
                });
681
647 682
        if (hasCameraPermission()) {
648 683
            showWindow();
649 684
        } else {
@ -769,14 +804,9 @@ public class UserInfoActivity extends Activity implements View.OnClickListener,
769 804
    }
770 805
771 806
    private void activityResult(Intent data) {
772
        List<LocalMedia> medias = PictureSelector.obtainMultipleResult(data);
807
        List<LocalMedia> medias = PictureSelector.obtainSelectorList(data);
773 808
        if (medias != null && medias.size() > 0) {
774
            String path = "";
775
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
776
                path = medias.get(0).getAndroidQToPath();
777
            } else {
778
                path = medias.get(0).getPath();
779
            }
809
            String path = Util.getCompressAbsolutePath(medias.get(0));
780 810
            photo = imageZoom(BitmapFactory.decodeFile(path));
781 811
            if (photo != null) {
782 812
                iconPic.setImageBitmap(photo);

+ 0 - 232
app/src/main/java/com/electric/chargingpile/activity/VideoCompressionActivity.java

@ -1,232 +0,0 @@
1
package com.electric.chargingpile.activity;
2
3
4
import android.view.View;
5
import androidx.appcompat.app.AppCompatActivity;
6
7
8
/*
9
public class VideoCompressionActivity extends AppCompatActivity implements View.OnClickListener {
10
11
    private TextView viewById;
12
    public static final int REQUEST_CODE_CHOOSE = 339;
13
    @Override
14
    protected void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
15
        super.onCreate(savedInstanceState);
16
        setContentView(R.layout.activity_video_compression);
17
        findViewById(R.id.openPhoto).setOnClickListener(this);
18
        findViewById(R.id.videoZip).setOnClickListener(this);
19
        findViewById(R.id.startVideoZip).setOnClickListener(this);
20
        viewById = findViewById(R.id.progress);
21
    }
22
23
    @Override
24
    public void onClick(View v) {
25
        switch (v.getId()){
26
            case R.id.openPhoto:
27
                PictureSelector.create(this)
28
                        .openGallery(PictureMimeType.ofVideo())
29
                        .selectionMode(PictureConfig.SINGLE)
30
                        .isCompress(true)//是否压缩
31
                        .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
32
                        .isGif(true)//是否显示gif
33
                        .isAndroidQTransform(true)
34
                        .imageEngine(GlideEngine.createGlideEngine())
35
                        .isWeChatStyle(false)// 是否开启微信图片选择风格
36
                        .isUseCustomCamera(false)// 是否使用自定义相机
37
                        .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
38
                        .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
39
                        .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
40
                        .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
41
                        .imageSpanCount(4)// 每行显示个数
42
                        .isReturnEmpty(false)// 未选择数据时点击按钮是否可以返回
43
                        .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
44
                        .forResult(REQUEST_CODE_CHOOSE);
45
46
                break;
47
48
            case R.id.videoZip:
49
                Log.e("TAG", "开始");
50
                runFFmpegRxJava();
51
                break;
52
53
            case R.id.startVideoZip:
54
                PictureSelector.create(this)
55
                        .setPictureStyle(Util.getWhiteStyle(this))
56
                        .externalPictureVideo(mResultPath);
57
58
                break;
59
        }
60
    }
61
    private String mPath="";
62
    @Override
63
    protected void onActivityResult(int requestCode, int resultCode, @Nullable @org.jetbrains.annotations.Nullable Intent data) {
64
        super.onActivityResult(requestCode, resultCode, data);
65
        LocalMedia media = PictureSelector.obtainMultipleResult(data).get(0);
66
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
67
            mPath= media.getAndroidQToPath();
68
        }else{
69
            mPath=media.getPath();
70
        }
71
    }
72
73
    private  MyRxFFmpegSubscriber myRxFFmpegSubscriber=null;
74
    private  static String mResultPath=null;
75
    private void runFFmpegRxJava() {
76
77
        MediaMetadataRetriever retriever =new MediaMetadataRetriever();
78
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
79
            Uri newUri  = FileProvider.getUriForFile(
80
                    this,
81
                    getPackageName() + ".provider",
82
                    new File(mPath)
83
            );
84
            retriever.setDataSource(this, newUri);
85
        } else {
86
            retriever.setDataSource(mPath, new HashMap<String, String>());
87
        }
88
        retriever.setDataSource(mPath);
89
90
91
        String duration_s = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
92
        long duration = Long.parseLong(duration_s);
93
94
//获取视频帧数
95
        String count_s = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_FRAME_COUNT);
96
97
        long bitrate = Long.parseLong(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE));
98
        long count = Long.parseLong(count_s);
99
100
//计算帧率
101
        long dt = duration/count; // 平均每帧的时间间隔,35ms
102
103
104
105
        Log.e("TAG", "runFFmpegRxJava帧率为: "+dt);
106
107
        DecimalFormat df = new DecimalFormat("#.00");
108
        String size="";
109
        if (bitrate < 1024) {
110
            size = df.format((double) bitrate) + "BT";
111
        } else if (bitrate < 1048576) {
112
            size = df.format((double) bitrate / 1024) + "KB";
113
        } else if (bitrate < 1073741824) {
114
            size = df.format((double) bitrate / 1048576) + "MB";
115
        } else {
116
            size = df.format((double) bitrate / 1073741824) +"GB";
117
        }
118
119
        Log.e("TAG", "runFFmpegRxJava比特率为: "+size);
120
121
122
123
124
        mResultPath = PhotoUtils.CACHE_DIR + System.currentTimeMillis() + getFileExtension(mPath);
125
        Log.e("TAG", "runFFmpegRxJava: "+GetFileSize(mPath));
126
        if (bitrate < 21299200){//21299200 bit 即 2600k  如果小于2600K则
127
            return;
128
        }
129
//        String text = "ffmpeg -y -i "+mPath+" -vf boxblur=25:5 -preset superfast "+mResultPath;
130
        String text = "ffmpeg -y -i "+mPath+" -b 2600k -r 25 -vcodec libx264 -preset superfast "+mResultPath;
131
132
        String[] commands = text.split(" ");
133
134
        myRxFFmpegSubscriber = new MyRxFFmpegSubscriber(this);
135
136
        //开始执行FFmpeg命令
137
        RxFFmpegInvoke.getInstance()
138
                .runCommandRxJava(commands)
139
                .subscribe(myRxFFmpegSubscriber);
140
141
    }
142
143
    public static class MyRxFFmpegSubscriber extends RxFFmpegSubscriber {
144
145
        private WeakReference<VideoCompressionActivity> mWeakReference;
146
147
        public MyRxFFmpegSubscriber(VideoCompressionActivity homeFragment) {
148
            mWeakReference = new WeakReference<>(homeFragment);
149
        }
150
151
        @Override
152
        public void onFinish() {
153
            final VideoCompressionActivity mHomeFragment = mWeakReference.get();
154
            if (mHomeFragment != null) {
155
                Log.e("TAG", "处理成功"+GetFileSize(mResultPath));
156
157
            }
158
        }
159
160
        @Override
161
        public void onProgress(int progress, long progressTime) {
162
            final VideoCompressionActivity mHomeFragment = mWeakReference.get();
163
            if (mHomeFragment != null) {
164
                //progressTime 可以在结合视频总时长去计算合适的进度值
165
                Log.e("TAG", "onProgress progress:"+progress+"  progressTime:"+progressTime);
166
            }
167
        }
168
169
        @Override
170
        public void onCancel() {
171
            final VideoCompressionActivity mHomeFragment = mWeakReference.get();
172
            if (mHomeFragment != null) {
173
                Log.e("TAG", "已取消");
174
175
            }
176
        }
177
178
        @Override
179
        public void onError(String message) {
180
            final VideoCompressionActivity mHomeFragment = mWeakReference.get();
181
            if (mHomeFragment != null) {
182
                Log.e("TAG", "出错了 onError:" + message);
183
            }
184
        }
185
    }
186
187
    @Override
188
    public void onDestroy() {
189
        super.onDestroy();
190
        if (myRxFFmpegSubscriber != null) {
191
            myRxFFmpegSubscriber.dispose();
192
        }
193
    }
194
195
    public String getFileExtension(String path) {
196
        String extension = "";
197
        File file = new File(path);
198
        try {
199
            if (file != null && file.exists()) {
200
                String name = file.getName();
201
                extension = name.substring(name.lastIndexOf("."));
202
            }
203
        } catch (Exception e) {
204
            extension = "";
205
        }
206
        return extension;
207
    }
208
209
    public static String GetFileSize(String path){
210
        String size = "";
211
        File file = new File(path);
212
        if(file.exists() && file.isFile()){
213
            long fileS = file.length();
214
            DecimalFormat df = new DecimalFormat("#.00");
215
            if (fileS < 1024) {
216
                size = df.format((double) fileS) + "BT";
217
            } else if (fileS < 1048576) {
218
                size = df.format((double) fileS / 1024) + "KB";
219
            } else if (fileS < 1073741824) {
220
                size = df.format((double) fileS / 1048576) + "MB";
221
            } else {
222
                size = df.format((double) fileS / 1073741824) +"GB";
223
            }
224
        }else if(file.exists() && file.isDirectory()){
225
            size = "";
226
        }else{
227
            size = "0BT";
228
        }
229
        return size;
230
    }
231
}
232
*/

+ 137 - 131
app/src/main/java/com/electric/chargingpile/activity/ZhanCommentActivity.java

@ -13,6 +13,7 @@ import android.os.Bundle;
13 13
14 14
import android.os.Handler;
15 15
import android.os.Message;
16
import android.provider.MediaStore;
16 17
import android.text.Editable;
17 18
import android.text.Html;
18 19
import android.text.TextUtils;
@ -31,6 +32,7 @@ import android.widget.Toast;
31 32
32 33
import androidx.annotation.NonNull;
33 34
import androidx.appcompat.app.AppCompatActivity;
35
import androidx.fragment.app.Fragment;
34 36
import androidx.recyclerview.widget.GridLayoutManager;
35 37
import androidx.recyclerview.widget.RecyclerView;
36 38
@ -52,9 +54,14 @@ import com.electric.chargingpile.util.CommonParams;
52 54
import com.electric.chargingpile.util.DES3;
53 55
import com.electric.chargingpile.util.DateUtils;
54 56
import com.electric.chargingpile.util.DensityUtil;
57
import com.electric.chargingpile.util.IjkPlayerEngine;
58
import com.electric.chargingpile.util.ImageFileCompressEngine;
55 59
import com.electric.chargingpile.util.JsonUtils;
56 60
import com.electric.chargingpile.util.LoadingDialog;
57 61
import com.electric.chargingpile.util.Md5Util;
62
import com.electric.chargingpile.util.MeOnCameraInterceptListener;
63
import com.electric.chargingpile.util.MeSandboxFileEngine;
64
import com.electric.chargingpile.util.PictureUtlis;
58 65
import com.electric.chargingpile.util.PublicWayONE;
59 66
import com.electric.chargingpile.util.Res;
60 67
import com.electric.chargingpile.util.ScreenUtils;
@ -68,13 +75,18 @@ import com.electric.chargingpile.view.RatingBarView;
68 75
69 76
import com.google.gson.Gson;
70 77
import com.google.gson.reflect.TypeToken;
71
import com.luck.picture.lib.PictureSelector;
78
import com.hjq.permissions.OnPermissionCallback;
79
import com.hjq.permissions.XXPermissions;
80
import com.luck.lib.camerax.CameraImageEngine;
81
import com.luck.lib.camerax.SimpleCameraX;
72 82
import com.luck.picture.lib.animators.AnimationType;
73 83
74 84
75
import com.luck.picture.lib.camera.CustomCameraView;
85
import com.luck.picture.lib.basic.PictureSelector;
76 86
import com.luck.picture.lib.config.PictureConfig;
77 87
import com.luck.picture.lib.config.PictureMimeType;
88
import com.luck.picture.lib.config.SelectMimeType;
89
import com.luck.picture.lib.config.SelectModeConfig;
78 90
import com.luck.picture.lib.entity.LocalMedia;
79 91
import com.upyun.library.common.SerialUploader;
80 92
import com.upyun.library.listener.UpCompleteListener;
@ -105,11 +117,16 @@ import pub.devrel.easypermissions.AfterPermissionGranted;
105 117
import pub.devrel.easypermissions.EasyPermissions;
106 118
107 119
import static android.text.Html.FROM_HTML_MODE_LEGACY;
120
import static com.hjq.permissions.Permission.CAMERA;
121
import static com.hjq.permissions.Permission.READ_MEDIA_IMAGES;
122
import static com.hjq.permissions.Permission.READ_MEDIA_VIDEO;
123
import static com.luck.lib.camerax.CustomCameraConfig.BUTTON_STATE_ONLY_RECORDER;
124
108 125
/**
109 126
 * 如果更改此页面,则需要同步更改 ChargingCommentActivity,
110 127
 * ZhanCommentActivity 该页面为从地图充电icon-> 列表 ->去评论
111 128
 * */
112
public class ZhanCommentActivity extends AppCompatActivity implements View.OnClickListener, EasyPermissions.PermissionCallbacks, GridImageAdapter.GridImgListener {
129
public class ZhanCommentActivity extends AppCompatActivity implements View.OnClickListener,  GridImageAdapter.GridImgListener {
113 130
    private static final String TAG = "ZhanCommentActivity";
114 131
    private static final int PIC_NUM = 3;
115 132
    private ProgressDialog insertDialog;
@ -462,12 +479,8 @@ public class ZhanCommentActivity extends AppCompatActivity implements View.OnCli
462 479
        for (int i = 0; i < Bimp.tempSelectMedia.size(); i++) {
463 480
464 481
            LocalMedia media = Bimp.tempSelectMedia.get(i);
465
            String path = "";
466
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q)
467
                path = media.getAndroidQToPath();
468
            else {
469
                path = media.getPath();
470
            }
482
            String path = Util.getCompressAbsolutePath(media);
483
471 484
            bm = imageZoom(BitmapFactory.decodeFile(path));
472 485
            String file = bitmapToBase64(bm);
473 486
            Map<String, String> par = new HashMap<String, String>();
@ -518,7 +531,7 @@ public class ZhanCommentActivity extends AppCompatActivity implements View.OnCli
518 531
                    setLayoutHintVisible(1);
519 532
                    //异步方式插入图片
520 533
//                    insertImagesSync(data);
521
                    Bimp.tempSelectMedia = PictureSelector.obtainMultipleResult(data);
534
                    Bimp.tempSelectMedia = PictureSelector.obtainSelectorList(data);
522 535
                    mAdapter.setMaxCount(3);
523 536
                    mInsterType = 1;
524 537
@ -530,7 +543,7 @@ public class ZhanCommentActivity extends AppCompatActivity implements View.OnCli
530 543
                    setLayoutHintVisible(2);
531 544
                    mInsterType = 2;
532 545
                    mAdapter.setMaxCount(1);
533
                    Bimp.tempSelectMedia = PictureSelector.obtainMultipleResult(data);
546
                    Bimp.tempSelectMedia = PictureSelector.obtainSelectorList(data);
534 547
                    mAdapter.setDatas(Bimp.tempSelectMedia);
535 548
                }
536 549
            }
@ -591,19 +604,16 @@ public class ZhanCommentActivity extends AppCompatActivity implements View.OnCli
591 604
                return tv;
592 605
            }
593 606
        });
594
        mFlowLayout.setOnTagClickListener(new TagFlowLayout.OnTagClickListener() {
595
            @Override
596
            public boolean onTagClick(View view, int position, FlowLayout parent) {
597
                if (select_s.contains(stringArr[position])) {
598
                    String s = stringArr[position] + ",";
599
                    select_s = select_s.replaceAll(s, "");
600
                } else {
601
                    select_s += stringArr[position] + ",";
602
                }
603
                Log.e("select===", select_s);
604
605
                return true;
607
        mFlowLayout.setOnTagClickListener((view, position, parent) -> {
608
            if (select_s.contains(stringArr[position])) {
609
                String s = stringArr[position] + ",";
610
                select_s = select_s.replaceAll(s, "");
611
            } else {
612
                select_s += stringArr[position] + ",";
606 613
            }
614
            Log.e("select===", select_s);
615
616
            return true;
607 617
        });
608 618
    }
609 619
@ -769,14 +779,7 @@ public class ZhanCommentActivity extends AppCompatActivity implements View.OnCli
769 779
                        } else if (Bimp.tempSelectMedia.size() > 0 && mInsterType == 2) {
770 780
                            //进行视频验证
771 781
                            LocalMedia media = Bimp.tempSelectMedia.get(0);
772
                            String path = "";
773
                            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q)
774
                                path = media.getAndroidQToPath();
775
                            else {
776
                                path = media.getPath();
777
                            }
778
779
782
                            String path = Util.getCompressAbsolutePath(media);
780 783
                            getYouPaiData(path);
781 784
                        } else {
782 785
                            if (containsEmoji(et_pinglun.getText().toString())) {
@ -915,118 +918,112 @@ public class ZhanCommentActivity extends AppCompatActivity implements View.OnCli
915 918
        String saveKey = jsonObject.optString("save-key");
916 919
917 920
        serialUploader.upload(
918
                temp, uri, date, "UPYUN " + operator + ":" + sign, null, new UpCompleteListener() {
919
                    @Override
920
                    public void onComplete(boolean isSuccess, String result) {
921
                        if (isSuccess) {
922
                            try {
923
                                ArrayList<String> list = new ArrayList<>();
924
                                list.add(saveKey);
925
                                addComment(list, saveKey);
926
                            } catch (Exception e) {
927
                                e.printStackTrace();
928
                            }
929
                        } else {
930
                            ToastUtil.showToast(getApplicationContext(), "发布失败,请重试", Toast.LENGTH_SHORT);
931
                            dialog.dismiss();
921
                temp, uri, date, "UPYUN " + operator + ":" + sign, null, (isSuccess, result) -> {
922
                    if (isSuccess) {
923
                        try {
924
                            ArrayList<String> list = new ArrayList<>();
925
                            list.add(saveKey);
926
                            addComment(list, saveKey);
927
                        } catch (Exception e) {
928
                            e.printStackTrace();
932 929
                        }
933
930
                    } else {
931
                        ToastUtil.showToast(getApplicationContext(), "发布失败,请重试", Toast.LENGTH_SHORT);
932
                        dialog.dismiss();
934 933
                    }
934
935 935
                });
936 936
    }
937 937
938 938
    private void addImg() {
939 939
        PictureSelector.create(this)
940
                .openGallery(PictureMimeType.ofImage())
941
                .maxSelectNum(PIC_NUM)
942
                .selectionMode(PictureConfig.MULTIPLE)
943
                .selectionData(Bimp.tempSelectMedia)//是否传入已选图片
944
                .isCompress(true)//是否压缩
945
                .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
946
                .isGif(true)//是否显示gif
947
                .isAndroidQTransform(true)
948
                .imageEngine(GlideEngine.createGlideEngine())
949
                .isWeChatStyle(false)// 是否开启微信图片选择风格
950
                .isUseCustomCamera(false)// 是否使用自定义相机
951
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
952
                .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
953
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
954
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
955
                .imageSpanCount(4)// 每行显示个数
956
                .isReturnEmpty(false)// 选择数据时点击按钮是否可以返回
957
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
940
                .openGallery(SelectMimeType.ofImage())
941
                .setSelectorUIStyle(PictureUtlis.getStyle())
942
                .setImageEngine(GlideEngine.createGlideEngine())
943
                .setCompressEngine(new ImageFileCompressEngine()) //设置压缩
944
                .setSandboxFileEngine(new MeSandboxFileEngine()) //设置相册沙盒目录拷贝引擎
945
                .setCameraInterceptListener(new MeOnCameraInterceptListener())
946
                .setSelectionMode(SelectModeConfig.MULTIPLE)
947
                .setMaxSelectNum(PIC_NUM)
948
                .isEmptyResultReturn(true) //支持未选择返回
949
                .setImageSpanCount(4)
950
                .isPageStrategy(true)   // 是否开启分页模式
951
                .isDisplayCamera(true) //是否显示相机入口
952
                .isPreviewFullScreenMode(true)//预览点击全屏效果
953
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
954
                .isEmptyResultReturn(true)//支持未选择返回
955
                .isWithSelectVideoImage(false)//是否支持视频图片同选
956
                .isSelectZoomAnim(true)// 选择缩略图缩放效果
957
                .isCameraAroundState(false)// 是否开启前置摄像头;系统相机 只支持部分机型
958
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
959
                .isGif(true)// 是否显示gif文件
960
                .isWebp(true)// 是否显示webp文件
961
                .isBmp(true)//是否显示bmp文件
962
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
963
                .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
964
                .isFastSlidingSelect(true) //快速滑动选择
965
                .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回
966
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
967
                .isPreviewImage(true)//是否预览图片
968
                .setFilterMinFileSize(1) //过滤最小文件
958 969
                .forResult(REQUEST_CODE_CHOOSE);
959 970
    }
960 971
961 972
    private void addVideo() {
962 973
        PictureSelector.create(this)
963
                .openGallery(PictureMimeType.ofVideo())
964
               // .selectionMode(PictureConfig.SINGLE)
965
                .isCompress(true)//是否压缩
966
                .maxSelectNum(1)
967
                .isPreviewEggs(true)//图片时是否增强左右滑动图片体验
968
                .isAndroidQTransform(true)
969
                .imageEngine(GlideEngine.createGlideEngine())
970
                .isWeChatStyle(false)// 是否开启微信图片选择风格
971
                .isUseCustomCamera(false)// 是否使用自定义相机
972
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
973
                .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
974
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
975
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
976
                .imageSpanCount(4)// 每行显示个数
977
                .isReturnEmpty(false)// 未选择数据时点击按钮是否可以返回
978
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
979
                .videoMaxSecond(16)   // 查询多少秒以内的视频
980
                .videoMinSecond(2)   // 查询多少秒以内的视频
981
                .recordVideoSecond(16)//录制视频秒数 默认60s
982
                .isPreviewVideo(true)//是否预览视频
983
                .setButtonFeatures(CustomCameraView.BUTTON_STATE_ONLY_RECORDER) //自定义按钮样式
984
                .isUseCustomCamera(true)// 开启自定义相机
985
               // .isSingleDirectReturn(true)//PictureConfig.SINGLE模式下是否直接返回
986
                .filterMaxFileSize( 100 * 1024 )//查询指定大小内的图片、视频、音频大小,单位 KB
974
                .openGallery(SelectMimeType.ofVideo())
975
                .setSelectorUIStyle(PictureUtlis.getStyle())
976
                .setImageEngine(GlideEngine.createGlideEngine())
977
                .setCompressEngine(new ImageFileCompressEngine()) //设置压缩
978
                .setSandboxFileEngine(new MeSandboxFileEngine()) //设置相册沙盒目录拷贝引擎
979
                .setSelectionMode(SelectModeConfig.SINGLE) //设置单选
980
                .isEmptyResultReturn(true) //支持未选择返回
981
                .setImageSpanCount(3)
982
                .isPageStrategy(true)   // 是否开启分页模式
983
                .isDisplayCamera(true) //是否显示相机入口
984
                .isPreviewFullScreenMode(true)//预览点击全屏效果
985
                .isEmptyResultReturn(true)//支持未选择返回
986
                .isWithSelectVideoImage(false)//是否支持视频图片同选
987
                .isSelectZoomAnim(true)// 选择缩略图缩放效果
988
                .isCameraAroundState(false)// 是否开启前置摄像头;系统相机 只支持部分机型
989
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
990
                .isGif(true)// 是否显示gif文件
991
                .isWebp(true)// 是否显示webp文件
992
                .isBmp(true)//是否显示bmp文件
993
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
994
                .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
995
                .isFastSlidingSelect(true) //快速滑动选择
996
                .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回
997
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
998
                .isPreviewImage(true)//是否预览图片
999
                .setMaxSelectNum(1)//最大选择数量,默认9张
1000
                .setMinSelectNum(1)// 最小选择数量
1001
                .setRecordVideoMaxSecond(16) //视频录制最大时长
1002
                .setRecordVideoMinSecond(2) //视频录制最小时长
1003
                .setFilterVideoMaxSecond(16) //过滤视频最大时长
1004
                .setFilterVideoMinSecond(2) //过滤视频最小时长
1005
                .setFilterMinFileSize(1) //过滤最小文件
1006
                .setVideoQuality(1)
1007
                .setCameraInterceptListener(new MeOnCameraInterceptListener(){
1008
                    @Override
1009
                    public void openCamera(Fragment fragment, int cameraMode, int requestCode) {
1010
                        SimpleCameraX camera = SimpleCameraX.of();
1011
                        camera.isAutoRotation(true);
1012
                        camera.setCameraMode(BUTTON_STATE_ONLY_RECORDER);
1013
                        camera.setVideoFrameRate(25);
1014
                        camera.setVideoBitRate(3 * 1024 * 1024);
1015
                        camera.isDisplayRecordChangeTime(true);
1016
                        camera.isManualFocusCameraPreview(true);
1017
                        camera.isZoomCameraPreview(true);
1018
                        camera.setImageEngine((context, url, imageView) -> Glide.with(context).load(url).into(imageView));
1019
                        camera.start(fragment.requireActivity(), fragment, requestCode);
1020
                    }
1021
                })
1022
                .isVideoPauseResumePlay(true) //视频支持暂停与播放
987 1023
                .forResult(REQUEST_VIDEO_CODE_CHOOSE);
988 1024
    }
989 1025
990 1026
    @Override
991
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
992
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
993
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
994
    }
995
996
    @Override
997
    public void onPermissionsGranted(int requestCode, List<String> perms) {
998
999
    }
1000
1001
    @Override
1002
    public void onPermissionsDenied(int requestCode, List<String> perms) {
1003
1004
    }
1005
1006
    @AfterPermissionGranted(RC_ALBUM_PERM)
1007
    public void permissionTask() {
1008
        if (isPermissionOK()) {
1009
            addImg();
1010
        } else {
1011
            // Ask for one permission
1012
            EasyPermissions.requestPermissions(
1013
                    this, "充电桩想要获取您的图片读取权限,是否允许?",
1014
                    RC_ALBUM_PERM,
1015
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
1016
                    Manifest.permission.READ_EXTERNAL_STORAGE,
1017
                    Manifest.permission.CAMERA);
1018
        }
1019
    }
1020
1021
    private boolean isPermissionOK() {
1022
        return EasyPermissions.hasPermissions(this,
1023
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
1024
                Manifest.permission.READ_EXTERNAL_STORAGE,
1025
                Manifest.permission.CAMERA
1026
        );
1027
    }
1028
1029
    @Override
1030 1027
    public void add() {
1031 1028
        if (mInsterType == 1) {
1032 1029
            addImg();
@ -1049,10 +1046,19 @@ public class ZhanCommentActivity extends AppCompatActivity implements View.OnCli
1049 1046
        if (mInsterType == 1) {
1050 1047
            ImageDisplayActivity.actionStart(this, position);
1051 1048
        } else if (mInsterType == 2) {
1052
            PictureSelector.create(ZhanCommentActivity.this)
1053
                    .themeStyle(com.luck.picture.lib.R.style.picture_default_style)
1054
                    .setPictureStyle(Util.getWhiteStyle(ZhanCommentActivity.this))// 动态自定义相册主题
1055
                    .externalPictureVideo(TextUtils.isEmpty(mLocalMedia.getAndroidQToPath()) ? mLocalMedia.getPath() : mLocalMedia.getAndroidQToPath());
1049
1050
            ArrayList<LocalMedia> list = new ArrayList<>();
1051
            list.add(mLocalMedia);
1052
            PictureSelector.create(this)
1053
                    .openPreview()
1054
                    .setImageEngine(GlideEngine.createGlideEngine())
1055
                    .setVideoPlayerEngine(new IjkPlayerEngine())
1056
                    .setSelectorUIStyle(PictureUtlis.getStyle())
1057
                    .isPreviewFullScreenMode(false)
1058
                    .isVideoPauseResumePlay(true)
1059
                    .isAutoVideoPlay(true)
1060
                    .isLoopAutoVideoPlay(true)
1061
                    .startActivityPreview(0,false, list);
1056 1062
        }
1057 1063
    }
1058 1064

+ 3 - 7
app/src/main/java/com/electric/chargingpile/adapter/GridImageAdapter.java

@ -12,6 +12,7 @@ import androidx.recyclerview.widget.RecyclerView;
12 12
13 13
import com.bumptech.glide.Glide;
14 14
import com.electric.chargingpile.R;
15
import com.electric.chargingpile.util.Util;
15 16
import com.luck.picture.lib.entity.LocalMedia;
16 17
import com.luck.picture.lib.entity.MediaData;
17 18
@ -90,14 +91,9 @@ public class GridImageAdapter extends RecyclerView.Adapter<GridImageAdapter.View
90 91
//            holder.imageView.setImageResource(R.drawable.addpic65);
91 92
            holder.remove.setVisibility( View.GONE);
92 93
        } else {
93
94
            String path="";
95 94
            LocalMedia data = mDatas.get(position);
96
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q)
97
                path= data.getAndroidQToPath();
98
            else {
99
                path= data.getPath();
100
            }
95
96
            String path = Util.getCompressAbsolutePath(data);
101 97
102 98
103 99
            Glide.with(context)

+ 6 - 6
app/src/main/java/com/electric/chargingpile/application/MainApplication.java

@ -103,13 +103,13 @@ public class MainApplication extends MultiDexApplication implements CameraXConfi
103 103
    public static String firstPoint = "";
104 104
    public static Boolean firstSsyd;
105 105
    public static String password = "";
106
//    public static String url = "http://59.110.68.162";// 充电桩测试环境
107
//    public static String pic_url = "http://59.110.68.162/zhannew/uploadfile/";
108
    public static String url = "http://cdz.evcharge.cc";// 充电桩正式环境
109
    public static String pic_url = "http://cdz.evcharge.cc/zhannew/uploadfile/";
106
    public static String url = "http://59.110.68.162";// 充电桩测试环境
107
    public static String pic_url = "http://59.110.68.162/zhannew/uploadfile/";
108
//    public static String url = "http://cdz.evcharge.cc";// 充电桩正式环境
109
//    public static String pic_url = "http://cdz.evcharge.cc/zhannew/uploadfile/";
110 110

111
//        public static String urlNew = "http://123.56.67.7:83/api/0300";// 一电测试环境
112
    public static String urlNew = "https://api.touchev.com:83/api/0300";// 一电正式环境
111
        public static String urlNew = "http://123.56.67.7:83/api/0300";// 一电测试环境
112
//    public static String urlNew = "https://api.touchev.com:83/api/0300";// 一电正式环境
113 113

114 114
    public static String d1evUrl = "https://d1ev-new.yiduyongche.com";// 评论上传视频
115 115
    public static String CDN = "https://cdn-fs.d1ev.com";

+ 49 - 169
app/src/main/java/com/electric/chargingpile/engine/GlideEngine.java

@ -1,197 +1,68 @@
1 1
package com.electric.chargingpile.engine;
2 2
3 3
import android.content.Context;
4
import android.graphics.Bitmap;
5
import android.graphics.PointF;
6
import android.graphics.drawable.Drawable;
7
import android.view.View;
8 4
import android.widget.ImageView;
9 5
10
import androidx.annotation.NonNull;
11
import androidx.annotation.Nullable;
12
import androidx.core.graphics.drawable.RoundedBitmapDrawable;
13
import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
14
15 6
import com.bumptech.glide.Glide;
16
import com.bumptech.glide.request.RequestOptions;
17
import com.bumptech.glide.request.target.BitmapImageViewTarget;
18
import com.bumptech.glide.request.target.ImageViewTarget;
7
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
8
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
19 9
import com.electric.chargingpile.R;
20 10
import com.luck.picture.lib.engine.ImageEngine;
21
import com.luck.picture.lib.listener.OnImageCompleteCallback;
22
import com.luck.picture.lib.tools.MediaUtils;
23
import com.luck.picture.lib.widget.longimage.ImageSource;
24
import com.luck.picture.lib.widget.longimage.ImageViewState;
25
import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView;
11
import com.luck.picture.lib.utils.ActivityCompatHelper;
26 12
27
/**
28
 * @author:luck
29
 * @date:2019-11-13 17:02
30
 * @describe:Glide加载引擎
31
 */
32 13
public class GlideEngine implements ImageEngine {
33 14
15
    public static GlideEngine createGlideEngine() {
16
        return InstanceHolder.instance;
17
    }
18
34 19
    /**
35 20
     * 加载图片
36 21
     *
37
     * @param context
38
     * @param url
39
     * @param imageView
22
     * @param context   上下文
23
     * @param url       资源url
24
     * @param imageView 图片承载控件
40 25
     */
41 26
    @Override
42
    public void loadImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
27
    public void loadImage(Context context, String url, ImageView imageView) {
28
        if (!ActivityCompatHelper.assertValidRequest(context)) {
29
            return;
30
        }
43 31
        Glide.with(context)
44 32
                .load(url)
45 33
                .into(imageView);
46 34
    }
47 35
48
    /**
49
     * 加载网络图片适配长图方案
50
     * # 注意:此方法只有加载网络图片才会回调
51
     *
52
     * @param context
53
     * @param url
54
     * @param imageView
55
     * @param longImageView
56
     * @param callback      网络图片加载回调监听 {link after version 2.5.1 Please use the #OnImageCompleteCallback#}
57
     */
58 36
    @Override
59
    public void loadImage(@NonNull Context context, @NonNull String url,
60
                          @NonNull ImageView imageView,
61
                          SubsamplingScaleImageView longImageView, OnImageCompleteCallback callback) {
62
        Glide.with(context)
63
                .asBitmap()
64
                .load(url)
65
                .into(new ImageViewTarget<Bitmap>(imageView) {
66
                    @Override
67
                    public void onLoadStarted(@Nullable Drawable placeholder) {
68
                        super.onLoadStarted(placeholder);
69
                        if (callback != null) {
70
                            callback.onShowLoading();
71
                        }
72
                    }
73
74
                    @Override
75
                    public void onLoadFailed(@Nullable Drawable errorDrawable) {
76
                        super.onLoadFailed(errorDrawable);
77
                        if (callback != null) {
78
                            callback.onHideLoading();
79
                        }
80
                    }
81
82
                    @Override
83
                    protected void setResource(@Nullable Bitmap resource) {
84
                        if (callback != null) {
85
                            callback.onHideLoading();
86
                        }
87
                        if (resource != null) {
88
                            boolean eqLongImage = MediaUtils.isLongImg(resource.getWidth(),
89
                                    resource.getHeight());
90
                            longImageView.setVisibility(eqLongImage ? View.VISIBLE : View.GONE);
91
                            imageView.setVisibility(eqLongImage ? View.GONE : View.VISIBLE);
92
                            if (eqLongImage) {
93
                                // 加载长图
94
                                longImageView.setQuickScaleEnabled(true);
95
                                longImageView.setZoomEnabled(true);
96
                                longImageView.setPanEnabled(true);
97
                                longImageView.setDoubleTapZoomDuration(100);
98
                                longImageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP);
99
                                longImageView.setDoubleTapZoomDpi(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER);
100
                                longImageView.setImage(ImageSource.bitmap(resource),
101
                                        new ImageViewState(0, new PointF(0, 0), 0));
102
                            } else {
103
                                // 普通图片
104
                                imageView.setImageBitmap(resource);
105
                            }
106
                        }
107
                    }
108
                });
109
    }
110
111
    /**
112
     * 加载网络图片适配长图方案
113
     * # 注意:此方法只有加载网络图片才会回调
114
     *
115
     * @param context
116
     * @param url
117
     * @param imageView
118
     * @param longImageView
119
     * @ 已废弃
120
     */
121
    public void loadImage(@NonNull Context context, @NonNull String url,
122
                          @NonNull ImageView imageView,
123
                          SubsamplingScaleImageView longImageView) {
37
    public void loadImage(Context context, ImageView imageView, String url, int maxWidth, int maxHeight) {
38
        if (!ActivityCompatHelper.assertValidRequest(context)) {
39
            return;
40
        }
124 41
        Glide.with(context)
125
                .asBitmap()
126 42
                .load(url)
127
                .into(new ImageViewTarget<Bitmap>(imageView) {
128
                    @Override
129
                    protected void setResource(@Nullable Bitmap resource) {
130
                        if (resource != null) {
131
                            boolean eqLongImage = MediaUtils.isLongImg(resource.getWidth(),
132
                                    resource.getHeight());
133
                            longImageView.setVisibility(eqLongImage ? View.VISIBLE : View.GONE);
134
                            imageView.setVisibility(eqLongImage ? View.GONE : View.VISIBLE);
135
                            if (eqLongImage) {
136
                                // 加载长图
137
                                longImageView.setQuickScaleEnabled(true);
138
                                longImageView.setZoomEnabled(true);
139
                                longImageView.setPanEnabled(true);
140
                                longImageView.setDoubleTapZoomDuration(100);
141
                                longImageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP);
142
                                longImageView.setDoubleTapZoomDpi(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER);
143
                                longImageView.setImage(ImageSource.bitmap(resource),
144
                                        new ImageViewState(0, new PointF(0, 0), 0));
145
                            } else {
146
                                // 普通图片
147
                                imageView.setImageBitmap(resource);
148
                            }
149
                        }
150
                    }
151
                });
43
                .override(maxWidth, maxHeight)
44
                .into(imageView);
152 45
    }
153 46
154 47
    /**
155
     * 加载相册目录
48
     * 加载相册目录封面
156 49
     *
157 50
     * @param context   上下文
158 51
     * @param url       图片路径
159 52
     * @param imageView 承载图片ImageView
160 53
     */
161 54
    @Override
162
    public void loadFolderImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
55
    public void loadAlbumCover(Context context, String url, ImageView imageView) {
56
        if (!ActivityCompatHelper.assertValidRequest(context)) {
57
            return;
58
        }
163 59
        Glide.with(context)
164 60
                .asBitmap()
165 61
                .load(url)
166 62
                .override(180, 180)
167
                .centerCrop()
168 63
                .sizeMultiplier(0.5f)
169
                .apply(new RequestOptions().placeholder(R.drawable.picture_image_placeholder))
170
                .into(new BitmapImageViewTarget(imageView) {
171
                    @Override
172
                    protected void setResource(Bitmap resource) {
173
                        RoundedBitmapDrawable circularBitmapDrawable =
174
                                RoundedBitmapDrawableFactory.
175
                                        create(context.getResources(), resource);
176
                        circularBitmapDrawable.setCornerRadius(8);
177
                        imageView.setImageDrawable(circularBitmapDrawable);
178
                    }
179
                });
180
    }
181
182
183
    /**
184
     * 加载gif
185
     *
186
     * @param context   上下文
187
     * @param url       图片路径
188
     * @param imageView 承载图片ImageView
189
     */
190
    public void loadAsGifImage(@NonNull Context context, @NonNull String url,
191
                               @NonNull ImageView imageView) {
192
        Glide.with(context)
193
                .asGif()
194
                .load(url)
64
                .transform(new CenterCrop(), new RoundedCorners(8))
65
                .placeholder(R.drawable.ps_image_placeholder)
195 66
                .into(imageView);
196 67
    }
197 68
@ -203,29 +74,38 @@ public class GlideEngine implements ImageEngine {
203 74
     * @param imageView 承载图片ImageView
204 75
     */
205 76
    @Override
206
    public void loadGridImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
77
    public void loadGridImage(Context context, String url, ImageView imageView) {
78
        if (!ActivityCompatHelper.assertValidRequest(context)) {
79
            return;
80
        }
207 81
        Glide.with(context)
208 82
                .load(url)
209 83
                .override(200, 200)
210 84
                .centerCrop()
211
                .apply(new RequestOptions().placeholder(R.drawable.picture_image_placeholder))
85
                .placeholder(R.drawable.ps_image_placeholder)
212 86
                .into(imageView);
213 87
    }
214 88
89
    @Override
90
    public void pauseRequests(Context context) {
91
        if (!ActivityCompatHelper.assertValidRequest(context)) {
92
            return;
93
        }
94
        Glide.with(context).pauseRequests();
95
    }
215 96
216 97
    private GlideEngine() {
217 98
    }
218 99
219
    private static GlideEngine instance;
220
221
    public static GlideEngine createGlideEngine() {
222
        if (null == instance) {
223
            synchronized (GlideEngine.class) {
224
                if (null == instance) {
225
                    instance = new GlideEngine();
226
                }
227
            }
100
    @Override
101
    public void resumeRequests(Context context) {
102
        if (!ActivityCompatHelper.assertValidRequest(context)) {
103
            return;
228 104
        }
229
        return instance;
105
        Glide.with(context).resumeRequests();
106
    }
107
108
    private static final class InstanceHolder {
109
        static final GlideEngine instance = new GlideEngine();
230 110
    }
231
}
111
}

+ 7 - 8
app/src/main/java/com/electric/chargingpile/fragment/ChatRecommendFragment.java

@ -19,7 +19,6 @@ import com.andview.refreshview.XRefreshView;
19 19
import com.electric.chargingpile.R;
20 20
import com.electric.chargingpile.activity.ChatContentListActivity;
21 21
import com.electric.chargingpile.activity.LoginActivity;
22
import com.electric.chargingpile.activity.PublishItemsActivity;
23 22
import com.electric.chargingpile.adapter.ChatRecommendAdapter;
24 23
import com.electric.chargingpile.adapter.TopicDetailAdapter;
25 24
import com.electric.chargingpile.application.MainApplication;
@ -42,7 +41,7 @@ import java.util.HashMap;
42 41
import java.util.Map;
43 42
44 43
import okhttp3.Call;
45
44
@Deprecated
46 45
public class ChatRecommendFragment extends Fragment implements View.OnClickListener {
47 46
    private static final String TAG = "ChatRecommendFragment";
48 47
    private View view;
@ -228,12 +227,12 @@ public class ChatRecommendFragment extends Fragment implements View.OnClickListe
228 227
                String code = JsonUtils.getKeyResult(response, "code");
229 228
                String desc = JsonUtils.getKeyResult(response, "desc");
230 229
                if ("1000".equals(code)) {
231
                    MobclickAgent.onEvent(getContext(), "1004");
232
                    Intent intent = new Intent(getActivity(), PublishItemsActivity.class);
233
                    PublishItemSerializable intentData = new PublishItemSerializable();
234
                    intentData.setFrom(PublishItemsActivity.FROM_CHAT_HOME);
235
                    intent.putExtra("intent_data", intentData);
236
                    startActivity(intent);
230
//                    MobclickAgent.onEvent(getContext(), "1004");
231
//                    Intent intent = new Intent(getActivity(), PublishItemsActivity.class);
232
//                    PublishItemSerializable intentData = new PublishItemSerializable();
233
//                    intentData.setFrom(PublishItemsActivity.FROM_CHAT_HOME);
234
//                    intent.putExtra("intent_data", intentData);
235
//                    startActivity(intent);
237 236
                } else if ("8010".equals(code)) {
238 237
                    startActivity(new Intent(getContext(), LoginActivity.class));
239 238
                    ToastUtil.showToast(getContext(), desc, Toast.LENGTH_LONG);

+ 2 - 3
app/src/main/java/com/electric/chargingpile/fragment/TalkRecommendFragment.java

@ -19,7 +19,6 @@ import com.andview.refreshview.XRefreshView;
19 19
import com.andview.refreshview.XRefreshView.SimpleXRefreshListener;
20 20
import com.electric.chargingpile.R;
21 21
import com.electric.chargingpile.activity.PersonalPageActivity;
22
import com.electric.chargingpile.activity.PublishItemsActivity;
23 22
import com.electric.chargingpile.activity.TopicDetailActivity;
24 23
import com.electric.chargingpile.activity.VideoDetaislActivity;
25 24
import com.electric.chargingpile.adapter.LayoutAdapter;
@ -47,7 +46,7 @@ import io.reactivex.functions.Consumer;
47 46
import io.reactivex.functions.Predicate;
48 47
import io.reactivex.schedulers.Schedulers;
49 48
import okhttp3.Call;
50
49
@Deprecated
51 50
public class TalkRecommendFragment extends Fragment implements View.OnClickListener {
52 51
    RecyclerView recyclerView;
53 52
    LayoutAdapter layoutAdapter;
@ -249,7 +248,7 @@ public class TalkRecommendFragment extends Fragment implements View.OnClickListe
249 248
    public void onClick(View v) {
250 249
        switch (v.getId()) {
251 250
            case R.id.iv_ask:
252
                startActivity(new Intent(getActivity(), PublishItemsActivity.class));
251
//                startActivity(new Intent(getActivity(), PublishItemsActivity.class));
253 252
//                Toast.makeText(getActivity(), "分享", Toast.LENGTH_SHORT).show();
254 253
                break;
255 254
        }

+ 114 - 0
app/src/main/java/com/electric/chargingpile/util/IjkPlayerEngine.java

@ -0,0 +1,114 @@
1
package com.electric.chargingpile.util;
2
3
import android.content.Context;
4
import android.view.View;
5
6
import com.electric.chargingpile.view.IjkPlayerView;
7
8
import com.luck.picture.lib.config.SelectorConfig;
9
import com.luck.picture.lib.config.SelectorProviders;
10
import com.luck.picture.lib.engine.VideoPlayerEngine;
11
import com.luck.picture.lib.entity.LocalMedia;
12
import com.luck.picture.lib.interfaces.OnPlayerListener;
13
14
import java.util.concurrent.CopyOnWriteArrayList;
15
16
17
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
18
19
public class IjkPlayerEngine implements VideoPlayerEngine<IjkPlayerView> {
20
    /**
21
     * 播放状态监听器集
22
     */
23
    private final CopyOnWriteArrayList<OnPlayerListener> listeners = new CopyOnWriteArrayList<>();
24
25
26
    @Override
27
    public View onCreateVideoPlayer(Context context) {
28
        return new IjkPlayerView(context);
29
    }
30
31
    @Override
32
    public void onStarPlayer(IjkPlayerView player, LocalMedia media) {
33
        IjkMediaPlayer mediaPlayer = player.getMediaPlayer();
34
        SelectorConfig config = SelectorProviders.getInstance().getSelectorConfig();
35
        mediaPlayer.setLooping(config.isLoopAutoPlay);
36
        player.start(media.getAvailablePath());
37
    }
38
39
    @Override
40
    public void onResume(IjkPlayerView player) {
41
        IjkMediaPlayer mediaPlayer = player.getMediaPlayer();
42
        if (mediaPlayer != null) {
43
            mediaPlayer.start();
44
        }
45
    }
46
47
    @Override
48
    public void onPause(IjkPlayerView player) {
49
        IjkMediaPlayer mediaPlayer = player.getMediaPlayer();
50
        if (mediaPlayer != null) {
51
            mediaPlayer.pause();
52
        }
53
    }
54
55
    @Override
56
    public boolean isPlaying(IjkPlayerView player) {
57
        IjkMediaPlayer mediaPlayer = player.getMediaPlayer();
58
        return mediaPlayer != null && mediaPlayer.isPlaying();
59
    }
60
61
    @Override
62
    public void addPlayListener(OnPlayerListener playerListener) {
63
        if (!listeners.contains(playerListener)) {
64
            listeners.add(playerListener);
65
        }
66
    }
67
68
    @Override
69
    public void removePlayListener(OnPlayerListener playerListener) {
70
        if (playerListener != null) {
71
            listeners.remove(playerListener);
72
        } else {
73
            listeners.clear();
74
        }
75
    }
76
77
    @Override
78
    public void onPlayerAttachedToWindow(IjkPlayerView player) {
79
        IjkMediaPlayer mediaPlayer = player.initMediaPlayer();
80
        mediaPlayer.setOnPreparedListener(it -> {
81
            it.start();
82
            for (int i = 0; i < listeners.size(); i++) {
83
                OnPlayerListener playerListener = listeners.get(i);
84
                playerListener.onPlayerReady();
85
            }
86
        });
87
        mediaPlayer.setOnCompletionListener(it -> {
88
            it.reset();
89
            for (int i = 0; i < listeners.size(); i++) {
90
                OnPlayerListener playerListener = listeners.get(i);
91
                playerListener.onPlayerEnd();
92
            }
93
            player.clearCanvas();
94
        });
95
96
        mediaPlayer.setOnErrorListener((it, what, extra) -> {
97
            for (int i = 0; i < listeners.size(); i++) {
98
                OnPlayerListener playerListener = listeners.get(i);
99
                playerListener.onPlayerError();
100
            }
101
            return false;
102
        });
103
    }
104
105
    @Override
106
    public void onPlayerDetachedFromWindow(IjkPlayerView player) {
107
        player.release();
108
    }
109
110
    @Override
111
    public void destroy(IjkPlayerView player) {
112
        player.release();
113
    }
114
}

+ 111 - 0
app/src/main/java/com/electric/chargingpile/util/ImageCropEngine.java

@ -0,0 +1,111 @@
1
package com.electric.chargingpile.util;
2
3
import static com.electric.chargingpile.util.PhotoUtils.CACHE_DIR;
4
5
import android.content.Context;
6
import android.graphics.Bitmap;
7
import android.net.Uri;
8
import android.widget.ImageView;
9
10
import androidx.fragment.app.Fragment;
11
12
import com.bumptech.glide.Glide;
13
import com.luck.picture.lib.config.PictureMimeType;
14
import com.luck.picture.lib.engine.CropEngine;
15
import com.luck.picture.lib.entity.LocalMedia;
16
import com.yalantis.ucrop.UCrop;
17
import com.yalantis.ucrop.UCropImageEngine;
18
import com.luck.picture.lib.utils.DateUtils;
19
import java.io.File;
20
import java.util.ArrayList;
21
22
public class ImageCropEngine implements CropEngine {
23
    //长宽比
24
    private float x = 0F;
25
    //长宽比
26
    private float y = 0F;
27
    //是否为圆
28
    private boolean isCirCle = false;
29
30
    public ImageCropEngine(float x, float y, boolean isCirCle) {
31
        this.x = x;
32
        this.y = y;
33
        this.isCirCle = isCirCle;
34
    }
35
36
    @Override
37
    public void onStartCrop(Fragment fragment, LocalMedia currentLocalMedia, ArrayList<LocalMedia> dataSource, int requestCode) {
38
        String currentCropPath = currentLocalMedia.getAvailablePath();
39
        Uri inputUri ;
40
        if (PictureMimeType.isContent(currentCropPath) || PictureMimeType.isHasHttp(currentCropPath)) {
41
            inputUri= Uri.parse(currentCropPath);
42
        } else {
43
            inputUri = Uri.fromFile(new File(currentCropPath));
44
        }
45
        String fileName = DateUtils.getCreateFileName("CROP_") + ".jpg";
46
        Uri destinationUri = Uri.fromFile(new File(PhotoUtils.CACHE_DIR, fileName));
47
        UCrop.Options options;
48
         if (isCirCle){
49
             options = buildCircleOptions();
50
        }else{
51
             options = buildRatioOptions();
52
        }
53
        ArrayList<String> dataCropSource =new ArrayList<String>();
54
55
        for (LocalMedia media : dataSource) {
56
            dataCropSource.add(media.getAvailablePath());
57
        }
58
59
        UCrop uCrop = UCrop.of(inputUri, destinationUri, dataCropSource);
60
        uCrop.withOptions(options);
61
        uCrop.setImageEngine(new UCropImageEngine(){
62
63
            @Override
64
            public void loadImage(Context context, String url, ImageView imageView) {
65
                Glide.with(context).load(url).into(imageView);
66
67
            }
68
69
            @Override
70
            public void loadImage(Context context, Uri url, int maxWidth, int maxHeight, OnCallbackListener<Bitmap> call) {
71
72
            }
73
        });
74
        uCrop.start(fragment.requireActivity(), fragment, requestCode);
75
    }
76
77
    private UCrop.Options buildRatioOptions()  {
78
        UCrop.Options options = new UCrop.Options();
79
        // 长宽比
80
        options.withAspectRatio(x, y);
81
        //是否为圆
82
        options.setCircleDimmedLayer(false);
83
84
        // 是否让用户调整范围(默认false),如果开启,可能会造成剪切的图片的长宽比不是设定的
85
        // 如果不开启,用户不能拖动选框,只能缩放图片
86
        options.setFreeStyleCropEnabled(true);
87
88
        options.isCropDragSmoothToCenter(false);
89
        options.setSkipCropMimeType(PictureMimeType.ofGIF(), PictureMimeType.ofWEBP());
90
        options.isForbidCropGifWebp(false);
91
        options.isForbidSkipMultipleCrop(true);
92
        options.setMaxScaleMultiplier(100f);
93
        return options;
94
    }
95
    private UCrop.Options buildCircleOptions() {
96
        UCrop.Options options = new UCrop.Options();
97
        // 长宽比
98
        options.withAspectRatio(x, y);
99
        //是否为圆
100
        options.setCircleDimmedLayer(true);
101
        // 是否让用户调整范围(默认false),如果开启,可能会造成剪切的图片的长宽比不是设定的
102
        // 如果不开启,用户不能拖动选框,只能缩放图片
103
        options.setFreeStyleCropEnabled(true);
104
        options.isCropDragSmoothToCenter(false);
105
        options.setSkipCropMimeType(PictureMimeType.ofGIF(), PictureMimeType.ofWEBP());
106
        options.isForbidCropGifWebp(false);
107
        options.isForbidSkipMultipleCrop(true);
108
        options.setMaxScaleMultiplier(100f);
109
        return options;
110
    }
111
}

+ 56 - 0
app/src/main/java/com/electric/chargingpile/util/ImageFileCompressEngine.java

@ -0,0 +1,56 @@
1
package com.electric.chargingpile.util;
2
3
import android.content.Context;
4
import android.net.Uri;
5
6
import com.luck.picture.lib.config.PictureMimeType;
7
import com.luck.picture.lib.engine.CompressFileEngine;
8
import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener;
9
import com.luck.picture.lib.utils.DateUtils;
10
11
import java.io.File;
12
import java.util.ArrayList;
13
14
import top.zibin.luban.Luban;
15
import top.zibin.luban.OnCompressListener;
16
import top.zibin.luban.OnNewCompressListener;
17
18
19
/**
20
 * 自定义压缩
21
 */
22
public class ImageFileCompressEngine implements CompressFileEngine {
23
24
    @Override
25
    public void onStartCompress(Context context, ArrayList<Uri> source, OnKeyValueResultCallbackListener call) {
26
        Luban.with(context).load(source).ignoreBy(0).setRenameListener(filePath -> {
27
            int indexOf = filePath.lastIndexOf(".");
28
            String postfix = indexOf != -1 ? filePath.substring(indexOf) : ".jpg";
29
            return DateUtils.getCreateFileName("CMP_") + postfix;
30
        }).filter(path -> {
31
            if (PictureMimeType.isUrlHasImage(path) && !PictureMimeType.isHasHttp(path)) {
32
                return true;
33
            }
34
            return !PictureMimeType.isUrlHasGif(path);
35
        }).setCompressListener(new OnNewCompressListener() {
36
            @Override
37
            public void onStart() {
38
39
            }
40
41
            @Override
42
            public void onSuccess(String source, File compressFile) {
43
                if (call != null) {
44
                    call.onCallback(source, compressFile.getAbsolutePath());
45
                }
46
            }
47
48
            @Override
49
            public void onError(String source, Throwable e) {
50
                if (call != null) {
51
                    call.onCallback(source, null);
52
                }
53
            }
54
        }).launch();
55
    }
56
}

+ 35 - 0
app/src/main/java/com/electric/chargingpile/util/MeOnCameraInterceptListener.java

@ -0,0 +1,35 @@
1
package com.electric.chargingpile.util;
2
3
import android.content.Context;
4
import android.widget.ImageView;
5
6
import androidx.fragment.app.Fragment;
7
8
import com.bumptech.glide.Glide;
9
import com.luck.lib.camerax.CameraImageEngine;
10
import com.luck.lib.camerax.SimpleCameraX;
11
import com.luck.picture.lib.interfaces.OnCameraInterceptListener;
12
13
public class MeOnCameraInterceptListener implements OnCameraInterceptListener {
14
    @Override
15
    public void openCamera(Fragment fragment, int cameraMode, int requestCode) {
16
        SimpleCameraX camera = SimpleCameraX.of();
17
        camera.isAutoRotation(true);
18
        camera.setCameraMode(cameraMode);
19
        camera.setVideoFrameRate(25);
20
        camera.setVideoBitRate(3 * 1024 * 1024);
21
        camera.isDisplayRecordChangeTime(true);
22
        camera.isManualFocusCameraPreview(true);
23
        camera.isZoomCameraPreview(true);
24
//        camera.setOutputPathDir(getSandboxCameraOutputPath())
25
//        camera.setPermissionDeniedListener(getSimpleXPermissionDeniedListener())
26
//        camera.setPermissionDescriptionListener(getSimpleXPermissionDescriptionListener())
27
        camera.setImageEngine(new CameraImageEngine() {
28
            @Override
29
            public void loadImage(Context context, String url, ImageView imageView) {
30
                Glide.with(context).load(url).into(imageView);
31
            }
32
        });
33
        camera.start(fragment.requireActivity(),fragment, requestCode);
34
    }
35
}

+ 16 - 0
app/src/main/java/com/electric/chargingpile/util/MeSandboxFileEngine.java

@ -0,0 +1,16 @@
1
package com.electric.chargingpile.util;
2
3
import android.content.Context;
4
5
import com.luck.picture.lib.engine.UriToFileTransformEngine;
6
import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener;
7
import com.luck.picture.lib.utils.SandboxTransformUtils;
8
9
public class MeSandboxFileEngine implements UriToFileTransformEngine {
10
    @Override
11
    public void onUriToFileAsyncTransform(Context context, String srcPath, String mineType, OnKeyValueResultCallbackListener call) {
12
        if (call != null) {
13
            call.onCallback(srcPath, SandboxTransformUtils.copyPathToSandbox(context, srcPath, mineType));
14
        }
15
    }
16
}

+ 116 - 0
app/src/main/java/com/electric/chargingpile/util/PictureUtlis.java

@ -0,0 +1,116 @@
1
package com.electric.chargingpile.util;
2
3
import androidx.core.content.ContextCompat;
4
5
import com.electric.chargingpile.R;
6
import com.electric.chargingpile.application.MainApplication;
7
import com.luck.picture.lib.style.BottomNavBarStyle;
8
import com.luck.picture.lib.style.PictureSelectorStyle;
9
import com.luck.picture.lib.style.SelectMainStyle;
10
import com.luck.picture.lib.style.TitleBarStyle;
11
12
public class PictureUtlis {
13
14
    public static PictureSelectorStyle getStyle(){
15
        TitleBarStyle blueTitleBarStyle = new TitleBarStyle();
16
17
18
        //标题栏左边关闭样式
19
        blueTitleBarStyle.setTitleLeftBackResource(R.drawable.ps_ic_black_back);
20
        //预览标题栏左边关闭样式
21
        blueTitleBarStyle.setPreviewTitleLeftBackResource(R.drawable.ps_ic_black_back);
22
        //标题栏字体色值
23
        blueTitleBarStyle.setTitleTextColor(ContextCompat.getColor(MainApplication.context, R.color.color_black));
24
        //标题栏右边文本字体色值
25
        blueTitleBarStyle.setTitleCancelTextColor(ContextCompat.getColor(MainApplication.context, R.color.color_black));
26
        blueTitleBarStyle.setTitleBackgroundColor(ContextCompat.getColor(MainApplication.context, R.color.color_white));
27
        //预览标题栏背景
28
        blueTitleBarStyle.setPreviewTitleBackgroundColor(ContextCompat.getColor(MainApplication.context, R.color.color_white));
29
        //标题栏高度
30
        blueTitleBarStyle.setTitleBarHeight(DensityUtil.dip2px(MainApplication.context,48));
31
        // 标题栏右边向上图标
32
        blueTitleBarStyle.setTitleDrawableRightResource(R.drawable.ic_orange_arrow_up);
33
        // 是否隐藏取消按钮
34
        blueTitleBarStyle.setHideCancelButton(false);
35
36
37
        BottomNavBarStyle numberBlueBottomNavBarStyle = new BottomNavBarStyle();
38
        //预览颜色
39
        numberBlueBottomNavBarStyle.setBottomPreviewNormalTextColor(ContextCompat.getColor(MainApplication.context, R.color.ps_color_9b));
40
        //预览颜色选中
41
        numberBlueBottomNavBarStyle.setBottomPreviewSelectTextColor(ContextCompat.getColor(MainApplication.context, R.color.color_accent));
42
43
        //底部导航栏背景色
44
        numberBlueBottomNavBarStyle.setBottomNarBarBackgroundColor(ContextCompat.getColor(MainApplication.context, R.color.color_white));
45
        //已选数量背景样式
46
        numberBlueBottomNavBarStyle.setBottomSelectNumResources( R.drawable.pic_select);
47
        //底部编辑文字色值
48
        numberBlueBottomNavBarStyle.setBottomEditorTextColor(ContextCompat.getColor(MainApplication.context, R.color.color_accent));
49
50
        //底部原图文字色值
51
        numberBlueBottomNavBarStyle.setBottomOriginalTextColor( ContextCompat.getColor(MainApplication.context, R.color.color_accent));
52
53
54
55
        SelectMainStyle numberBlueSelectMainStyle =new  SelectMainStyle();
56
        //状态栏背景色
57
        numberBlueSelectMainStyle.setStatusBarColor(ContextCompat.getColor(MainApplication.context, R.color.color_white));
58
59
        //导航栏背景色
60
        numberBlueSelectMainStyle.setNavigationBarColor(ContextCompat.getColor(MainApplication.context, R.color.color_white));
61
62
        //状态栏字体颜色,非黑即白
63
        numberBlueSelectMainStyle.setDarkStatusBarBlack(true);
64
        //完成按钮从底部放在右上角
65
        numberBlueSelectMainStyle.setCompleteSelectRelativeTop(false);
66
        //预览页选择按钮从顶部放在右下角
67
        numberBlueSelectMainStyle.setPreviewSelectRelativeBottom(false);
68
        //预览页是否显示选择画廊
69
        numberBlueSelectMainStyle.setPreviewDisplaySelectGallery(true);
70
        //预览页选择按钮MarginRight
71
//        numberBlueSelectMainStyle.previewSelectMarginRight = true
72
        //预览背景色
73
        numberBlueSelectMainStyle.setPreviewBackgroundColor( ContextCompat.getColor(MainApplication.context, R.color.color_white));
74
        //预览页选择按钮字体颜色
75
        numberBlueSelectMainStyle.setPreviewSelectTextColor(ContextCompat.getColor(MainApplication.context, R.color.color_black));
76
        //预览页选择按钮文本
77
        numberBlueSelectMainStyle.setPreviewSelectText("");
78
        //预览页勾选样式是否使用数量类型
79
        numberBlueSelectMainStyle.setPreviewSelectNumberStyle(true);
80
        //预览页勾选样式
81
        numberBlueSelectMainStyle.setPreviewSelectBackground(R.drawable.pic_select);
82
83
        //画廊大小
84
        numberBlueSelectMainStyle.setAdapterPreviewGalleryItemSize(DensityUtil.dip2px(MainApplication.context,60));
85
        //勾选样式
86
        numberBlueSelectMainStyle.setSelectBackground(R.drawable.app_preview_select);
87
88
        //勾选样式是否使用数量类型
89
        numberBlueSelectMainStyle.setSelectNumberStyle(true);
90
91
        //列表背景色
92
        numberBlueSelectMainStyle.setMainListBackgroundColor( ContextCompat.getColor(MainApplication.context, R.color.color_white));
93
        //选择按钮默认文本字体色值
94
//        numberBlueSelectMainStyle.selectNormalTextColor = true
95
        //选择按钮默认背景
96
//        numberBlueSelectMainStyle.selectNormalBackgroundResources = R.drawable.app_preview_select
97
98
        // 列表背景色
99
        numberBlueSelectMainStyle.setMainListBackgroundColor(ContextCompat.getColor(MainApplication.context, R.color.ps_color_white));
100
101
        //选择按钮默认文本字体色值
102
        numberBlueSelectMainStyle.setSelectNormalTextColor(ContextCompat.getColor(MainApplication.context, R.color.ps_color_9b));
103
104
        //选择按钮文本字体色值
105
        numberBlueSelectMainStyle.setSelectTextColor(ContextCompat.getColor(MainApplication.context, R.color.color_accent));
106
107
        numberBlueSelectMainStyle.setSelectText(R.string.ps_completed);
108
109
110
        PictureSelectorStyle selectorStyle = new PictureSelectorStyle();
111
        selectorStyle.setTitleBarStyle(blueTitleBarStyle);
112
        selectorStyle.setBottomBarStyle(numberBlueBottomNavBarStyle);
113
        selectorStyle.setSelectMainStyle(numberBlueSelectMainStyle);
114
        return selectorStyle;
115
    }
116
}

+ 30 - 75
app/src/main/java/com/electric/chargingpile/util/Util.java

@ -21,7 +21,8 @@ import com.electric.chargingpile.data.RedEnvelopeBean;
21 21
import com.electric.chargingpile.data.Zhan;
22 22
import com.electric.chargingpile.data.Zhuang;
23 23
import com.electric.chargingpile.manager.ProfileManager;
24
import com.luck.picture.lib.style.PictureParameterStyle;
24

25
import com.luck.picture.lib.entity.LocalMedia;
25 26
import com.tencent.mm.opensdk.openapi.IWXAPI;
26 27
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
27 28

@ -492,80 +493,6 @@ public class Util {
492 493
//    }
493 494
//
494 495

495
    public static PictureParameterStyle getWhiteStyle(Context context) {
496
        // 相册主题
497
        PictureParameterStyle style = new PictureParameterStyle();
498
        // 是否改变状态栏字体颜色(黑白切换)
499
        style.isChangeStatusBarFontColor = true;
500
        // 是否开启右下角已完成(0/9)风格
501
        style.isOpenCompletedNumStyle = false;
502
        // 是否开启类似QQ相册带数字选择风格
503
        style.isOpenCheckNumStyle = false;
504
        // 相册状态栏背景色
505
        style.pictureStatusBarColor = Color.parseColor("#FFFFFF");
506
        // 相册列表标题栏背景色
507
        style.pictureTitleBarBackgroundColor = Color.parseColor("#FFFFFF");
508
        // 相册列表标题栏右侧上拉箭头
509
        style.pictureTitleUpResId = R.drawable.ic_orange_arrow_up;
510
        // 相册列表标题栏右侧下拉箭头
511
        style.pictureTitleDownResId = R.drawable.ic_orange_arrow_down;
512
        // 相册文件夹列表选中圆点
513
        style.pictureFolderCheckedDotStyle = com.luck.picture.lib.R.drawable.picture_orange_oval;
514
        // 相册返回箭头
515
        style.pictureLeftBackIcon = R.drawable.ic_back_orange;
516
        // 标题栏字体颜色
517
        style.pictureTitleTextColor = ContextCompat.getColor(context, R.color.app_color_black);
518
        // 相册右侧取消按钮字体颜色  废弃 改用.pictureRightDefaultTextColor和.pictureRightDefaultTextColor
519
        style.pictureCancelTextColor = ContextCompat.getColor(context, R.color.app_color_black);
520
        // 选择相册目录背景样式
521
        style.pictureAlbumStyle = R.drawable.picture_new_item_select_bg;
522
        // 相册列表勾选图片样式
523
        style.pictureCheckedStyle = com.luck.picture.lib.R.drawable.picture_checkbox_selector;
524
        // 相册列表底部背景色
525
        style.pictureBottomBgColor = ContextCompat.getColor(context, com.luck.picture.lib.R.color.picture_color_fa);
526
        // 已选数量圆点背景样式
527
        style.pictureCheckNumBgStyle = com.luck.picture.lib.R.drawable.picture_num_oval;
528
        // 相册列表底下预览文字色值(预览按钮可点击时的色值)
529
        style.picturePreviewTextColor = ContextCompat.getColor(context, com.luck.picture.lib.R.color.picture_color_fa632d);
530
        // 相册列表底下不可预览文字色值(预览按钮不可点击时的色值)
531
        style.pictureUnPreviewTextColor = ContextCompat.getColor(context, com.luck.picture.lib.R.color.picture_color_9b);
532
        // 相册列表已完成色值(已完成 可点击色值)
533
        style.pictureCompleteTextColor = ContextCompat.getColor(context, com.luck.picture.lib.R.color.picture_color_fa632d);
534
        // 相册列表未完成色值(请选择 不可点击色值)
535
        style.pictureUnCompleteTextColor = ContextCompat.getColor(context, com.luck.picture.lib.R.color.picture_color_9b);
536
        // 预览界面底部背景色
537
        style.picturePreviewBottomBgColor = ContextCompat.getColor(context, com.luck.picture.lib.R.color.picture_color_white);
538
        // 原图按钮勾选样式  需设置.isOriginalImageControl(true); 才有效
539
        style.pictureOriginalControlStyle = com.luck.picture.lib.R.drawable.picture_original_checkbox;
540
        // 原图文字颜色 需设置.isOriginalImageControl(true); 才有效
541
        style.pictureOriginalFontColor = ContextCompat.getColor(context, R.color.app_color_53575e);
542
        // 外部预览界面删除按钮样式
543
        style.pictureExternalPreviewDeleteStyle = com.luck.picture.lib.R.drawable.picture_icon_black_delete;
544
        // 外部预览界面是否显示删除按钮
545
        style.pictureExternalPreviewGonePreviewDelete = true;
546
//        // 自定义相册右侧文本内容设置
547
//        mPictureParameterStyle.pictureRightDefaultText = "";
548
//        // 自定义相册未完成文本内容
549
//        mPictureParameterStyle.pictureUnCompleteText = "";
550
//        // 自定义相册完成文本内容
551
//        mPictureParameterStyle.pictureCompleteText = "";
552
//        // 自定义相册列表不可预览文字
553
//        mPictureParameterStyle.pictureUnPreviewText = "";
554
//        // 自定义相册列表预览文字
555
//        mPictureParameterStyle.picturePreviewText = "";
556

557
//        // 自定义相册标题字体大小
558
//        mPictureParameterStyle.pictureTitleTextSize = 18;
559
//        // 自定义相册右侧文字大小
560
//        mPictureParameterStyle.pictureRightTextSize = 14;
561
//        // 自定义相册预览文字大小
562
//        mPictureParameterStyle.picturePreviewTextSize = 14;
563
//        // 自定义相册完成文字大小
564
//        mPictureParameterStyle.pictureCompleteTextSize = 14;
565
//        // 自定义原图文字大小
566
//        mPictureParameterStyle.pictureOriginalTextSize = 14;
567
        return style;
568
    }
569 496

570 497
    /**
571 498
     * 判断手机是否安装微信
@ -660,4 +587,32 @@ public class Util {
660 587
        }
661 588
        return builder.toString();
662 589
    }
590

591
    public static String getCompressAbsolutePath(LocalMedia localMedia){
592
        String path = "";
593
         if (localMedia.isCompressed()){
594
            String compressPath = localMedia.getCompressPath();
595
            if (compressPath == null || compressPath .equals("") ){
596
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
597
                    path = localMedia.getSandboxPath();
598
                } else {
599
                    path = localMedia.getRealPath();
600
                }
601
            }else{
602
                path = compressPath;
603
            }
604
        }else{
605
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
606
                path = localMedia.getSandboxPath();
607
            } else {
608
                path =  localMedia.getRealPath();
609
            }
610
        }
611
        if (path == null || path.equals("")){
612
            path = localMedia.getAvailablePath();
613
        }
614
        return path;
615

616
    }
617

663 618
}

+ 220 - 0
app/src/main/java/com/electric/chargingpile/view/IjkPlayerView.java

@ -0,0 +1,220 @@
1
package com.electric.chargingpile.view;
2
3
import android.content.Context;
4
import android.graphics.SurfaceTexture;
5
import android.net.Uri;
6
import android.util.AttributeSet;
7
import android.view.Gravity;
8
import android.view.Surface;
9
import android.view.TextureView;
10
import android.widget.FrameLayout;
11
12
import androidx.annotation.NonNull;
13
14
import com.luck.picture.lib.config.PictureMimeType;
15
16
import java.io.IOException;
17
18
import tv.danmaku.ijk.media.player.IMediaPlayer;
19
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
20
21
public class IjkPlayerView extends FrameLayout implements TextureView.SurfaceTextureListener {
22
    private IjkVideoTextureView textureView;
23
    private IjkMediaPlayer mediaPlayer;
24
    private int mVideoRotation;
25
26
    public IjkPlayerView(@NonNull Context context) {
27
        super(context);
28
        init();
29
    }
30
31
    public IjkPlayerView(@NonNull Context context, AttributeSet attrs) {
32
        super(context, attrs);
33
        init();
34
    }
35
36
    public IjkPlayerView(@NonNull Context context, AttributeSet attrs, int defStyleAttr) {
37
        super(context, attrs, defStyleAttr);
38
        init();
39
    }
40
41
    public static int[] scaleSize(int textureWidth, int textureHeight, int realWidth, int realHeight) {
42
        float deviceRate = (float) textureWidth / (float) textureHeight;
43
        float rate = (float) realWidth / (float) realHeight;
44
        int width;
45
        int height;
46
        if (rate < deviceRate) {
47
            height = textureHeight;
48
            width = (int) (textureHeight * rate);
49
        } else {
50
            width = textureWidth;
51
            height = (int) (textureWidth / rate);
52
        }
53
        return new int[]{width, height};
54
    }
55
56
    private void init() {
57
        textureView = new IjkVideoTextureView(getContext());
58
        textureView.setSurfaceTextureListener(this);
59
        LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
60
        layoutParams.gravity = Gravity.CENTER;
61
        textureView.setLayoutParams(layoutParams);
62
        addView(textureView);
63
    }
64
65
    public IjkMediaPlayer initMediaPlayer() {
66
        if (mediaPlayer == null) {
67
            mediaPlayer = new IjkMediaPlayer();
68
        }
69
        mediaPlayer.setOnVideoSizeChangedListener(new IMediaPlayer.OnVideoSizeChangedListener() {
70
            @Override
71
            public void onVideoSizeChanged(IMediaPlayer mediaPlayer, int width, int height, int sar_num, int sar_den) {
72
                textureView.adjustVideoSize(width, height, mVideoRotation);
73
            }
74
        });
75
        mediaPlayer.setOnInfoListener(new IMediaPlayer.OnInfoListener() {
76
            @Override
77
            public boolean onInfo(IMediaPlayer mp, int what, int extra) {
78
                if (what == 10001) {
79
                    mVideoRotation = extra;
80
                }
81
                return false;
82
            }
83
        });
84
        mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);
85
        return mediaPlayer;
86
    }
87
88
    public IjkMediaPlayer getMediaPlayer() {
89
        return mediaPlayer;
90
    }
91
92
    public void start(String path) {
93
        try {
94
            if (PictureMimeType.isContent(path)) {
95
                mediaPlayer.setDataSource(getContext(), Uri.parse(path));
96
            } else {
97
                mediaPlayer.setDataSource(path);
98
            }
99
            SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
100
            if (surfaceTexture != null) {
101
                mediaPlayer.setSurface(new Surface(surfaceTexture));
102
            }
103
            mediaPlayer.prepareAsync();
104
        } catch (IOException e) {
105
            e.printStackTrace();
106
        }
107
    }
108
109
    @Override
110
    public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) {
111
        mediaPlayer.setSurface(new Surface(surface));
112
    }
113
114
    @Override
115
    public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surface, int width, int height) {
116
    }
117
118
    @Override
119
    public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surface) {
120
        return false;
121
    }
122
123
    @Override
124
    public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surface) {
125
126
    }
127
128
    public void release() {
129
        if (mediaPlayer != null) {
130
            mediaPlayer.release();
131
            mediaPlayer.setOnPreparedListener(null);
132
            mediaPlayer.setOnCompletionListener(null);
133
            mediaPlayer.setOnErrorListener(null);
134
            mediaPlayer.setOnInfoListener(null);
135
            mediaPlayer = null;
136
        }
137
    }
138
139
    public void clearCanvas() {
140
    }
141
142
    public static class IjkVideoTextureView extends TextureView {
143
        /**
144
         * 视频宽度
145
         */
146
        private int mVideoWidth;
147
        /**
148
         * 视频高度
149
         */
150
        private int mVideoHeight;
151
152
        /**
153
         * 视频旋转角度
154
         */
155
        private int mVideoRotation;
156
157
        public IjkVideoTextureView(@NonNull Context context) {
158
            super(context);
159
        }
160
161
        public void adjustVideoSize(int videoWidth, int videoHeight, int videoRotation) {
162
            this.mVideoWidth = videoWidth;
163
            this.mVideoHeight = videoHeight;
164
            this.mVideoRotation = videoRotation;
165
            this.setRotation(mVideoRotation);
166
            this.requestLayout();
167
        }
168
169
        @Override
170
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
171
            int width = getDefaultSize(mVideoWidth, widthMeasureSpec);
172
            int height = getDefaultSize(mVideoHeight, heightMeasureSpec);
173
            int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
174
            int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
175
            int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
176
            int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
177
            if (mVideoWidth > 0 && mVideoHeight > 0) {
178
                if (widthSpecMode == MeasureSpec.EXACTLY && heightSpecMode == MeasureSpec.EXACTLY) {
179
                    width = widthSpecSize;
180
                    height = heightSpecSize;
181
182
                    if (mVideoWidth * height < width * mVideoHeight) {
183
                        width = height * mVideoWidth / mVideoHeight;
184
                    } else if (mVideoWidth * height > width * mVideoHeight) {
185
                        height = width * mVideoHeight / mVideoWidth;
186
                    }
187
                } else if (widthSpecMode == MeasureSpec.EXACTLY) {
188
                    width = widthSpecSize;
189
                    height = width * mVideoHeight / mVideoWidth;
190
                    if (heightSpecMode == MeasureSpec.AT_MOST && height > heightSpecSize) {
191
                        height = heightSpecSize;
192
                    }
193
                } else if (heightSpecMode == MeasureSpec.EXACTLY) {
194
                    height = heightSpecSize;
195
                    width = height * mVideoWidth / mVideoHeight;
196
                    if (widthSpecMode == MeasureSpec.AT_MOST && width > widthSpecSize) {
197
                        width = widthSpecSize;
198
                    }
199
                } else {
200
                    width = mVideoWidth;
201
                    height = mVideoHeight;
202
                    if (heightSpecMode == MeasureSpec.AT_MOST && height > heightSpecSize) {
203
                        height = heightSpecSize;
204
                        width = height * mVideoWidth / mVideoHeight;
205
                    }
206
                    if (widthSpecMode == MeasureSpec.AT_MOST && width > widthSpecSize) {
207
                        width = widthSpecSize;
208
                        height = width * mVideoHeight / mVideoWidth;
209
                    }
210
                }
211
            }
212
            setMeasuredDimension(width, height);
213
            if ((mVideoRotation + 180) % 180 != 0) {
214
                int[] size = scaleSize(widthSpecSize, heightSpecSize, height, width);
215
                setScaleX(size[0] / ((float) height));
216
                setScaleY(size[1] / ((float) width));
217
            }
218
        }
219
    }
220
}

BIN
app/src/main/res/drawable-xxhdpi/app_back_black.png


+ 11 - 0
app/src/main/res/drawable/app_preview_select.xml

@ -0,0 +1,11 @@
1
<?xml version="1.0" encoding="utf-8"?>
2
<shape xmlns:android="http://schemas.android.com/apk/res/android"
3
    android:shape="oval"
4
    android:useLevel="false">
5
6
    <solid android:color="@color/color_transparent" />
7
    <size
8
        android:width="18dp"
9
        android:height="18dp" />
10
    <stroke android:width="1dp" android:color="@color/color_accent"/>
11
</shape>

BIN
app/src/main/res/drawable/img.png


BIN
app/src/main/res/drawable/img_1.png


+ 11 - 0
app/src/main/res/drawable/pic_select.xml

@ -0,0 +1,11 @@
1
<?xml version="1.0" encoding="utf-8"?>
2
<shape xmlns:android="http://schemas.android.com/apk/res/android"
3
    android:shape="oval"
4
    android:useLevel="false">
5
6
    <solid android:color="@color/color_accent" />
7
    <size
8
        android:width="18dp"
9
        android:height="18dp" />
10
    <stroke android:width="1dp" android:color="@color/color_accent"/>
11
</shape>

+ 2 - 1
app/src/main/res/values/color.xml

@ -18,7 +18,8 @@
18 18
    <color name="bkg_button_green">#39c663</color>
19 19
    <color name="ui_green">#39C663</color>
20 20
    <color name="title_background">#FCFCFC</color>
21

21
    <color name="color_accent">#ff6600</color>
22
    <color name="color_transparent">#00FFFFFF</color>
22 23
    <!-- PictureSelector -->
23 24
    <color name="app_color_grey">#393a3e</color>
24 25
    <color name="app_color_black">#000000</color>

+ 0 - 52
app/src/main/res/values/styles.xml

@ -303,58 +303,6 @@
303 303

304 304
    <style name="BaseNoActionBarTheme" parent="Theme.AppCompat.Light.NoActionBar" />
305 305
    <!--白色主题样式,,注意每一项都不能少-->
306
    <style name="picture.white.style" parent="BaseNoActionBarTheme">
307
        <!-- Customize your theme here. -->
308
        <!--标题栏背景色-->
309
        <item name="colorPrimary">@color/app_color_white</item>
310
        <!--状态栏背景色-->
311
        <item name="colorPrimaryDark">@color/app_color_white</item>
312
        <!--是否改变图片列表界面状态栏字体颜色为黑色-->
313
        <item name="picture.statusFontColor">true</item>
314
        <!--返回键图标-->
315
        <item name="picture.leftBack.icon">@drawable/ic_back_arrow</item>
316
        <!--标题下拉箭头-->
317
        <item name="picture.arrow_down.icon">@drawable/ic_orange_arrow_down</item>
318
        <!--标题上拉箭头-->
319
        <item name="picture.arrow_up.icon">@drawable/ic_orange_arrow_up</item>
320
        <!--标题文字颜色-->
321
        <item name="picture.title.textColor">@color/app_color_black</item>
322
        <!--标题栏右边文字-->
323
        <item name="picture.right.textColor">@color/app_color_black</item>
324
        <!--图片列表勾选样式-->
325
        <item name="picture.checked.style">@drawable/picture_checkbox_selector</item>
326
        <!--开启图片列表勾选数字模式,开启的话勾选样式要换-->
327
        <item name="picture.style.checkNumMode">false</item>
328
        <!--选择图片样式0/9-->
329
        <item name="picture.style.numComplete">true</item>
330
        <!--图片列表底部背景色-->
331
        <item name="picture.bottom.bg">@color/app_color_fa</item>
332
        <!--图片列表预览文字颜色-->
333
        <item name="picture.preview.textColor">@color/picture_list_sina_text_color</item>
334
        <!--图片列表已完成文字颜色-->
335
        <item name="picture.complete.textColor">@color/picture_list_sina_text_color</item>
336
        <!--图片已选数量圆点背景色-->
337
        <item name="picture.num.style">@drawable/picture_num_oval</item>
338
        <!--预览界面标题栏背景色-->
339
        <item name="picture.ac_preview.title.bg">@color/app_color_white</item>
340
        <!--预览界面标题文字颜色-->
341
        <item name="picture.ac_preview.title.textColor">@color/app_color_black</item>
342
        <!--预览界面已完成文字颜色-->
343
        <item name="picture.ac_preview.complete.textColor">@color/picture_list_sina_text_color
344
        </item>
345
        <!--预览界面底部背景色-->
346
        <item name="picture.ac_preview.bottom.bg">@color/picture_color_fa</item>
347
        <!--预览界面返回箭头-->
348
        <item name="picture.preview.leftBack.icon">@drawable/ic_back_arrow</item>
349
        <!--裁剪页面标题背景色-->
350
        <item name="picture.crop.toolbar.bg">@color/app_color_white</item>
351
        <!--裁剪页面状态栏颜色-->
352
        <item name="picture.crop.status.color">@color/app_color_white</item>
353
        <!--裁剪页面标题文字颜色-->
354
        <item name="picture.crop.title.color">@color/app_color_black</item>
355
        <!--相册文件夹列表选中图标-->
356
        <item name="picture.folder_checked_dot">@drawable/picture_orange_oval</item>
357
    </style>
358 306

359 307
    <declare-styleable name="TextImageView">
360 308
        <attr name="drawableLeftWidth" format="dimension" />

+ 2 - 2
config.gradle

@ -1,9 +1,9 @@
1 1
ext{
2 2
    android = [
3
            compileSdkVersion: 31,
3
            compileSdkVersion: 33,
4 4
            applicationId    : "com.electric.chargingpile",
5 5
            minSdkVersion    : 24,
6
            targetSdkVersion : 31,
6
            targetSdkVersion : 33,
7 7
    ]
8 8
9 9
    manifestPlaceholders= [

Каталог - Gogs: Go Git Service
zdwl
Регистриран Aug 17, 2016
shizhongqiu0808
Регистриран Aug 18, 2016
quyongjuan
Регистриран Aug 19, 2016
Demonht
Регистриран Aug 23, 2016
Tristan
Регистриран Mar 01, 2017
T11
Регистриран Mar 11, 2017
echo
Регистриран Mar 27, 2017
frontzhm
Регистриран Apr 06, 2017
cdzzhm
Регистриран Apr 07, 2017
huxq
Регистриран Nov 20, 2017
zqbx
Регистриран May 04, 2018
guanhaiqing
Регистриран Jul 05, 2018
liuyazhe
Регистриран Sep 06, 2018
dongfengtao
Регистриран Nov 22, 2018
dudu
Регистриран Dec 29, 2018
huyuguo
Регистриран Apr 03, 2019
xingkongs
Регистриран Jul 05, 2019
lilinzhu
Регистриран Oct 15, 2020
liuweili
Регистриран Feb 01, 2021
huyongchao
Регистриран May 26, 2021