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= [

cdzApp - Gogs: Go Git Service

充电桩app代码

huyuguo 752114f660 列表更新为附近 %!s(int64=4) %!d(string=hace) años
.idea ad7d3228bc 车主认证图片上传 %!s(int64=5) %!d(string=hace) años
XRefreshView 319397b60f 配置信息优化 %!s(int64=5) %!d(string=hace) años
app 752114f660 列表更新为附近 %!s(int64=4) %!d(string=hace) años
autolayout 319397b60f 配置信息优化 %!s(int64=5) %!d(string=hace) años
gradle b98aa2e34f 代码修改 %!s(int64=5) %!d(string=hace) años
keystore 06bd894653 init %!s(int64=7) %!d(string=hace) años
library 319397b60f 配置信息优化 %!s(int64=5) %!d(string=hace) años
zxing 3a5a14c12a 充电状态修改完成 %!s(int64=4) %!d(string=hace) años
.gitignore a90ec777b5 视频功能完成 %!s(int64=5) %!d(string=hace) años
README.md 9f927f0d57 列表开发 %!s(int64=6) %!d(string=hace) años
build.gradle 06d8b7460a 代码更新 %!s(int64=5) %!d(string=hace) años
gradle.properties 2ccff5dbe6 配置优化 %!s(int64=5) %!d(string=hace) años
gradlew 3473529e39 fix video play exception %!s(int64=7) %!d(string=hace) años
gradlew.bat e1cf244fe0 remove Useless dependence %!s(int64=7) %!d(string=hace) años
icon_sgreen.png e1cf244fe0 remove Useless dependence %!s(int64=7) %!d(string=hace) años
settings.gradle a90ec777b5 视频功能完成 %!s(int64=5) %!d(string=hace) años

README.md

地图首页

MainMapActivity.java
activity_main_map.xml

智能推荐(地图首页右下角)

RecommendZhanActivity.java
activity_recommend_zhan.xml
item_recommend_zhan.xml

筛选(地图首页)

NewScreenActivity.java
activity_new_screen.xml

列表(地图首页右上角,旧功能由推荐替换)

ZhanListActivity.java
activity_zhan_list.xml

推荐

RecommendChargingStationActivity.java
activity_recommend_charging_station.xml
recommend_charging_station_item.xml

站点详情

NewZhanDetailsActivity.class
activity_new_zhan_details.xml
DetailsFragment.java
fragmen_details_new.xml