nguage-java"> .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回 749
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
750
                .isPreviewImage(true)//是否预览图片
751
                .setFilterMinFileSize(1) //过滤最小文件
752
                .forResult(REQUEST_CODE_CHOOSE);
715 753
    }
716 754
717 755
    private boolean isPermissionOK() {

+ 140 - 88
app/src/main/java/com/electric/chargingpile/activity/ChargingCommentActivity.java

@ -11,6 +11,7 @@ import android.graphics.drawable.BitmapDrawable;
11 11
import android.os.Bundle;
12 12
import android.os.Handler;
13 13
import android.os.Message;
14
import android.provider.MediaStore;
14 15
import android.text.Editable;
15 16
import android.text.Html;
16 17
import android.text.TextUtils;
@ -32,6 +33,7 @@ import android.widget.TextView;
32 33
import android.widget.Toast;
33 34
34 35
import androidx.appcompat.app.AppCompatActivity;
36
import androidx.fragment.app.Fragment;
35 37
import androidx.recyclerview.widget.GridLayoutManager;
36 38
import androidx.recyclerview.widget.RecyclerView;
37 39
@ -55,9 +57,14 @@ import com.electric.chargingpile.util.CommonParams;
55 57
import com.electric.chargingpile.util.DES3;
56 58
import com.electric.chargingpile.util.DateUtils;
57 59
import com.electric.chargingpile.util.DensityUtil;
60
import com.electric.chargingpile.util.IjkPlayerEngine;
61
import com.electric.chargingpile.util.ImageFileCompressEngine;
58 62
import com.electric.chargingpile.util.JsonUtils;
59 63
import com.electric.chargingpile.util.LoadingDialog;
60 64
import com.electric.chargingpile.util.Md5Util;
65
import com.electric.chargingpile.util.MeOnCameraInterceptListener;
66
import com.electric.chargingpile.util.MeSandboxFileEngine;
67
import com.electric.chargingpile.util.PictureUtlis;
61 68
import com.electric.chargingpile.util.Res;
62 69
import com.electric.chargingpile.util.ScreenUtils;
63 70
import com.electric.chargingpile.util.StatusConstants;
@ -71,10 +78,16 @@ import com.electric.chargingpile.view.REditText;
71 78
import com.electric.chargingpile.view.RatingBarView;
72 79
import com.google.gson.Gson;
73 80
import com.google.gson.reflect.TypeToken;
74
import com.luck.picture.lib.PictureSelector;
81
82
import com.hjq.permissions.OnPermissionCallback;
83
import com.hjq.permissions.XXPermissions;
84
import com.luck.lib.camerax.SimpleCameraX;
75 85
import com.luck.picture.lib.animators.AnimationType;
86
import com.luck.picture.lib.basic.PictureSelector;
76 87
import com.luck.picture.lib.config.PictureConfig;
77 88
import com.luck.picture.lib.config.PictureMimeType;
89
import com.luck.picture.lib.config.SelectMimeType;
90
import com.luck.picture.lib.config.SelectModeConfig;
78 91
import com.luck.picture.lib.entity.LocalMedia;
79 92
import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet;
80 93
import com.upyun.library.common.SerialUploader;
@ -116,11 +129,16 @@ import pub.devrel.easypermissions.AfterPermissionGranted;
116 129
import pub.devrel.easypermissions.EasyPermissions;
117 130
118 131
import static android.text.Html.FROM_HTML_MODE_LEGACY;
132
import static com.hjq.permissions.Permission.CAMERA;
133
import static com.hjq.permissions.Permission.READ_MEDIA_IMAGES;
134
import static com.hjq.permissions.Permission.READ_MEDIA_VIDEO;
135
import static com.luck.lib.camerax.CustomCameraConfig.BUTTON_STATE_ONLY_RECORDER;
136
119 137
/**
120 138
 * 如果更改此页面,则需要同步更改 ChargingCommentActivity,
121 139
 * ChargingCommentActivity 该页面为从我的->充电记录->去评论
122 140
 * */
123
public class ChargingCommentActivity extends AppCompatActivity implements View.OnClickListener, PlatformActionListener, EasyPermissions.PermissionCallbacks, GridImageAdapter.GridImgListener {
141
public class ChargingCommentActivity extends AppCompatActivity implements View.OnClickListener, PlatformActionListener,GridImageAdapter.GridImgListener {
124 142
    private static final String TAG = "ChargingCommentActivity";
125 143
    private static final int PIC_NUM = 3;
126 144
    private ProgressDialog insertDialog;
@ -469,7 +487,7 @@ public class ChargingCommentActivity extends AppCompatActivity implements View.O
469 487
                    setLayoutHintVisible(1);
470 488
                    //异步方式插入图片
471 489
//                    insertImagesSync(data);
472
                    Bimp.tempSelectMedia = PictureSelector.obtainMultipleResult(data);
490
                    Bimp.tempSelectMedia = PictureSelector.obtainSelectorList(data);
473 491
                    mAdapter.setMaxCount(3);
474 492
                    mInsterType = 1;
475 493
@ -481,7 +499,7 @@ public class ChargingCommentActivity extends AppCompatActivity implements View.O
481 499
                    setLayoutHintVisible(2);
482 500
                    mInsterType = 2;
483 501
                    mAdapter.setMaxCount(1);
484
                    Bimp.tempSelectMedia = PictureSelector.obtainMultipleResult(data);
502
                    Bimp.tempSelectMedia = PictureSelector.obtainSelectorList(data);
485 503
                    mAdapter.setDatas(Bimp.tempSelectMedia);
486 504
                }
487 505
            }
@ -514,12 +532,7 @@ public class ChargingCommentActivity extends AppCompatActivity implements View.O
514 532
515 533
        for (int i = 0; i < Bimp.tempSelectMedia.size(); i++) {
516 534
            LocalMedia media = Bimp.tempSelectMedia.get(i);
517
            String path = "";
518
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q)
519
                path = media.getAndroidQToPath();
520
            else {
521
                path = media.getPath();
522
            }
535
            String path = Util.getCompressAbsolutePath(media);
523 536
            bm = imageZoom(BitmapFactory.decodeFile(path));
524 537
            String file = bitmapToBase64(bm);
525 538
            Map<String, String> par = new HashMap<String, String>();
@ -861,13 +874,7 @@ public class ChargingCommentActivity extends AppCompatActivity implements View.O
861 874
                        } else if (Bimp.tempSelectMedia.size() > 0 && mInsterType == 2) {
862 875
                            //进行视频验证
863 876
                            LocalMedia media = Bimp.tempSelectMedia.get(0);
864
                            String path = "";
865
                            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q)
866
                                path = media.getAndroidQToPath();
867
                            else {
868
                                path = media.getPath();
869
                            }
870
877
                            String path = Util.getCompressAbsolutePath(media);
871 878
872 879
                            getYouPaiData(path);
873 880
                        } else {
@ -1027,49 +1034,89 @@ public class ChargingCommentActivity extends AppCompatActivity implements View.O
1027 1034
    }
1028 1035
    private void addImg() {
1029 1036
        PictureSelector.create(this)
1030
                .openGallery(PictureMimeType.ofImage())
1031
                .maxSelectNum(PIC_NUM)
1032
                .selectionMode(PictureConfig.MULTIPLE)
1033
                .selectionData(Bimp.tempSelectMedia)//是否传入已选图片
1034
                .isCompress(true)//是否压缩
1035
                .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
1036
                .isGif(true)//是否显示gif
1037
                .isAndroidQTransform(true)
1038
                .imageEngine(GlideEngine.createGlideEngine())
1039
                .isWeChatStyle(false)// 是否开启微信图片选择风格
1040
                .isUseCustomCamera(false)// 是否使用自定义相机
1041
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
1042
                .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
1043
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
1044
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
1045
                .imageSpanCount(4)// 每行显示个数
1046
                .isReturnEmpty(false)// 选择数据时点击按钮是否可以返回
1047
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
1037
                .openGallery(SelectMimeType.ofImage())
1038
                .setSelectorUIStyle(PictureUtlis.getStyle())
1039
                .setImageEngine(GlideEngine.createGlideEngine())
1040
                .setCompressEngine(new ImageFileCompressEngine()) //设置压缩
1041
                .setSandboxFileEngine(new MeSandboxFileEngine()) //设置相册沙盒目录拷贝引擎
1042
                .setCameraInterceptListener(new MeOnCameraInterceptListener())
1043
                .setSelectionMode(SelectModeConfig.MULTIPLE)
1044
                .setMaxSelectNum(PIC_NUM)
1045
                .isEmptyResultReturn(true) //支持未选择返回
1046
                .setImageSpanCount(4)
1047
                .isPageStrategy(true)   // 是否开启分页模式
1048
                .isDisplayCamera(true) //是否显示相机入口
1049
                .isPreviewFullScreenMode(true)//预览点击全屏效果
1050
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
1051
                .isEmptyResultReturn(true)//支持未选择返回
1052
                .isWithSelectVideoImage(false)//是否支持视频图片同选
1053
                .isSelectZoomAnim(true)// 选择缩略图缩放效果
1054
                .isCameraAroundState(false)// 是否开启前置摄像头;系统相机 只支持部分机型
1055
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
1056
                .isGif(true)// 是否显示gif文件
1057
                .isWebp(true)// 是否显示webp文件
1058
                .isBmp(true)//是否显示bmp文件
1059
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
1060
                .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
1061
                .isFastSlidingSelect(true) //快速滑动选择
1062
                .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回
1063
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
1064
                .isPreviewImage(true)//是否预览图片
1065
                .setFilterMinFileSize(1) //过滤最小文件
1048 1066
                .forResult(REQUEST_CODE_CHOOSE);
1049 1067
    }
1068
1050 1069
    private void addVideo() {
1051 1070
        PictureSelector.create(this)
1052
                .openGallery(PictureMimeType.ofVideo())
1053
                .selectionMode(PictureConfig.SINGLE)
1054
                .isCompress(true)//是否压缩
1055
                .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
1056
                .isAndroidQTransform(true)
1057
                .imageEngine(GlideEngine.createGlideEngine())
1058
                .isWeChatStyle(false)// 是否开启微信图片选择风格
1059
                .isUseCustomCamera(false)// 是否使用自定义相机
1060
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
1061
                .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
1062
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
1063
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
1064
                .imageSpanCount(4)// 每行显示个数
1065
                .isReturnEmpty(false)// 选择数据时点击按钮是否可以返回
1066
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
1067
                .videoMaxSecond(16)   // 查询多少秒以内的视频
1068
                .videoMinSecond(2)   // 查询多少秒以内的视频
1069
                .recordVideoSecond(15)//录制视频秒数 默认60s
1070
                .isPreviewVideo(true)//是否预览视频
1071
                .isSingleDirectReturn(true)//PictureConfig.SINGLE模式下是否直接返回
1072
                .filterMaxFileSize( 100 * 1024 )//查询指定大小内的图片、视频、音频大小,单位 KB
1071
                .openGallery(SelectMimeType.ofVideo())
1072
                .setSelectorUIStyle(PictureUtlis.getStyle())
1073
                .setImageEngine(GlideEngine.createGlideEngine())
1074
                .setCompressEngine(new ImageFileCompressEngine()) //设置压缩
1075
                .setSandboxFileEngine(new MeSandboxFileEngine()) //设置相册沙盒目录拷贝引擎
1076
                .setSelectionMode(SelectModeConfig.SINGLE) //设置单选
1077
                .isEmptyResultReturn(true) //支持未选择返回
1078
                .setImageSpanCount(3)
1079
                .isPageStrategy(true)   // 是否开启分页模式
1080
                .isDisplayCamera(true) //是否显示相机入口
1081
                .isPreviewFullScreenMode(true)//预览点击全屏效果
1082
                .isEmptyResultReturn(true)//支持未选择返回
1083
                .isWithSelectVideoImage(false)//是否支持视频图片同选
1084
                .isSelectZoomAnim(true)// 选择缩略图缩放效果
1085
                .isCameraAroundState(false)// 是否开启前置摄像头;系统相机 只支持部分机型
1086
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
1087
                .isGif(true)// 是否显示gif文件
1088
                .isWebp(true)// 是否显示webp文件
1089
                .isBmp(true)//是否显示bmp文件
1090
                .setFilterMinFileSize(1) //过滤最小文件
1091
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
1092
                .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
1093
                .isFastSlidingSelect(true) //快速滑动选择
1094
                .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回
1095
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
1096
                .isPreviewImage(true)//是否预览图片
1097
                .setMaxSelectNum(1)//最大选择数量,默认9张
1098
                .setMinSelectNum(1)// 最小选择数量
1099
                .setRecordVideoMaxSecond(16) //视频录制最大时长
1100
                .setRecordVideoMinSecond(2) //视频录制最小时长
1101
                .setFilterVideoMaxSecond(16) //过滤视频最大时长
1102
                .setFilterVideoMinSecond(2) //过滤视频最小时长
1103
                .setVideoQuality(1)
1104
                .setCameraInterceptListener(new MeOnCameraInterceptListener(){
1105
                    @Override
1106
                    public void openCamera(Fragment fragment, int cameraMode, int requestCode) {
1107
                        SimpleCameraX camera = SimpleCameraX.of();
1108
                        camera.isAutoRotation(true);
1109
                        camera.setCameraMode(BUTTON_STATE_ONLY_RECORDER);
1110
                        camera.setVideoFrameRate(25);
1111
                        camera.setVideoBitRate(3 * 1024 * 1024);
1112
                        camera.isDisplayRecordChangeTime(true);
1113
                        camera.isManualFocusCameraPreview(true);
1114
                        camera.isZoomCameraPreview(true);
1115
                        camera.setImageEngine((context, url, imageView) -> Glide.with(context).load(url).into(imageView));
1116
                        camera.start(fragment.requireActivity(), fragment, requestCode);
1117
                    }
1118
                })
1119
                .isVideoPauseResumePlay(true) //视频支持暂停与播放
1073 1120
                .forResult(REQUEST_VIDEO_CODE_CHOOSE);
1074 1121
    }
1075 1122
@ -1095,39 +1142,35 @@ public class ChargingCommentActivity extends AppCompatActivity implements View.O
1095 1142
1096 1143
    }
1097 1144
1098
    @Override
1099
    public void onPermissionsGranted(int requestCode, List<String> perms) {
1100
1101
    }
1102 1145
1103
    @Override
1104
    public void onPermissionsDenied(int requestCode, List<String> perms) {
1105
1106
    }
1107 1146
1108
    @AfterPermissionGranted(RC_ALBUM_PERM)
1109 1147
    public void permissionTask() {
1110
        if (isPermissionOK()) {
1111
            addImg();
1112
            // Have permission, do the thing!
1113
//            Toast.makeText(this, "TODO: Camera things", Toast.LENGTH_LONG).show();
1114
//            ifTimeout();
1115
        } else {
1116
            // Ask for one permission
1117
            EasyPermissions.requestPermissions(
1118
                    this, "充电桩想要获取您的图片读取权限,是否允许?",
1119
                    RC_ALBUM_PERM,
1120
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
1121
                    Manifest.permission.READ_EXTERNAL_STORAGE);
1122
        }
1148
        String[] callPhone  =
1149
                new String[]{READ_MEDIA_IMAGES,READ_MEDIA_VIDEO, CAMERA};
1150
        XXPermissions.with(this)
1151
                // 申请单个权限
1152
                .permission(callPhone)
1153
                .request(new OnPermissionCallback() {
1154
                    @Override
1155
                    public void onGranted(List<String> permissions, boolean all) {
1156
                        if (all) {
1157
                            addImg();
1158
                        }else{
1159
                            ToastUtil.showToast(getApplicationContext(), "获取部分权限成功,但部分权限未正常授予", Toast.LENGTH_SHORT);
1160
                        }
1161
                    }
1162
                    @Override
1163
                    public void onDenied(List<String> permissions, boolean never) {
1164
                        if (never) {
1165
                            // 如果是被永久拒绝就跳转到应用权限系统设置页面
1166
                            XXPermissions.startPermissionActivity(ChargingCommentActivity.this, permissions);
1167
                        } else {
1168
                            ToastUtil.showToast(getApplicationContext(), "获取权限失败", Toast.LENGTH_SHORT);
1169
                        }
1170
                    }
1171
                });
1123 1172
    }
1124 1173
1125
    private boolean isPermissionOK() {
1126
        return EasyPermissions.hasPermissions(this,
1127
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
1128
                Manifest.permission.READ_EXTERNAL_STORAGE
1129
        );
1130
    }
1131 1174
1132 1175
    public class MyTopic extends RObject {
1133 1176
        private String id;
@ -1386,10 +1429,19 @@ public class ChargingCommentActivity extends AppCompatActivity implements View.O
1386 1429
        if (mInsterType == 1) {
1387 1430
            ImageDisplayActivity.actionStart(this, position);
1388 1431
        } else if (mInsterType == 2) {
1389
            PictureSelector.create(ChargingCommentActivity.this)
1390
                    .themeStyle(com.luck.picture.lib.R.style.picture_default_style)
1391
                    .setPictureStyle(Util.getWhiteStyle(ChargingCommentActivity.this))// 动态自定义相册主题
1392
                    .externalPictureVideo(TextUtils.isEmpty(mLocalMedia.getAndroidQToPath()) ? mLocalMedia.getPath() : mLocalMedia.getAndroidQToPath());
1432
1433
            ArrayList<LocalMedia> list = new ArrayList<>();
1434
            list.add(mLocalMedia);
1435
            PictureSelector.create(this)
1436
                    .openPreview()
1437
                    .setImageEngine(GlideEngine.createGlideEngine())
1438
                    .setVideoPlayerEngine(new IjkPlayerEngine())
1439
                    .setSelectorUIStyle(PictureUtlis.getStyle())
1440
                    .isPreviewFullScreenMode(false)
1441
                    .isVideoPauseResumePlay(true)
1442
                    .isAutoVideoPlay(true)
1443
                    .isLoopAutoVideoPlay(true)
1444
                    .startActivityPreview(0,false, list);
1393 1445
        }
1394 1446
    }
1395 1447
}

+ 72 - 61
app/src/main/java/com/electric/chargingpile/activity/ClaimSurveyTwoActivity.java

@ -75,9 +75,14 @@ import com.electric.chargingpile.engine.GlideEngine;
75 75
import com.electric.chargingpile.util.Bimp;
76 76
import com.electric.chargingpile.util.DES3;
77 77
import com.electric.chargingpile.util.FileUtils;
78
import com.electric.chargingpile.util.ImageCropEngine;
79
import com.electric.chargingpile.util.ImageFileCompressEngine;
78 80
import com.electric.chargingpile.util.ImageItem;
81
import com.electric.chargingpile.util.MeOnCameraInterceptListener;
82
import com.electric.chargingpile.util.MeSandboxFileEngine;
79 83
import com.electric.chargingpile.util.OkHttpUtil;
80 84
import com.electric.chargingpile.util.PhotoUtils;
85
import com.electric.chargingpile.util.PictureUtlis;
81 86
import com.electric.chargingpile.util.PublicWay;
82 87
import com.electric.chargingpile.util.Res;
83 88
import com.electric.chargingpile.util.SharedPreferencesUtil;
@ -90,10 +95,13 @@ import com.google.android.gms.appindexing.Action;
90 95
import com.google.android.gms.appindexing.AppIndex;
91 96
import com.google.android.gms.appindexing.Thing;
92 97
import com.google.android.gms.common.api.GoogleApiClient;
93
import com.luck.picture.lib.PictureSelector;
98
94 99
import com.luck.picture.lib.animators.AnimationType;
100
import com.luck.picture.lib.basic.PictureSelector;
95 101
import com.luck.picture.lib.config.PictureConfig;
96 102
import com.luck.picture.lib.config.PictureMimeType;
103
import com.luck.picture.lib.config.SelectMimeType;
104
import com.luck.picture.lib.config.SelectModeConfig;
97 105
import com.luck.picture.lib.entity.LocalMedia;
98 106
import com.squareup.okhttp.Request;
99 107
import com.squareup.okhttp.Response;
@ -1830,64 +1838,71 @@ public class ClaimSurveyTwoActivity extends Activity implements View.OnClickList
1830 1838
1831 1839
    public void photo() {
1832 1840
        PictureSelector.create(this)
1833
                .openCamera(PictureMimeType.ofImage())
1834
                .selectionMode(PictureConfig.SINGLE)
1835
                .isSingleDirectReturn(true)
1836
                .isCompress(true)//是否压缩
1837
                .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
1838
                .isGif(false)//是否显示gif
1839
                .isAndroidQTransform(true)
1840
                .imageEngine(GlideEngine.createGlideEngine())
1841
                .isWeChatStyle(false)// 是否开启微信图片选择风格
1842
                .isUseCustomCamera(false)// 是否使用自定义相机
1843
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
1844
                .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
1845
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
1846
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
1847
                .imageSpanCount(4)// 每行显示个数
1848
                .isReturnEmpty(false)// 未选择数据时点击按钮是否可以返回
1849
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
1850
                .isEnableCrop(true)
1851
                .rotateEnabled(false)//裁剪是否可旋转图片
1852
                .freeStyleCropEnabled(true)// 裁剪框拖动模式
1853
                //.isCropDragSmoothToCenter(true)// 裁剪框拖动时图片自动跟随居中
1854
                .circleDimmedLayer(false)// 是否开启圆形裁剪
1855
                .isDragFrame(true)//是否可拖动裁剪框(固定)
1856
                .showCropFrame(true)// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
1857
                .showCropGrid(true)//是否显示裁剪矩形网格 圆形裁剪时建议设为false
1841
                .openGallery(SelectMimeType.ofImage())
1842
                .setSelectorUIStyle(PictureUtlis.getStyle())
1843
                .setImageEngine(GlideEngine.createGlideEngine())
1844
                .setCompressEngine(new ImageFileCompressEngine()) //设置压缩
1845
                .setSandboxFileEngine(new MeSandboxFileEngine()) //设置相册沙盒目录拷贝引擎
1846
                .setCameraInterceptListener(new MeOnCameraInterceptListener())
1847
                .setSelectionMode(SelectModeConfig.SINGLE)
1848
                .setMaxSelectNum(1)
1849
                .setFilterMinFileSize(1) //过滤最小文件
1850
                .isEmptyResultReturn(true) //支持未选择返回
1851
                .setImageSpanCount(4)
1852
                .isPageStrategy(true)   // 是否开启分页模式
1853
                .isDisplayCamera(true) //是否显示相机入口
1854
                .isPreviewFullScreenMode(true)//预览点击全屏效果
1855
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
1856
                .isEmptyResultReturn(true)//支持未选择返回
1857
                .isWithSelectVideoImage(false)//是否支持视频图片同选
1858
                .isSelectZoomAnim(true)// 选择缩略图缩放效果
1859
                .isCameraAroundState(false)// 是否开启前置摄像头;系统相机 只支持部分机型
1860
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
1861
                .isGif(false)// 是否显示gif文件
1862
                .isWebp(true)// 是否显示webp文件
1863
                .isBmp(true)//是否显示bmp文件
1864
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
1865
                .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
1866
                .isFastSlidingSelect(true) //快速滑动选择
1867
                .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回
1868
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
1869
                .isPreviewImage(true)//是否预览图片
1870
                .setCropEngine(new ImageCropEngine(1F,1F,true))
1858 1871
                .forResult(PHOTO_REQUEST_CAMERA);
1859 1872
1860 1873
    }
1861 1874
    private void openPhotoAlbum() {
1862 1875
        PictureSelector.create(this)
1863
                .openGallery(PictureMimeType.ofImage())
1864
                .isCamera(false)//列表是否显示拍照按钮
1865
                .selectionMode(PictureConfig.SINGLE)
1866
                .isSingleDirectReturn(true)//PictureConfig.SINGLE模式下是否直接返回
1867
                .isCompress(true)//是否压缩
1868
                .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
1869
                .isGif(false)//是否显示gif
1870
                .isAndroidQTransform(true)
1871
                .imageEngine(GlideEngine.createGlideEngine())
1872
                .isWeChatStyle(false)// 是否开启微信图片选择风格
1873
                .isUseCustomCamera(false)// 是否使用自定义相机
1874
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
1875
                .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
1876
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
1877
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
1878
                .imageSpanCount(4)// 每行显示个数
1879
                .isReturnEmpty(false)// 未选择数据时点击按钮是否可以返回
1880
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
1881
                .rotateEnabled(false)//裁剪是否可旋转图片
1882
                .isEnableCrop(true)
1883
                .rotateEnabled(false)//裁剪是否可旋转图片
1884
                .setCircleStrokeWidth(8)//设置圆形裁剪边框粗细
1885
                .freeStyleCropEnabled(true)// 裁剪框拖动模式
1886
               // .isCropDragSmoothToCenter(true)// 裁剪框拖动时图片自动跟随居中
1887
                .circleDimmedLayer(true)// 是否开启圆形裁剪
1888
                .isDragFrame(true)//是否可拖动裁剪框(固定)
1889
                .showCropFrame(false)// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
1890
                .showCropGrid(false)//是否显示裁剪矩形网格 圆形裁剪时建议设为false
1876
                .openGallery(SelectMimeType.ofImage())
1877
                .setSelectorUIStyle(PictureUtlis.getStyle())
1878
                .setImageEngine(GlideEngine.createGlideEngine())
1879
                .setCompressEngine(new ImageFileCompressEngine()) //设置压缩
1880
                .setSandboxFileEngine(new MeSandboxFileEngine()) //设置相册沙盒目录拷贝引擎
1881
                .setCameraInterceptListener(new MeOnCameraInterceptListener())
1882
                .setSelectionMode(SelectModeConfig.SINGLE)
1883
                .setMaxSelectNum(1)
1884
                .setFilterMinFileSize(1) //过滤最小文件
1885
                .isEmptyResultReturn(true) //支持未选择返回
1886
                .setImageSpanCount(4)
1887
                .isPageStrategy(true)   // 是否开启分页模式
1888
                .isDisplayCamera(true) //是否显示相机入口
1889
                .isPreviewFullScreenMode(true)//预览点击全屏效果
1890
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
1891
                .isEmptyResultReturn(true)//支持未选择返回
1892
                .isWithSelectVideoImage(false)//是否支持视频图片同选
1893
                .isSelectZoomAnim(true)// 选择缩略图缩放效果
1894
                .isCameraAroundState(false)// 是否开启前置摄像头;系统相机 只支持部分机型
1895
                .isCameraRotateImage(true) //拍照是否纠正旋转图片
1896
                .isGif(false)// 是否显示gif文件
1897
                .isWebp(true)// 是否显示webp文件
1898
                .isBmp(true)//是否显示bmp文件
1899
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
1900
                .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
1901
                .isFastSlidingSelect(true) //快速滑动选择
1902
                .isDirectReturnSingle(true)//PictureConfig.SINGLE模式下是否直接返回
1903
                .setQuerySortOrder(MediaStore.MediaColumns.DATE_MODIFIED + " DESC")//由远-近 MediaStore.MediaColumns.DATE_MODIFIED + " ASC"
1904
                .isPreviewImage(true)//是否预览图片
1905
                .setCropEngine(new ImageCropEngine(1F,1F,true))
1891 1906
                .forResult(PHOTO_REQUEST_GALLERY);
1892 1907
    }
1893 1908
@ -1907,14 +1922,10 @@ public class ClaimSurveyTwoActivity extends Activity implements View.OnClickList
1907 1922
        //���ѡȡ
1908 1923
        if (resultCode == Activity.RESULT_OK){
1909 1924
            if (requestCode == PHOTO_REQUEST_CAMERA || requestCode == PHOTO_REQUEST_GALLERY) {
1910
                List<LocalMedia> medias = PictureSelector.obtainMultipleResult(data);
1925
                List<LocalMedia> medias = PictureSelector.obtainSelectorList(data);
1911 1926
                if (medias != null && medias.size() > 0) {
1912
                    String path = "";
1913
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
1914
                        path = medias.get(0).getAndroidQToPath();
1915
                    } else {
1916
                        path = medias.get(0).getPath();
1917
                    }
1927
                    String path = Util.getCompressAbsolutePath(medias.get(0));
1928
1918 1929
                    Bitmap bitmap = BitmapFactory.decodeFile(path);
1919 1930
                    ImageItem takePhoto = new ImageItem();
1920 1931
                    takePhoto.setBitmap(bitmap);

+ 0 - 154
app/src/main/java/com/electric/chargingpile/activity/CompletePhotoActivity.java

@ -1,154 +0,0 @@
1
package com.electric.chargingpile.activity;
2

3
import android.app.Activity;
4
/**
5
 * 已废弃
6
 * */
7
@Deprecated
8
public class CompletePhotoActivity extends Activity {
9
 /*   LinearLayout ll_addMore_photo;
10
    private static String srcPath = "";
11
    private ImageView image, updatePhoto_moveback;
12
    private File mPhotoFile;
13

14
    @Override
15
    protected void onCreate(Bundle savedInstanceState) {
16
        super.onCreate(savedInstanceState);
17
        setContentView(R.layout.activity_complete_photo);
18
        init();
19
    }
20

21
    private void init() {
22
        ll_addMore_photo = (LinearLayout) findViewById(R.id.ll_addMore_photo);
23
        ll_addMore_photo.setOnClickListener(this);
24

25
        image = (ImageView) findViewById(R.id.chargingpile_photoO);
26
        updatePhoto_moveback = (ImageView) findViewById(R.id.updatePhoto_moveback);
27
        updatePhoto_moveback.setOnClickListener(this);
28
    }
29

30
    @Override
31
    public void onClick(View view) {
32
        switch (view.getId()) {
33
            case R.id.ll_addMore_photo:
34
                String[] cameraSelect = {"拍照", "从相册选取"};
35
                new AlertDialog.Builder(CompletePhotoActivity.this)
36
                        .setTitle("提示")
37
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
38
                            @Override
39
                            public void onClick(DialogInterface dialog, int which) {
40
                                dialog.cancel();
41
                            }
42
                        })
43
                        .setItems(cameraSelect,
44
                                new DialogInterface.OnClickListener() {
45

46
                                    @Override
47
                                    public void onClick(DialogInterface dialog,
48
                                                        int which) {
49

50
                                        switch (which) {
51
                                            case 0:
52
                                                // Intent intent1 = new Intent(
53
                                                // MediaStore.ACTION_IMAGE_CAPTURE);
54
                                                // intent1.putExtra(
55
                                                // MediaStore.EXTRA_OUTPUT,
56
                                                // Uri.fromFile(new File(
57
                                                // Environment
58
                                                // .getExternalStorageDirectory(),
59
                                                // "zhanimage.jpg")));
60
                                                // startActivityForResult(intent1, 1);
61

62
                                                Intent openCameraIntent = new Intent(
63
                                                        MediaStore.ACTION_IMAGE_CAPTURE);
64
                                                Uri imageUri = Uri.fromFile(new File(
65
                                                        Environment
66
                                                                .getExternalStorageDirectory(),
67
                                                        "zhanimage.jpg"));
68
                                                openCameraIntent.putExtra(
69
                                                        MediaStore.EXTRA_OUTPUT,
70
                                                        imageUri);
71
                                                startActivityForResult(
72
                                                        openCameraIntent, 1);
73
                                                break;
74
                                            case 1:
75
                                                Intent intent = new Intent();
76
                                                intent.setType("image/*");
77
                                                intent.setAction(Intent.ACTION_GET_CONTENT);
78
                                                startActivityForResult(intent, 2);
79
                                                break;
80

81
                                            default:
82
                                                break;
83
                                        }
84
                                    }
85
                                }).show();
86
                break;
87
            case R.id.updatePhoto_moveback:
88
                setResult(RESULT_OK);
89
                this.finish();
90
                break;
91
        }
92
    }
93

94
    @Override
95
    public void onBackPressed() {
96
        super.onBackPressed();
97
        setResult(RESULT_OK);
98
        this.finish();
99
    }
100

101
    @Override
102
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
103
        super.onActivityResult(requestCode, resultCode, data);
104
        if (resultCode != RESULT_OK) {
105
            return;
106
        }
107
        if (requestCode == 1) {
108
            if (resultCode == Activity.RESULT_OK) {
109
                String sdStatus = Environment.getExternalStorageState();
110
                if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) {
111
                    return;
112
                }
113
                Bitmap bitmap = BitmapFactory.decodeFile(Environment
114
                        .getExternalStorageDirectory() + "/zhanimage.jpg");
115
                Bitmap newBitmap = ImageTools.zoomBitmap(bitmap,
116
                        bitmap.getWidth() / 5, bitmap.getHeight() / 5);
117
                bitmap.recycle();
118

119
                ImageTools.savePhotoToSDCard(newBitmap, Environment
120
                                .getExternalStorageDirectory().getAbsolutePath(),
121
                        "zhanimage");
122
                srcPath = Environment.getExternalStorageDirectory()
123
                        .getAbsolutePath() + "/zhanimage.png";
124
                Log.e("ccccccccccccc", srcPath);
125
                image.setImageBitmap(BitmapFactory.decodeFile(srcPath));
126

127
            }
128
        } else if (requestCode == 2) {
129
            if (data.getData() != null) {
130
                Uri mImageCaptureUri = data.getData();
131
                ContentResolver cr = this.getContentResolver();
132
                Cursor c = cr.query(mImageCaptureUri, null, null, null, null);
133
                c.moveToFirst();
134
                srcPath = c.getString(c.getColumnIndex("_data"));
135
                if (TextUtils.isEmpty(srcPath)) {
136
                    return;
137
                }
138
                mPhotoFile = new File(srcPath);
139
                Bitmap bmp = BitmapFactory.decodeFile(srcPath);
140
                Bitmap newBitmap = ImageTools.zoomBitmap(bmp,
141
                        bmp.getWidth() / 5, bmp.getHeight() / 5);
142
                bmp.recycle();
143

144
                ImageTools.savePhotoToSDCard(newBitmap, Environment
145
                                .getExternalStorageDirectory().getAbsolutePath(),
146
                        "zhanimage");
147
                srcPath = Environment.getExternalStorageDirectory()
148
                        .getAbsolutePath() + "/zhanimage.png";
149
                Log.e("ccccccccccccc", srcPath);
150
                image.setImageBitmap(BitmapFactory.decodeFile(srcPath));
151
            }
152
        }
153
    }*/
154
}

+ 0 - 1
app/src/main/java/com/electric/chargingpile/activity/CreditActivity.java

@ -449,7 +449,6 @@ public class CreditActivity extends Activity {
449 449
        mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
450 450
        mWebView.setDrawingCacheEnabled(true);
451 451
452
        settings.setAppCacheEnabled(true);
453 452
        settings.setDatabaseEnabled(true);
454 453
        settings.setDomStorageEnabled(true);
455 454
    }

+ 74 - 75
app/src/main/java/com/electric/chargingpile/activity/EditAnswerActivity.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.ProgressDialog;
5 8
import android.content.Context;
@ -10,6 +13,7 @@ import android.graphics.Matrix;
10 13
import android.os.Build;
11 14
import android.os.Bundle;
12 15
import android.os.Handler;
16
import android.provider.MediaStore;
13 17
import android.util.DisplayMetrics;
14 18
import android.util.Log;
15 19
import android.util.TypedValue;
@ -32,17 +36,26 @@ import com.electric.chargingpile.engine.GlideEngine;
32 36
import com.electric.chargingpile.util.AndroidBug5497Workaround;
33 37
import com.electric.chargingpile.util.BarColorUtil;
34 38
import com.electric.chargingpile.util.FileUtils;
39
import com.electric.chargingpile.util.ImageFileCompressEngine;
35 40
import com.electric.chargingpile.util.ImageUitl;
36 41
import com.electric.chargingpile.util.JsonUtils;
42
import com.electric.chargingpile.util.MeOnCameraInterceptListener;
43
import com.electric.chargingpile.util.MeSandboxFileEngine;
44
import com.electric.chargingpile.util.PictureUtlis;
37 45
import com.electric.chargingpile.util.StringUtils;
38 46
import com.electric.chargingpile.util.ToastUtil;
39 47
import com.electric.chargingpile.util.Util;
40 48
import com.electric.chargingpile.view.xrichtext.RichTextEditorForA;
41 49
import com.electric.chargingpile.view.xrichtext.SDCardUtil;
42
import com.luck.picture.lib.PictureSelector;
50
51
import com.hjq.permissions.OnPermissionCallback;
52
import com.hjq.permissions.XXPermissions;
43 53
import com.luck.picture.lib.animators.AnimationType;
54
import com.luck.picture.lib.basic.PictureSelector;
44 55
import com.luck.picture.lib.config.PictureConfig;
45 56
import com.luck.picture.lib.config.PictureMimeType;
57
import com.luck.picture.lib.config.SelectMimeType;
58
import com.luck.picture.lib.config.SelectModeConfig;
46 59
import com.luck.picture.lib.entity.LocalMedia;
47 60
import com.zhy.http.okhttp.OkHttpUtils;
48 61
import com.zhy.http.okhttp.callback.StringCallback;
@ -66,8 +79,8 @@ import pub.devrel.easypermissions.AfterPermissionGranted;
66 79
import pub.devrel.easypermissions.EasyPermissions;
67 80
import top.zibin.luban.Luban;
68 81
import top.zibin.luban.OnCompressListener;
69
70
public class EditAnswerActivity extends AppCompatActivity implements View.OnClickListener, EasyPermissions.PermissionCallbacks {
82
@Deprecated
83
public class EditAnswerActivity extends AppCompatActivity implements View.OnClickListener {
71 84
    private static final String TAG = "EditAnswerActivity";
72 85
    private TextView tv_submit, tv_back, tv_point;
73 86
    private RichTextEditorForA et_new_content;
@ -331,22 +344,12 @@ public class EditAnswerActivity extends AppCompatActivity implements View.OnClic
331 344
                try {
332 345
                    et_new_content.measure(0, 0);
333 346
//                    List<Uri> uriList = Matisse.obtainResult(data);
334
                   List<LocalMedia> selectionData= PictureSelector.obtainMultipleResult(data);
347
                   List<LocalMedia> selectionData= PictureSelector.obtainSelectorList(data);
335 348
                    if (selectionData!=null && selectionData.size()>0){
336 349
                        LocalMedia media = selectionData.get(0);
337 350
338
//                        Uri uri = uriList.get(0);
339
//                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
340
//                        File file = FileUtils.from(EditAnswerActivity.this, uri);
341
//
342
//                        bitmap = FileUtils.rotateIfRequired(file, bitmap);
343
//                        bitmap = imageZoom(bitmap);
344
                        String path="";
345
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
346
                            path= media.getAndroidQToPath();
347
                        }else{
348
                            path=media.getPath();
349
                        }
351
                        String path = Util.getCompressAbsolutePath(media);
352
350 353
                        insertBitmap = imageZoom(BitmapFactory.decodeFile(path));
351 354
352 355
                        u_path = path;
@ -400,12 +403,12 @@ public class EditAnswerActivity extends AppCompatActivity implements View.OnClic
400 403
            }
401 404
402 405
            @Override
403
            public void onSuccess(File file) {
406
            public void onSuccess(int index, File compressFile) {
404 407
                uploadPic(file.getPath(), u_path);
405 408
            }
406 409
407 410
            @Override
408
            public void onError(Throwable e) {
411
            public void onError(int index, Throwable e) {
409 412
                Log.e(TAG, "onError: " + e.getMessage());
410 413
            }
411 414
        }).launch();
@ -513,37 +516,36 @@ public class EditAnswerActivity extends AppCompatActivity implements View.OnClic
513 516
     * 调用图库选择
514 517
     */
515 518
    private void callGallery() {
516
/*
517
        Matisse.from(EditAnswerActivity.this)
518
                .choose(MimeType.of(MimeType.JPEG, MimeType.PNG, MimeType.GIF))
519
                .showSingleMediaType(true)
520
                .countable(true)
521
                .maxSelectable(1)
522
                .capture(true)
523
                .captureStrategy(new CaptureStrategy(true, "com.electric.chargingpile.provider"))
524
                .imageEngine(new GlideEngine())
525
                .forResult(REQUEST_CODE_CHOOSE);
526
*/
527
528 519
        PictureSelector.create(this)
529
                .openGallery(PictureMimeType.ofImage())
530
                .maxSelectNum(1)
531
                .selectionMode(PictureConfig.SINGLE)
532
                .isSingleDirectReturn(true)
533
                .isCompress(true)//是否压缩
534
                .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
535
                .isGif(true)//是否显示gif
536
                .isAndroidQTransform(true)
537
                .imageEngine(GlideEngine.createGlideEngine())
538
                .isWeChatStyle(false)// 是否开启微信图片选择风格
539
                .isUseCustomCamera(false)// 是否使用自定义相机
540
                .isPageStrategy(true)// 是否开启分页策略 & 每页多少条;默认开启
541
                .setPictureStyle(Util.getWhiteStyle(this))// 动态自定义相册主题
542
                .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION)// 列表动画效果
543
                .isMaxSelectEnabledMask(true)// 选择数到了最大阀值列表是否启用蒙层效果
544
                .imageSpanCount(4)// 每行显示个数
545
                .isReturnEmpty(false)// 选择数据时点击按钮是否可以返回
546
                .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
520
                .openGallery(SelectMimeType.ofImage())
521
                .setSelectorUIStyle(PictureUtlis.getStyle())
522
                .setImageEngine(GlideEngine.createGlideEngine())
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= [

remove · f780ba992e - Gogs: Go Git Service
1145873331@qq.com лет назад: 7
Родитель
Сommit
f780ba992e
115 измененных файлов с 93 добавлено и 2514 удалено
  1. 0 139
      XRefreshView/gradle-jcenter-push.gradle
  2. 0 27
      XRefreshView/gradle.properties
  3. 0 3
      ijkplayer-java/gradle.properties
  4. 0 15
      zxing/src/main/assets/html-de/about1d.html
  5. 0 28
      zxing/src/main/assets/html-de/about2d.html
  6. 0 23
      zxing/src/main/assets/html-de/index.html
  7. 0 30
      zxing/src/main/assets/html-de/license.html
  8. 0 19
      zxing/src/main/assets/html-de/scanning.html
  9. 0 14
      zxing/src/main/assets/html-de/sharing.html
  10. 0 13
      zxing/src/main/assets/html-de/whatsnew.html
  11. 0 15
      zxing/src/main/assets/html-en/about1d.html
  12. 0 28
      zxing/src/main/assets/html-en/about2d.html
  13. 0 23
      zxing/src/main/assets/html-en/index.html
  14. 0 42
      zxing/src/main/assets/html-en/license.html
  15. 0 19
      zxing/src/main/assets/html-en/scanning.html
  16. 0 14
      zxing/src/main/assets/html-en/sharing.html
  17. 0 13
      zxing/src/main/assets/html-en/whatsnew.html
  18. 0 19
      zxing/src/main/assets/html-es/about1d.html
  19. 0 31
      zxing/src/main/assets/html-es/about2d.html
  20. 0 25
      zxing/src/main/assets/html-es/index.html
  21. 0 40
      zxing/src/main/assets/html-es/license.html
  22. 0 19
      zxing/src/main/assets/html-es/scanning.html
  23. 0 14
      zxing/src/main/assets/html-es/sharing.html
  24. 0 13
      zxing/src/main/assets/html-es/whatsnew.html
  25. 0 15
      zxing/src/main/assets/html-fr/about1d.html
  26. 0 26
      zxing/src/main/assets/html-fr/about2d.html
  27. 0 23
      zxing/src/main/assets/html-fr/index.html
  28. 0 30
      zxing/src/main/assets/html-fr/license.html
  29. 0 19
      zxing/src/main/assets/html-fr/scanning.html
  30. 0 14
      zxing/src/main/assets/html-fr/sharing.html
  31. 0 13
      zxing/src/main/assets/html-fr/whatsnew.html
  32. 0 15
      zxing/src/main/assets/html-it/about1d.html
  33. 0 28
      zxing/src/main/assets/html-it/about2d.html
  34. 0 23
      zxing/src/main/assets/html-it/index.html
  35. 0 30
      zxing/src/main/assets/html-it/license.html
  36. 0 19
      zxing/src/main/assets/html-it/scanning.html
  37. 0 14
      zxing/src/main/assets/html-it/sharing.html
  38. 0 13
      zxing/src/main/assets/html-it/whatsnew.html
  39. 0 15
      zxing/src/main/assets/html-ja/about1d.html
  40. 0 28
      zxing/src/main/assets/html-ja/about2d.html
  41. 0 22
      zxing/src/main/assets/html-ja/index.html
  42. 0 29
      zxing/src/main/assets/html-ja/license.html
  43. 0 19
      zxing/src/main/assets/html-ja/scanning.html
  44. 0 14
      zxing/src/main/assets/html-ja/sharing.html
  45. 0 13
      zxing/src/main/assets/html-ja/whatsnew.html
  46. 0 15
      zxing/src/main/assets/html-ko/about1d.html
  47. 0 28
      zxing/src/main/assets/html-ko/about2d.html
  48. 0 23
      zxing/src/main/assets/html-ko/index.html
  49. 0 30
      zxing/src/main/assets/html-ko/license.html
  50. 0 19
      zxing/src/main/assets/html-ko/scanning.html
  51. 0 14
      zxing/src/main/assets/html-ko/sharing.html
  52. 0 13
      zxing/src/main/assets/html-ko/whatsnew.html
  53. 0 15
      zxing/src/main/assets/html-nl/about1d.html
  54. 0 28
      zxing/src/main/assets/html-nl/about2d.html
  55. 0 23
      zxing/src/main/assets/html-nl/index.html
  56. 0 30
      zxing/src/main/assets/html-nl/license.html
  57. 0 19
      zxing/src/main/assets/html-nl/scanning.html
  58. 0 14
      zxing/src/main/assets/html-nl/sharing.html
  59. 0 13
      zxing/src/main/assets/html-nl/whatsnew.html
  60. 0 15
      zxing/src/main/assets/html-pt/about1d.html
  61. 0 28
      zxing/src/main/assets/html-pt/about2d.html
  62. 0 23
      zxing/src/main/assets/html-pt/index.html
  63. 0 30
      zxing/src/main/assets/html-pt/license.html
  64. 0 19
      zxing/src/main/assets/html-pt/scanning.html
  65. 0 14
      zxing/src/main/assets/html-pt/sharing.html
  66. 0 13
      zxing/src/main/assets/html-pt/whatsnew.html
  67. 0 15
      zxing/src/main/assets/html-ru/about1d.html
  68. 0 28
      zxing/src/main/assets/html-ru/about2d.html
  69. 0 23
      zxing/src/main/assets/html-ru/index.html
  70. 0 30
      zxing/src/main/assets/html-ru/license.html
  71. 0 19
      zxing/src/main/assets/html-ru/scanning.html
  72. 0 14
      zxing/src/main/assets/html-ru/sharing.html
  73. 0 13
      zxing/src/main/assets/html-ru/whatsnew.html
  74. 0 15
      zxing/src/main/assets/html-uk/about1d.html
  75. 0 28
      zxing/src/main/assets/html-uk/about2d.html
  76. 0 23
      zxing/src/main/assets/html-uk/index.html
  77. 0 29
      zxing/src/main/assets/html-uk/license.html
  78. 0 19
      zxing/src/main/assets/html-uk/scanning.html
  79. 0 14
      zxing/src/main/assets/html-uk/sharing.html
  80. 0 13
      zxing/src/main/assets/html-uk/whatsnew.html
  81. 0 15
      zxing/src/main/assets/html-zh-rCN/about1d.html
  82. 0 29
      zxing/src/main/assets/html-zh-rCN/about2d.html
  83. 0 23
      zxing/src/main/assets/html-zh-rCN/index.html
  84. 0 30
      zxing/src/main/assets/html-zh-rCN/license.html
  85. 0 19
      zxing/src/main/assets/html-zh-rCN/scanning.html
  86. 0 14
      zxing/src/main/assets/html-zh-rCN/sharing.html
  87. 0 13
      zxing/src/main/assets/html-zh-rCN/whatsnew.html
  88. 0 15
      zxing/src/main/assets/html-zh-rHK/about1d.html
  89. 0 28
      zxing/src/main/assets/html-zh-rHK/about2d.html
  90. 0 23
      zxing/src/main/assets/html-zh-rHK/index.html
  91. 0 31
      zxing/src/main/assets/html-zh-rHK/license.html
  92. 0 21
      zxing/src/main/assets/html-zh-rHK/scanning.html
  93. 0 14
      zxing/src/main/assets/html-zh-rHK/sharing.html
  94. 0 13
      zxing/src/main/assets/html-zh-rHK/whatsnew.html
  95. 0 15
      zxing/src/main/assets/html-zh-rTW/about1d.html
  96. 0 28
      zxing/src/main/assets/html-zh-rTW/about2d.html
  97. 0 23
      zxing/src/main/assets/html-zh-rTW/index.html
  98. 0 31
      zxing/src/main/assets/html-zh-rTW/license.html
  99. 0 21
      zxing/src/main/assets/html-zh-rTW/scanning.html
  100. 0 14
      zxing/src/main/assets/html-zh-rTW/sharing.html
  101. 0 13
      zxing/src/main/assets/html-zh-rTW/whatsnew.html
  102. 0 201
      zxing/src/main/assets/html/apache-license.txt
  103. BIN
      zxing/src/main/assets/images/big-1d.png
  104. BIN
      zxing/src/main/assets/images/big-aztec.png
  105. BIN
      zxing/src/main/assets/images/big-datamatrix.png
  106. BIN
      zxing/src/main/assets/images/big-pdf417.png
  107. BIN
      zxing/src/main/assets/images/big-qr.png
  108. BIN
      zxing/src/main/assets/images/contact-results-screen.jpg
  109. BIN
      zxing/src/main/assets/images/demo-no.png
  110. BIN
      zxing/src/main/assets/images/demo-yes.png
  111. BIN
      zxing/src/main/assets/images/scan-example.png
  112. BIN
      zxing/src/main/assets/images/scan-from-phone.png
  113. BIN
      zxing/src/main/assets/images/search-book-contents.jpg
  114. 0 28
      zxing/src/main/assets/style.css
  115. 93 95
      zxing/src/main/java/com/google/zxing/client/android/CaptureActivity.java

+ 0 - 139
XRefreshView/gradle-jcenter-push.gradle

@ -1,139 +0,0 @@
1
apply plugin: 'maven-publish'
2
apply plugin: 'com.jfrog.bintray'
3
4
5
task androidJavadocs(type: Javadoc) {
6
    failOnError false
7
    source = android.sourceSets.main.java.srcDirs
8
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
9
    allprojects {
10
        tasks.withType(Javadoc) {
11
            options.encoding = "UTF-8"
12
        }
13
    }
14
}
15
16
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
17
    classifier = 'javadoc'
18
    from androidJavadocs.destinationDir
19
}
20
21
task androidSourcesJar(type: Jar) {
22
    classifier = 'sources'
23
    from android.sourceSets.main.java.sourceFiles
24
}
25
26
artifacts {
27
    archives androidJavadocsJar
28
    archives androidSourcesJar
29
}
30
31
publishing {
32
    publications {
33
        mavenJava(MavenPublication) {
34
            groupId GROUP
35
            version VERSION_NAME
36
            artifactId POM_ARTIFACT_ID
37
            artifact "${project.buildDir}/outputs/aar/${project.name}-release.aar"
38
            artifact androidJavadocsJar
39
            artifact androidSourcesJar
40
41
            pom.withXml {
42
                Node root = asNode()
43
                root.appendNode('name', POM_ARTIFACT_ID)
44
                root.appendNode('description', POM_DESCRIPTION)
45
                root.appendNode('url', POM_URL)
46
47
                def issues = root.appendNode('issueManagement')
48
                issues.appendNode('system', 'github')
49
                issues.appendNode('url', ISSUE_URL)
50
51
                def scm = root.appendNode('scm')
52
                scm.appendNode('url', POM_SCM_URL)
53
                scm.appendNode('connection', POM_SCM_CONNECTION)
54
                scm.appendNode('developerConnection', POM_SCM_DEV_CONNECTION)
55
56
                def license = root.appendNode('licenses').appendNode('license')
57
                license.appendNode('name', POM_LICENCE_NAME)
58
                license.appendNode('url', POM_LICENCE_URL)
59
                license.appendNode('distribution', POM_LICENCE_DIST)
60
61
                def developer = root.appendNode('developers').appendNode('developer')
62
                developer.appendNode('id', POM_DEVELOPER_ID)
63
                developer.appendNode('name', POM_DEVELOPER_NAME)
64
                developer.appendNode('email', POM_DEVELOPER_EMAIL)
65
                developer.appendNode('url', POM_DEVELOPER_URL)
66
67
//                def dependenciesNode = asNode().appendNode('dependencies')
68
//
69
//                //Iterate over the compile dependencies (we don't want the test ones), adding a <dependency> node for each
70
//                configurations.compile.allDependencies.each {
71
//                    def dependencyNode = dependenciesNode.appendNode('dependency')
72
//                    dependencyNode.appendNode('groupId', it.group)
73
//                    dependencyNode.appendNode('artifactId', it.name)
74
//                    dependencyNode.appendNode('version', it.version)
75
//                }
76
            }
77
        }
78
    }
79
}
80
81
def getBintrayUserProperty() {
82
    return hasProperty('BINTRAY_USER') ? BINTRAY_USER : ""
83
}
84
85
def getBintrayApiKeyProperty() {
86
    return hasProperty('BINTRAY_APIKEY') ? BINTRAY_APIKEY : ""
87
}
88
89
def getGpgPassphraseProperty() {
90
    return hasProperty('GPG_PASSPHRASE') ? GPG_PASSPHRASE : ""
91
}
92
93
def getUserTokenProperty() {
94
    return hasProperty('USERTOKEN') ? USERTOKEN : ""
95
}
96
97
def getUserPasswordProperty() {
98
    return hasProperty('USERPASSWORD') ? USERPASSWORD : ""
99
}
100
101
// gradle bintrayUpload
102
bintray {
103
    user = getBintrayUserProperty()
104
    key = getBintrayApiKeyProperty()
105
    def passphrase = getGpgPassphraseProperty()
106
    def userToken = getUserTokenProperty()
107
    def userPassword = getUserPasswordProperty()
108
    publications = ['mavenJava']
109
110
    dryRun = false
111
    publish = true
112
    pkg {
113
        repo = 'maven'
114
        name = POM_ARTIFACT_ID
115
        desc = POM_NAME
116
        websiteUrl = POM_URL
117
        issueTrackerUrl = ISSUE_URL
118
        vcsUrl = GIT_URL
119
        licenses = ['Apache-2.0']
120
        labels = ['android', 'aar']
121
        publicDownloadNumbers = true
122
123
        version {
124
            name = VERSION_NAME
125
            vcsTag = VERSION_NAME
126
            gpg {
127
                sign = true //Determines whether to GPG sign the files. The default is false
128
                passphrase = 'passphrase' //Optional. The passphrase for GPG signing'
129
            }
130
            mavenCentralSync {
131
                sync = false //Optional (true by default). Determines whether to sync the version to Maven Central.
132
                user = userToken //OSS user token
133
                password = userPassword //OSS user password
134
                close = '1'
135
                //Optional property. By default the staging repository is closed and artifacts are released to Maven Central. You can optionally turn this behaviour off (by puting 0 as value) and release the version manually.
136
            }
137
        }
138
    }
139
}

+ 0 - 27
XRefreshView/gradle.properties

@ -1,27 +0,0 @@
1
VERSION_NAME=3.6.9
2
GROUP=com.huxq17.xrefreshview
3
POM_NAME=Android universal pull to refresh library
4
POM_ARTIFACT_ID=xrefreshview
5
POM_PACKAGING=aar
6
7
#比如我们引用appcompat-v7,那么会这么写 compile 'com.android.support:appcompat-v7:22.2.0'
8
#实际对应的字段就是 compile 'GROUP:POM_ARTIFACT_ID:VERSION_NAME'
9
10
POM_DESCRIPTION=Android universal pull to refresh library
11
POM_URL=git@github.com:huxq17/XRefreshView.git
12
POM_SCM_URL=scm:git@github.com:huxq17/XRefreshView.git
13
POM_SCM_CONNECTION=scm:git@github.com:huxq17/XRefreshView.git
14
POM_SCM_DEV_CONNECTION=scm:git@github.com:huxq17/XRefreshView.git
15
16
#开源协议
17
POM_LICENCE_NAME=The Apache Software License, Version 2.0
18
POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
19
POM_LICENCE_DIST=repo
20
21
POM_DEVELOPER_ID=huxq17
22
POM_DEVELOPER_NAME=huxq17
23
POM_DEVELOPER_EMAIL=huxq17@163.com
24
POM_DEVELOPER_URL=http://blog.csdn.net/footballclub/
25
26
GIT_URL=git@github.com:huxq17/XRefreshView.git
27
ISSUE_URL=https://github.com/huxq17/XRefreshView/issues

+ 0 - 3
ijkplayer-java/gradle.properties

@ -1,3 +0,0 @@
1
POM_NAME=ijkplayer-java
2
POM_ARTIFACT_ID=ijkplayer-java
3
POM_PACKAGING=aar

+ 0 - 15
zxing/src/main/assets/html-de/about1d.html

@ -1,15 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>Über 1D-Barcodes (Strichcodes)</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>Die altbekannten Strichcodes, wie solche auf Produktverpackungen, werden auch eindimensionale Barcodes genannt. Es gibt einige verbreitete Arten, wie den UPC (Universal Product Code) und den EAN (European Article Number). Die meisten schauen so aus:</p>
10
<p class="imgcenter"><img src="../images/big-1d.png"/></p>
11
<p>Diese Strichcodes enthalten eine einmalige Nummer, welche ein Produkt, wie ein Buch oder eine CD, beschreiben. Man kann nach dieser Nummer im Internet suchen, um Preise oder Beurteilungen zu finden.</p>
12
<p>Wenn man den Code eines Buches einscannt, kann man den Inhalt des Buches nach Wörtern oder Sätzen durchsuchen und alle Seiten finden, in denen dieses Wort vorkam:</p>
13
<p class="imgcenter"><img src="../images/search-book-contents.jpg"/></p>
14
</body>
15
</html>

+ 0 - 28
zxing/src/main/assets/html-de/about2d.html

@ -1,28 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>Über 2D-Barcodes</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>Der <strong>Barcode Scanner</strong> kann auch zweidimensionale Barcodes, wie den QR-Code und den DataMatrix-Code einlesen. Die Barcodes in diesem Beispiel enthalten einen Hyperlink auf die Projekt-Homepage von ZXing:</p>
10
<p class="imgcenter">
11
  <img src="../images/big-qr.png"/>
12
  <img src="../images/big-datamatrix.png"/>
13
  <img src="../images/big-pdf417.png"/>
14
  <img src="../images/big-aztec.png"/>
15
</p>
16
<p>Ein QR-Code kann auch eine Visitenkarte mit Kontaktinformationen wie Telefonnummern und E-Mail-Adressen enthalten. Wird ein solcher Code eingescannt, dann wird eine Auswahl an Aktionen angezeigt:</p>
17
<p class="imgcenter"><img src="../images/contact-results-screen.jpg"/></p>
18
<p>Neben URLs und Kontaktdaten können QR-Codes auch folgendes enthalten:</p>
19
<ul>
20
  <li>Kalendereinträge, die man dem Kalender hinzufügen kann</li>
21
  <li>Telefonnummern, die man anrufen oder abspeichern kann</li>
22
  <li>SMS-Nachrichten, die man verschicken kann</li>
23
  <li>E-Mail-Adressen, denen man eine Nachricht schreiben kann</li>
24
  <li>Geographische Koordinaten, die zu der man die Karte öffnen kann</li>
25
  <li>Einfachen Text, den man lesen oder in die Zwischenablage kopieren kann</li>
26
</ul>
27
</body>
28
</html>

+ 0 - 23
zxing/src/main/assets/html-de/index.html

@ -1,23 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>Barcode Scanner-Hilfe</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>Dies ist die offizielle Android App des Open-Source-Projekts ZXing:<br/>
10
<a href="https://github.com/zxing/zxing">https://github.com/zxing/zxing</a></p>
11
<p>Der <strong>Barcode Scanner</strong> verwendet die Kamera ihres Handys, um Barcodes zu lesen und Produktinformationen wie Preise und Bewertungen zu suchen.</p>
12
<p class="imgcenter"><img src="../images/scan-example.png"/></p>
13
<p>Er liest auch 2D-Barcodes wie den QR-Code und DataMatrix. Diese Barcodes können z.B. Links zu Webseiten enthalten oder Kontaktinformationen wie Telefonnummern und E-Mail-Adressen.</p>
14
<ul class="touchable">
15
  <li><a href="whatsnew.html">Neues in dieser Version</a></li>
16
  <li><a href="scanning.html">Tipps fürs scannen</a></li>
17
  <li><a href="about1d.html">Mehr über 1D-Barcodes</a></li>
18
  <li><a href="about2d.html">Mehr über 2D-Barcodes</a></li>
19
  <li><a href="sharing.html">So erstellen Sie QR-Codes</a></li>
20
  <li><a href="license.html">Datenschutz-, Rechts- und Lizenzinformationen</a></li>
21
</ul>
22
<p>Übersetzt von Google Translate.</p></body>
23
</html>

+ 0 - 30
zxing/src/main/assets/html-de/license.html

@ -1,30 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
  <meta charset="UTF-8"/>
5
  <title>Datenschutz-, Rechts- und Lizenzinformationen</title>
6
  <link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
10
<h3>Datenschutz</h3>
11
12
<p><strong class="notranslate">Barcode Scanner</strong> sammelt, speichert oder übermittelt keine Informationen über seine Nutzer oder die Nutzung der Anwendung. Die Anwendung greift auf persönliche Daten wie Kontakte und Lesezeichen nur zu, um die Funktionalität der Anwendung zu implementieren, wie z.B. QR-Codes von Kontakten und Lesezeichen auf dem Bildschirm anzuzeigen.</p>
13
14
<p>Beachten Sie, dass diese Anwendung auf Dienste von Drittanbietern zugreift, dies sind Google Books, Google Produktsuche und Amazon. Dies geschieht, um weitere Informationen über ein Produkt nach einem Scan abzurufen und anzuzeigen. Diese Drittanbieter erhalten die eingescannten Daten und können diese auch loggen.
15
Auch kann es notwendig sein, die Anfrage an einen Server zu schicken, der von dieser Anwendung betrieben wird, um die Anfrage für einen Drittanbieter passend zu machen, wie z.B. die Unterzeichnung der Anfrage. Neben dem Suchbegriff wird keine weitere Informationen zu den Anfragen hinzugefügt.</p>
16
17
<p>Beachten Sie auch, dass diese Anwendung auf Web-Sites und Anwendungen von Drittanbietern verlinkt, wie z.B. Google Produktsuche. Es werden keine anderen Informationen übertragen, als die eingescannten Daten. Diese Seiten und Anwendungen sind unabhängig und nicht mit dieser Anwendung verbunden, daher werden sie nicht von dieser Datenschutzerklärung abgedeckt.</p>
18
19
<h3>Warenzeichen</h3>
20
21
<p><span class="notranslate">Google, Google Books, Google Product Search,
22
Barcode Scanner, ZXing, QR Code, Data Matrix, Aztec</span> sind Warenzeichen ihrer jeweiligen Eigentümer.</p>
23
24
<h3>Lizenz-und Urheberrecht</h3>
25
26
<p>Dieses Projekt basiert auf der <a class="notranslate" href="https://github.com/zxing/zxing">ZXing</a> Open-Source-Barcode-Scanning-Bibliothek und ist lizenziert unter den Bedingungen der <a class="notranslate" href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License 2.0</a>:</p>
27
28
<p style="font-size:200%"><a class="notranslate" href="../html/apache-license.txt">Apache License 2.0</a></p>
29
</body>
30
</html>

+ 0 - 19
zxing/src/main/assets/html-de/scanning.html

@ -1,19 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>Tipps fürs scannen</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>Der Scanner durchsucht kontinuierlich den rechteckigen Bereich auf dem Bildschirm. Dabei muss der Barcode vollständig im rechteckigen Sucher erscheinen:</p>
10
<p class="imgcenter"><img src="../images/demo-yes.png" style="padding:5px"/><img src="../images/demo-no.png" style="padding:5px"/></p>
11
<p>Für 1D-Barcodes, auch Strichcodes genannt, welche sich auf allen Handelsprodukten befinden, benötigt man ein Handy mit Autofokus. Ohne diesen können nur QR-Codes und DataMatrix-Codes eingescannt werden.</p>
12
<p>Wenn ein Barcode eingelesen wurde, piepst das Handy und es wird das Ergebnis des Scans angezeigt, sowie eine Beschreibung des Barcode-Inhalts, und verschiedene Möglichkeiten wie weiter verfahren werden soll.</p>
13
<p>Falls das Einscannen nicht richtig funktioniert, versuchen Sie das Handy ruhiger zu halten. Wenn das Bild unscharf ist, vergrößern oder verkleinern Sie den Abstand zum Barcode.</p>
14
<ul class="touchable">
15
  <li><a href="about1d.html"> Über 1D-Barcodes </a></li>
16
  <li><a href="about2d.html"> Über 2D-Barcodes </a></li>
17
</ul>
18
</body>
19
</html>

+ 0 - 14
zxing/src/main/assets/html-de/sharing.html

@ -1,14 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>So erstellen Sie einen QR-Code</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>Der <strong>Barcode Scanner</strong> kann nicht nur QR-Codes einlesen, sondern auch selbst erzeugen und auf dem Bildschirm anzeigen. Diesen QR-Code können Sie dann einem Freund zeigen, der den Code mit seinen Handy einscannen kann.</p>
10
<p class="imgcenter"><img src="../images/scan-from-phone.png"/></p>
11
<p>Um diese Funktion zu nutzen, einfach auf dem Hauptbildschirm auf die Menü-Taste drücken, und auf <em>Senden</em> tippen. Dann wählen, ob Sie einen Kontakt, ein Lesezeichen, eine Anwendung oder den Inhalt der Zwischenablage senden wollen und der QR-Code wird automatisch generiert. Wenn Sie fertig sind, drücken Sie die Zurücktaste.</p>
12
<p>Um QR-Codes auf Ihrem Computer zu erzeugen, testen Sie den ZXing QR Code Generator, er basiert auf dem selben Quelltext wie dieses Programm: <a href="https://zxing.appspot.com/generator/">https://zxing.appspot.com/generator/</a></p>
13
</body>
14
</html>

+ 0 - 13
zxing/src/main/assets/html-de/whatsnew.html

@ -1,13 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>Neues in dieser Version von Barcode Scanner</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<ul>
10
  <li> Bug-Fix </li>
11
</ul>
12
<p>Übersetzt von Google Translate.</p></body>
13
</html>

+ 0 - 15
zxing/src/main/assets/html-en/about1d.html

@ -1,15 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>About 1D barcodes</title>
6
<link rel="stylesheet" href="../style.css" type="text/css"/>
7
</head>
8
<body>
9
<p>Traditional barcodes, such as those printed on product packaging, are also known as one dimensional barcodes. There are several types commonly used, including UPC and EAN. Most look similar to this:</p>
10
<p class="imgcenter"><img src="../images/big-1d.png"/></p>
11
<p>These 1D barcodes contain a unique code which typically describes a product, like a CD or a book. You can look this code up on the internet to find prices, reviews, and more.</p>
12
<p>If you scan a book, you can also search the contents of the book for a word or phrase, and find all the pages where it appears:</p>
13
<p class="imgcenter"><img src="../images/search-book-contents.jpg"/></p>
14
</body>
15
</html>

+ 0 - 28
zxing/src/main/assets/html-en/about2d.html

@ -1,28 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>About 2D barcodes</title>
6
<link rel="stylesheet" href="../style.css" type="text/css"/>
7
</head>
8
<body>
9
<p><strong>Barcode Scanner</strong> also understands how to read two dimensional barcodes, like QR Codes and Data Matrix codes. For example, the codes below contain a hyperlink to the ZXing Project home page:</p>
10
<p class="imgcenter">
11
  <img src="../images/big-qr.png"/>
12
  <img src="../images/big-datamatrix.png"/>
13
  <img src="../images/big-pdf417.png"/>
14
  <img src="../images/big-aztec.png"/>
15
</p>
16
<p>You can also represent contact information in a QR Code, and put it on a business card or web site. When you scan it, the results screen provides a choice of actions:</p>
17
<p class="imgcenter"><img src="../images/contact-results-screen.jpg"/></p>
18
<p>Besides URLs and contact info, QR Codes can also contain:</p>
19
<ul>
20
  <li>Calendar events, which you can add to your Calendar</li>
21
  <li>Phone numbers, which you can dial</li>
22
  <li>SMS numbers, which you can text message</li>
23
  <li>Email addresses, which you can email</li>
24
  <li>Geographic coordinates, which you can open in Maps</li>
25
  <li>Plain text, which you can read, then share with a friend</li>
26
</ul>
27
</body>
28
</html>

+ 0 - 23
zxing/src/main/assets/html-en/index.html

@ -1,23 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>Barcode Scanner Help</title>
6
<link rel="stylesheet" href="../style.css" type="text/css"/>
7
</head>
8
<body>
9
<p>The official Android app of the open source ZXing project:<br/>
10
<a href="https://github.com/zxing/zxing">https://github.com/zxing/zxing</a></p>
11
<p>Barcode Scanner uses the camera on your phone to read barcodes and look up product information such as prices and reviews.</p>
12
<p class="imgcenter"><img src="../images/scan-example.png"/></p>
13
<p>It also reads 2D barcodes such as QR Codes and Data Matrix. These can contain links to web sites, contact information such as phone numbers and email addresses, and more.</p>
14
<ul class="touchable">
15
  <li><a href="whatsnew.html">What's new in this version</a></li>
16
  <li><a href="scanning.html">How to scan</a></li>
17
  <li><a href="about1d.html">About 1D barcodes</a></li>
18
  <li><a href="about2d.html">About 2D barcodes</a></li>
19
  <li><a href="sharing.html">How to create QR Codes</a></li>
20
  <li><a href="license.html">Privacy Policy, Legal and License Information</a></li>    
21
</ul>
22
</body>
23
</html>

+ 0 - 42
zxing/src/main/assets/html-en/license.html

@ -1,42 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
  <meta charset="UTF-8"/>
5
  <title>Privacy Policy, Legal and License Information</title>
6
  <link rel="stylesheet" href="../style.css" type="text/css"/>
7
</head>
8
<body>
9
10
<h3>Privacy Policy</h3>
11
12
<p><strong class="notranslate">Barcode Scanner</strong> does not collect, store or transmit information about its
13
users, nor usage of the application. The application accesses personal information such as contacts
14
and bookmarks only in order to implement application functionality, such as sharing contacts and bookmarks
15
by QR Codes on screen.</p>
16
17
<p>Note that this application accesses third-party services, including Google Books, Google Product Search and Amazon,
18
in order to retrieve additional information following a scan. These third parties receive and may log these requests.
19
Also, it may be necessary to send the request to a server operated by this application, in order to transform the
20
request for use with the third-party service, such as signing the request.
21
No additional information is added to the requests besides the query terms.</p>
22
23
<p>Also note that this application links to third-party web sites and applications. Again,
24
no information other than query terms are passed on as part of these links. These sites and applications are
25
separate from and not affiliated with this application, and are not covered by this Privacy Policy.</p>
26
27
<h3>Trademarks</h3>
28
29
<p><span class="notranslate">Google, Google Books, Google Product Search,
30
Barcode Scanner, ZXing, QR Code, Data Matrix, Aztec</span>
31
are all trademarks of their respective owners.</p>
32
33
<h3>License and Copyright</h3>
34
35
<p>This project is based on the <a href="https://github.com/zxing/zxing" class="notranslate">ZXing</a> open source barcode
36
scanning library, and is licensed to you under the terms of the
37
<a href="http://www.apache.org/licenses/LICENSE-2.0.html" class="notranslate">Apache License 2.0</a>:</p>
38
39
<p style="font-size:200%"><a href="../html/apache-license.txt" class="notranslate">Apache License 2.0</a></p>
40
41
</body>
42
</html>

+ 0 - 19
zxing/src/main/assets/html-en/scanning.html

@ -1,19 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>How to scan</title>
6
<link rel="stylesheet" href="../style.css" type="text/css"/>
7
</head>
8
<body>
9
<p>Barcode Scanner continuously scans a square region shown on your screen -- just line up the phone so the barcode is completely inside the viewfinder rectangle:</p>
10
<p class="imgcenter"><img src="../images/demo-yes.png" style="padding:5px"/><img src="../images/demo-no.png" style="padding:5px"/></p>
11
<p>1D barcodes like those found on products require a phone with autofocus. Without it, only 2D formats like QR Codes and Data Matrix codes will be scannable.</p>
12
<p>When a barcode is read, a beep sound will play and you'll see the results of the scan, a description of what the barcode contains, and options to take action on the contents.</p>
13
<p>If you're having trouble scanning, make sure to hold the phone steady. If the camera is unable to focus, try moving the phone further or closer from the barcode.</p>
14
<ul class="touchable">
15
  <li><a href="about1d.html">About 1D barcodes</a></li>
16
  <li><a href="about2d.html">About 2D barcodes</a></li>
17
</ul>
18
</body>
19
</html>

+ 0 - 14
zxing/src/main/assets/html-en/sharing.html

@ -1,14 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>How to create QR Codes</title>
6
<link rel="stylesheet" href="../style.css" type="text/css"/>
7
</head>
8
<body>
9
<p>In addition to scanning 2D barcodes, Barcode Scanner can also generate a QR Code and display it on your screen. Then you can show it to a friend, and let them scan the barcode with their phone:</p>
10
<p class="imgcenter"><img src="../images/scan-from-phone.png"/></p>
11
<p>To use this feature, press the Menu button from the main scanning screen, and tap Share. Then choose whether you want to share a contact, a bookmark, an application, or the contents of the clipboard. A QR Code will be generated automatically. When you're done, press Back or Home.</p>
12
<p>To generate QR Codes from your computer, try the ZXing QR Code Generator: <a href="https://zxing.appspot.com/generator/">https://zxing.appspot.com/generator/</a></p>
13
</body>
14
</html>

+ 0 - 13
zxing/src/main/assets/html-en/whatsnew.html

@ -1,13 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>What's new in Barcode Scanner</title>
6
<link rel="stylesheet" href="../style.css" type="text/css"/>
7
</head>
8
<body>
9
<ul>
10
  <li>Bug fixes</li>
11
</ul>
12
</body>
13
</html>

+ 0 - 19
zxing/src/main/assets/html-es/about1d.html

@ -1,19 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Acerca de los códigos de barras 1D </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Códigos de barras tradicionales, tales como las impresas en el embalaje del producto,
10
  se conocen también como uno códigos de barras bidimensionales. Existen varios tipos de uso común,
11
  incluyendo UPC y EAN. La mayoría de aspecto similar a este: </p>
12
<p class="imgcenter"><img src="../images/big-1d.png"/></p>
13
<p> Estos códigos de barras 1D contiene un código único que generalmente describe un producto, como un CD o un libro.
14
  Usted puede ver este código en el Internet para encontrar precios, comentarios y más. </p>
15
<p> Si digitaliza un libro, también puede buscar en el contenido del libro para una palabra o frase, y encontrar todas
16
  las páginas en las que aparece: </p>
17
<p class="imgcenter"><img src="../images/search-book-contents.jpg"/></p>
18
</body>
19
</html>

+ 0 - 31
zxing/src/main/assets/html-es/about2d.html

@ -1,31 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Acerca de los códigos de barras 2D </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p><strong> Barcode Scanner </strong> También entiende cómo leer dos códigos de barras bidimensionales,
10
  como los códigos QR y códigos Data Matrix. Por ejemplo, los códigos que siguen contienen un hipervínculo a la
11
  página principal de Project ZXing: </p>
12
<p class="imgcenter">
13
  <img src="../images/big-qr.png"/>
14
  <img src="../images/big-datamatrix.png"/>
15
  <img src="../images/big-pdf417.png"/>
16
  <img src="../images/big-aztec.png"/>
17
</p>
18
<p> También puede representar la información de contacto en un código QR, y usarlo en una tarjeta
19
  de visita o en un sitio web. Cuando se escanea, la pantalla de resultados se ofrecen una serie de acciones: </p>
20
<p class="imgcenter"><img src="../images/contact-results-screen.jpg"/></p>
21
<p> Además de las direcciones URL y la información de contacto, los códigos QR también puede contener: </p>
22
<ul>
23
  <li> Los eventos del calendario, que se pueden añadir a su calendario </li>
24
  <li> Los números de teléfono, que puede marcar </li>
25
  <li> SMS números, a los que puede enviar mensaje de texto </li>
26
  <li> Direcciones de correo electrónico, a los que se puede enviar por correo electrónico </li>
27
  <li> Coordenadas Geográficas, que se puede abrir en Mapas </li>
28
  <li> Texto sin formato, que se puede leer, compartir con un amigo </li>
29
</ul>
30
</body>
31
</html>

+ 0 - 25
zxing/src/main/assets/html-es/index.html

@ -1,25 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Ayuda de Barcode Scanner</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> La aplicación oficial de Android del proyecto de código abierto ZXing:<br/>
10
<a href="https://github.com/zxing/zxing"> https://github.com/zxing/zxing </a></p>
11
<p> Barcode Scanner utiliza la cámara de su móvil para leer códigos de barras y buscar información sobre
12
  los productos como los precios y las revisiones. </p>
13
<p class="imgcenter"><img src="../images/scan-example.png"/></p>
14
<p> También lee los códigos de barras 2D, como los Códigos QR y Data Matrix. Estos pueden contener enlaces
15
  a otros sitios web, información de contacto, como números de teléfono y direcciones de correo electrónico y mucho más. </p>
16
<ul class="touchable">
17
  <li><a href="whatsnew.html"> ¿Qué hay de nuevo en esta versión? </a></li>
18
  <li><a href="scanning.html"> Cómo escanear </a></li>
19
  <li><a href="about1d.html"> Acerca de los códigos de barras 1D </a></li>
20
  <li><a href="about2d.html"> Acerca de los códigos de barras 2D </a></li>
21
  <li><a href="sharing.html"> Cómo crear códigos QR </a></li>
22
  <li><a href="license.html"> Política de Privacidad Información Legal y Licencia </a></li>
23
</ul>
24
</body>
25
</html>

+ 0 - 40
zxing/src/main/assets/html-es/license.html

@ -1,40 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
  <meta charset="UTF-8"/>
5
  <title> Política de Privacidad Información Legal y Licencia </title>
6
  <link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
10
<h3> Política de privacidad </h3>
11
12
<p><strong class="notranslate">Barcode Scanner</strong> no recogerá, almacenará ni transmitirá información sobre sus usuarios,
13
  ni de uso de la aplicación. La aplicación tiene acceso a información personal, como contactos y favoritos solo con el fin
14
  de implementar la funcionalidad de la aplicación, tales como el intercambio de contactos y favoritos de los códigos QR en
15
  la pantalla. </p>
16
17
<p> Tenga en cuenta que esta aplicación tiene acceso a servicios de terceros, como Google Books, Google Product Search
18
  y Amazon, con el fin de obtener información adicional después de una exploración. Estos terceros pueden recibir y
19
  registrar estas solicitudes. Además, puede ser necesario el envío de la solicitud a un servidor operado por esta
20
  aplicación, con el fin de transformar la solicitud para su uso con el servicio de terceros, tales como la firma de
21
  la solicitud. No hay información adicional añadida a las peticiones, además de los términos de la consulta. </p>
22
23
<p> También tenga en cuenta que los enlaces de esta solicitud a sitios web de terceros y aplicaciones. Una vez más,
24
  hay más información que los términos de consulta se transmiten como parte de estos enlaces. Estos sitios y aplicaciones
25
   son independientes y no afiliados a esta solicitud, y no están cubiertos por esta Política de Privacidad. </p>
26
27
<h3> Marcas comerciales </h3>
28
29
<p><span class="notranslate">Google, Google Books, Google Product Search,
30
Barcode Scanner, ZXing, QR Code, Data Matrix, Aztec</span> son marcas comerciales de sus respectivos propietarios. </p>
31
32
<h3> Licencia y Derechos de Autor </h3>
33
34
<p> Este proyecto se basa en la <a class="notranslate" href="https://github.com/zxing/zxing">ZXing</a> código de barras
35
  de código abierto biblioteca de exploración, y está disponible para usted bajo los términos de la
36
  <a class="notranslate" href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License 2.0</a> : </p>
37
38
<p style="font-size:200%"><a class="notranslate" href="../html/apache-license.txt">Apache License 2.0</a></p>
39
</body>
40
</html>

+ 0 - 19
zxing/src/main/assets/html-es/scanning.html

@ -1,19 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Cómo escanear </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Barcode Scanner escanea continuamente una región cuadrada que aparece en su pantalla - Sólo basta introducir el código de barras es completamente dentro del rectángulo del visor: </p>
10
<p class="imgcenter"><img src="../images/demo-yes.png" style="padding:5px"/><img src="../images/demo-no.png" style="padding:5px"/></p>
11
<p> Códigos de barras 1D, como las que se encuentran en los productos requieren un teléfono con enfoque automático. Sin él, sólo los códigos QR y códigos Data Matrix serán susceptibles de ser analizados. </p>
12
<p> Cuando un código de barras es leído, un sonido será reproducido y podrás ver los resultados del análisis, una descripción de lo que contiene el código de barras, y las distintas opciones ejecutar acciones. </p>
13
<p> Si usted está teniendo problemas de escaneo, asegúrese de sujetar el teléfono estable. Si la cámara no puede enfocar, mueva el teléfono más lejos o más cerca del código de barras. </p>
14
<ul class="touchable">
15
  <li><a href="about1d.html"> Acerca de los códigos de barras 1D </a></li>
16
  <li><a href="about2d.html"> Acerca de los códigos de barras 2D </a></li>
17
</ul>
18
</body>
19
</html>

+ 0 - 14
zxing/src/main/assets/html-es/sharing.html

@ -1,14 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Cómo crear códigos QR </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Además de escanear códigos de barras 2D, Barcode Scanner también puede generar un código QR y lo mostrará en la pantalla. A continuación, lo puede mostrar a un amigo, y dejar que escanear el código de barras con su teléfono: </p>
10
<p class="imgcenter"><img src="../images/scan-from-phone.png"/></p>
11
<p> Para utilizar esta función, presione el botón Menú en la pantalla de exploración principal y presione Compartir. A continuación, seleccione si desea compartir un contacto, un marcador, una aplicación o el contenido del portapapeles. Un código QR se generará automáticamente. Cuando haya terminado, pulse Atrás o Inicio. </p>
12
<p> Para generar códigos QR desde su computadora, pruebe el generador ZXing Código QR: <a href="https://zxing.appspot.com/generator/"> https://zxing.appspot.com/generator/ </a></p>
13
</body>
14
</html>

+ 0 - 13
zxing/src/main/assets/html-es/whatsnew.html

@ -1,13 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> ¿Qué hay de nuevo en Barcode Scanner? </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<ul>
10
  <li> Corrección de errores </li>
11
</ul>
12
<p>Traducido por Google Translate.</p></body>
13
</html>

+ 0 - 15
zxing/src/main/assets/html-fr/about1d.html

@ -1,15 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> À propos des codes barres 1D </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Les codes barres traditionnels, tels que ceux imprimés sur l'emballage des produits commerciaux, sont appelés codes barres 1D. Il existe plusieurs types couramment utilisés, par exemple UPC et EAN. La plupart ressemblent à ceci : </p>
10
<p class="imgcenter"><img src="../images/big-1d.png"/></p>
11
<p> Ces codes barres 1D contiennent un code unique qui décrit typiquement un produit, comme un CD ou un livre. Vous pouvez chercher ce code sur Internet pour trouver les prix ou les critiques d'un article. </p>
12
<p> Si vous scannez un livre, vous pouvez également chercher un mot ou une phrase dans le contenu du livre, et trouver toutes les pages où ils apparaissent : </p>
13
<p class="imgcenter"><img src="../images/search-book-contents.jpg"/></p>
14
</body>
15
</html>

+ 0 - 26
zxing/src/main/assets/html-fr/about2d.html

@ -1,26 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> À propos des codes barres 2D </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p><strong> Barcode Scanner </strong> permet aussi de lire les codes barres à deux dimensions, comme les codes QR et les codes Data Matrix. Par exemple, les codes ci-dessous contiennent un lien hypertexte vers la page d'accueil du projet ZXing : </p>
10
<p class="imgcenter">
11
  <img src="../images/big-qr.png"/>
12
  <img src="../images/big-datamatrix.png"/>
13
  <img src="../images/big-pdf417.png"/>
14
  <img src="../images/big-aztec.png"/></p>
15
<p> Il est également possible de fournir des informations de contact dans un code QR, et le mettre sur une carte de visite ou un site Web. Lorsque vous scannez, l'écran de résultat fournit un choix d'actions : </p>
16
<p class="imgcenter"><img src="../images/contact-results-screen.jpg"/></p>
17
<p> En plus d'une URL ou d'informations de contact, les codes QR peuvent aussi contenir : </p>
18
<ul>
19
  <li> Des événements/invitations, que vous pouvez ajouter à votre agenda </li>
20
  <li> Des numéros de téléphone que vous pouvez appeler, ou à qui vous pouvez envoyer un SMS </li>
21
  <li> Des adresses e-mail, à qui vous pouvez écrire </li>
22
  <li> Des coordonnées géographiques, que vous pouvez ouvrir dans Maps </li>
23
  <li> Du texte, que vous pouvez lire, puis partager avec un ami </li>
24
</ul>
25
</body>
26
</html>

+ 0 - 23
zxing/src/main/assets/html-fr/index.html

@ -1,23 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Aide Barcode Scanner </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> L'application officielle Android du projet open-source ZXing :<br/>
10
<a href="https://github.com/zxing/zxing"> https://github.com/zxing/zxing </a></p>
11
<p> Barcode Scanner utilise la caméra de votre téléphone pour lire des codes barres, et rechercher des informations produit, telles que les prix et les critiques. </p>
12
<p class="imgcenter"><img src="../images/scan-example.png"/></p>
13
<p> Il lit également les codes barres 2D tels que les codes QR et Data Matrix. Ceux-ci peuvent contenir des liens vers des sites Web, des informations de contact comme des numéros de téléphone et des adresses e-mail, et plus encore. </p>
14
<ul class="touchable">
15
  <li><a href="whatsnew.html"> Quoi de neuf dans cette version </a></li>
16
  <li><a href="scanning.html"> Comment numériser </a></li>
17
  <li><a href="about1d.html"> À propos de codes à barres 1D </a></li>
18
  <li><a href="about2d.html"> À propos de codes-barres 2D </a></li>
19
  <li><a href="sharing.html"> Comment créer des codes QR </a></li>
20
  <li><a href="license.html"> Politique de confidentialité, Informations légales et licence </a></li>    
21
</ul>
22
</body>
23
</html>

+ 0 - 30
zxing/src/main/assets/html-fr/license.html

@ -1,30 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
  <meta charset="UTF-8"/>
5
  <title> Politique de confidentialité, Informations légales et licence </title>
6
  <link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
10
<h3> Politique de confidentialité </h3>
11
12
<p><strong class="notranslate">Barcode Scanner</strong> ne collecte pas, stocke pas ni ne transmet des informations sur ses utilisateurs, ni l'utilisation de l'application. L'application accède à des informations personnelles telles que les contacts et les signets seulement dans le but de mettre en œuvre des fonctionnalités de l'application, tels que le partage des contacts et des signets par les codes QR sur l'écran. </p>
13
14
<p> Notez que cette application accède à des services tiers, y compris Google Books, Google Recherche d'un produit et Amazon, afin de récupérer des informations supplémentaires à la suite d'une analyse. Ces tierces parties reçoivent ces demandes, et peuvent éventuellement les stocker. En outre, il peut être nécessaire d'envoyer la requête à un serveur exploité par cette application, afin de transformer la demande pour une utilisation avec le service tiers, tels que la signature de la demande. Aucune information supplémentaire n'est ajoutée aux demandes en dehors des termes de la requête. </p>
15
16
<p> A noter également que cette application fournit des liens vers des sites et des applications Web de tiers. Encore une fois, aucune information autre que les termes de requête ne sont transmis dans le cadre de ces liens. Ces sites et applications sont séparés et ne sont pas affiliés à cette application, et ne sont pas couverts par la présente Politique de confidentialité. </p>
17
18
<h3> Marques </h3>
19
20
<p><span class="notranslate">Google, Google Books, Google Product Search,
21
Barcode Scanner, ZXing, QR Code, Data Matrix, Aztec</span> sont tous des marques de commerce de leurs propriétaires respectifs. </p>
22
23
<h3> Licence et droits d'auteur </h3>
24
25
<p> Ce projet est basé sur la bibliothèque open source de scanning de codes barres <a class="notranslate" href="https://github.com/zxing/zxing">ZXing</a>, et est publié sous <a class="notranslate" href="http://www.apache.org/licenses/LICENSE-2.0.html">Licence Apache 2.0</a> : </p>
26
27
<p style="font-size:200%"><a class="notranslate" href="../html/apache-license.txt">Licence Apache 2.0</a></p>
28
29
</body>
30
</html>

+ 0 - 19
zxing/src/main/assets/html-fr/scanning.html

@ -1,19 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Comment numériser </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Barcode Scanner scanne en permanence une zone carrée affichée sur votre écran -- tenez le téléphone droit, de sorte que le code barres soit droit et complètement à l'intérieur du rectangle du viseur : </p>
10
<p class="imgcenter"><img src="../images/demo-yes.png" style="padding:5px"/><img src="../images/demo-no.png" style="padding:5px"/></p>
11
<p> Les code barres 1D comme ceux qu'on trouve sur les produits nécessitent un téléphone avec autofocus. Sans autofocus, seuls les codes QR et les codes Data Matrix seront scannables. </p>
12
<p> Quand un code barres est lu, un bip sonore est émis, et le résultat de l'analyse s'affiche : une description de ce que le code barres contient, et ce que vous pouvez faire à partir de ces données. </p>
13
<p> Si vous rencontrez des problèmes pour scanner un code barres, assurez-vous de tenir le téléphone sans trop bouger. Si l'appareil photo n'arrive pas à fournir une image nette, essayez de déplacer le téléphone plus loin ou plus près du code barres. </p>
14
<ul class="touchable">
15
  <li><a href="about1d.html"> À propos des codes barres 1D </a></li>
16
  <li><a href="about2d.html"> À propos des codes barres 2D </a></li>
17
</ul>
18
</body>
19
</html>

+ 0 - 14
zxing/src/main/assets/html-fr/sharing.html

@ -1,14 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Comment créer des codes QR </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> En plus de scanner des codes barres, Barcode Scanner peut aussi créér un code QR et l'afficher sur votre écran. Ensuite, vous pouvez le montrer à un ami, pour qu'il le scanne avec son téléphone : </p>
10
<p class="imgcenter"><img src="../images/scan-from-phone.png"/></p>
11
<p> Pour utiliser cette fonction, appuyez sur la touche Menu depuis l'écran principal, puis appuyez sur Partager. Ensuite, choisissez si vous voulez partager un contact, un signet, une application ou le contenu du presse-papiers. Un code QR est généré automatiquement. Lorsque vous avez terminé, appuyez sur Retour. </p>
12
<p> Pour générer les codes QR à partir de votre ordinateur, essayez le générateur de code QR ZXing: <a href="https://zxing.appspot.com/generator/"> https://zxing.appspot.com/generator/ </a></p>
13
</body>
14
</html>

+ 0 - 13
zxing/src/main/assets/html-fr/whatsnew.html

@ -1,13 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Quoi de neuf dans Barcode Scanner </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<ul>
10
  <li> Corrections de bugs </li>
11
</ul>
12
<p>Traduit par Google Translate.</p></body>
13
</html>

+ 0 - 15
zxing/src/main/assets/html-it/about1d.html

@ -1,15 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> A proposito di codici a barre 1D </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Codici a barre tradizionali, come quelle stampate sulla confezione del prodotto, sono noti anche come uno codici a barre bidimensionali. Ci sono diversi tipi di uso comune, tra cui UPC ed EAN. La maggior parte simile al seguente: </p>
10
<p class="imgcenter"><img src="../images/big-1d.png"/></p>
11
<p> Queste barre 1D contengono un codice unico che descrive tipicamente un prodotto, come un CD o un libro. È possibile cercare questo codice su internet per trovare i prezzi, recensioni e altro. </p>
12
<p> Se si esegue la scansione di un libro, è anche possibile cercare i contenuti del libro per una parola o una frase, e trovare tutte le pagine in cui appare: </p>
13
<p class="imgcenter"><img src="../images/search-book-contents.jpg"/></p>
14
<p>Tradotto da Google Translate.</p></body>
15
</html>

+ 0 - 28
zxing/src/main/assets/html-it/about2d.html

@ -1,28 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> A proposito di codici a barre 2D </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p><strong> Barcode Scanner </strong> comprende anche come leggere due codici a barre bidimensionali, come i codici QR e codici Data Matrix. Per esempio, i seguenti codici contengono un collegamento ipertestuale alla pagina ZXing principale del progetto: </p>
10
<p class="imgcenter">
11
  <img src="../images/big-qr.png"/>
12
  <img src="../images/big-datamatrix.png"/>
13
  <img src="../images/big-pdf417.png"/>
14
  <img src="../images/big-aztec.png"/>
15
</p>
16
<p> È anche possibile rappresentare le informazioni di contatto in un QR Code, e metterlo su un biglietto da visita o un sito web. Quando si esegue la scansione, la schermata dei risultati fornisce una serie di azioni: </p>
17
<p class="imgcenter"><img src="../images/contact-results-screen.jpg"/></p>
18
<p> Oltre URL e informazioni di contatto, i codici QR possono contenere anche: </p>
19
<ul>
20
  <li> Eventi del Calendario, che è possibile aggiungere al vostro calendario </li>
21
  <li> I numeri di telefono, che possono essere digitati </li>
22
  <li> Numeri di SMS, che è possibile il testo del messaggio </li>
23
  <li> Indirizzi e-mail, che possono essere inviati per email </li>
24
  <li> Coordinate geografiche, che è possibile aprire in Mappe </li>
25
  <li> Testo semplice, che si può leggere, quindi condividere con un amico </li>
26
</ul>
27
<p>Tradotto da Google Translate.</p></body>
28
</html>

+ 0 - 23
zxing/src/main/assets/html-it/index.html

@ -1,23 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Barcode Scanner Aiuto </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> L'applicazione ufficiale di Android del progetto aperto ZXing fonte:<br/>
10
<a href="https://github.com/zxing/zxing"> https://github.com/zxing/zxing </a></p>
11
<p> Scanner di codici a barre utilizza la fotocamera del telefono per leggere codici a barre e ricercare informazioni sui prodotti, i prezzi e le recensioni. </p>
12
<p class="imgcenter"><img src="../images/scan-example.png"/></p>
13
<p> Legge anche codici a barre 2D, come i codici QR e Data Matrix. Questi possono contenere link a siti web, informazioni di contatto, quali numeri di telefono e indirizzi e-mail e altro ancora. </p>
14
<ul class="touchable">
15
  <li><a href="whatsnew.html"> Cosa c'è di nuovo in questa versione </a></li>
16
  <li><a href="scanning.html"> Come eseguire la scansione </a></li>
17
  <li><a href="about1d.html"> A proposito di codici a barre 1D </a></li>
18
  <li><a href="about2d.html"> A proposito di codici a barre 2D </a></li>
19
  <li><a href="sharing.html"> Come creare codici QR </a></li>
20
  <li><a href="license.html"> Informazioni legali e di licenza </a></li>    
21
</ul>
22
<p>Tradotto da Google Translate.</p></body>
23
</html>

+ 0 - 30
zxing/src/main/assets/html-it/license.html

@ -1,30 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
  <meta charset="UTF-8"/>
5
  <title> Privacy, Informazioni legali e di licenza </title>
6
  <link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
10
<h3> Politica sulla privacy </h3>
11
12
<p><strong class="notranslate">Barcode Scanner</strong> non raccogliere, memorizzare o trasmettere le informazioni sui suoi utenti, né utilizzo dell'applicazione. L'applicazione accede a informazioni personali come contatti e segnalibri solo al fine di implementare la funzionalità dell'applicazione, come la condivisione di contatti e segnalibri da codici QR sullo schermo. </p>
13
14
<p> Si noti che questa applicazione accede a servizi di terze parti, tra cui Google Libri, Google Product Search e Amazon, al fine di recuperare le informazioni aggiuntive a seguito di una scansione. Queste terze parti ricevono e possono registrare queste richieste. Inoltre, può essere necessario inviare la richiesta a un server gestito da questa applicazione, per trasformare la richiesta per l'utilizzo con il servizio di terze parti, come la firma della richiesta. Nessuna informazione aggiuntiva si aggiunge alle richieste oltre i termini di query. </p>
15
16
<p> Si noti inoltre che i collegamenti questa applicazione per i siti Web di terze parti e le applicazioni. Anche in questo caso, nessuna informazione diversa termini di query vengono passati come parte di questi link. Questi siti e le applicazioni sono distinte e non è affiliato con questa applicazione, e non sono coperti da questa Informativa sulla privacy. </p>
17
18
<h3> Marchi di fabbrica </h3>
19
20
<p><span class="notranslate">Google, Google Books, Google Product Search,
21
Barcode Scanner, ZXing, QR Code, Data Matrix, Aztec</span> sono tutti marchi di fabbrica dei rispettivi proprietari. </p>
22
23
<h3> Licenza e Copyright </h3>
24
25
<p> Questo progetto si basa sulla <a class="notranslate" href="https://github.com/zxing/zxing">ZXing</a> barcode open source scansione biblioteca, e viene concesso in licenza sotto i termini della <a class="notranslate" href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License 2.0</a> : </p>
26
27
<p style="font-size:200%"><a class="notranslate" href="../html/apache-license.txt">Apache License 2.0</a></p>
28
29
<p>Tradotto da Google Translate.</p></body>
30
</html>

+ 0 - 19
zxing/src/main/assets/html-it/scanning.html

@ -1,19 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Come eseguire la scansione </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Barcode Scanner analizza continuamente una regione quadrata mostrata sullo schermo - solo linea il telefono in modo che il codice a barre è completamente all'interno del rettangolo del mirino: </p>
10
<p class="imgcenter"><img src="../images/demo-yes.png" style="padding:5px"/><img src="../images/demo-no.png" style="padding:5px"/></p>
11
<p> Codici a barre 1D, come quelle che si trovano sui prodotti richiede un telefono con autofocus. Senza di essa, solo i codici QR e codici Data Matrix sarà leggibile. </p>
12
<p> Quando un codice a barre viene letto, un bip si giocare e vedrete i risultati della scansione, una descrizione di ciò che il codice a barre contiene, e le opzioni per intervenire sui contenuti. </p>
13
<p> Se hai dei problemi di scansione, assicurarsi di tenere il telefono fermo. Se la fotocamera non riesce a mettere a fuoco, provare a spostare il telefono lontano o più vicino dal codice a barre. </p>
14
<ul class="touchable">
15
  <li><a href="about1d.html"> A proposito di codici a barre 1D </a></li>
16
  <li><a href="about2d.html"> A proposito di codici a barre 2D </a></li>
17
</ul>
18
<p>Tradotto da Google Translate.</p></body>
19
</html>

+ 0 - 14
zxing/src/main/assets/html-it/sharing.html

@ -1,14 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Come creare codici QR </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Oltre alla scansione di codici a barre 2D, Barcode Scanner può anche generare un codice QR e visualizzarla sullo schermo. Poi si può mostrare ad un amico, e far loro eseguire la scansione del codice a barre con il proprio telefono: </p>
10
<p class="imgcenter"><img src="../images/scan-from-phone.png"/></p>
11
<p> Per utilizzare questa funzione, premere il tasto Menu dalla schermata di scansione principale, e toccare Condividi. Quindi scegliere se si desidera condividere un contatto, un segnalibro, un'applicazione, o il contenuto degli appunti. Un codice a barre verrà generato automaticamente. Al termine, premere Indietro o Home. </p>
12
<p> Per generare i codici QR dal tuo computer, provare il generatore di ZXing QR Code: <a href="https://zxing.appspot.com/generator/"> https://zxing.appspot.com/generator/ </a></p>
13
<p>Tradotto da Google Translate.</p></body>
14
</html>

+ 0 - 13
zxing/src/main/assets/html-it/whatsnew.html

@ -1,13 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Cosa c'è di nuovo nella Barcode Scanner </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<ul>
10
  <li> Correzioni di bug </li>
11
</ul>
12
<p>Tradotto da Google Translate.</p></body>
13
</html>

+ 0 - 15
zxing/src/main/assets/html-ja/about1d.html

@ -1,15 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>一次元バーコードについて</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>商品のパッケージに印刷されているような従来のバーコードは一次元バーコードと呼ばれています。一次元バーコードにはいくつか種類があり、UPC, EANといったものは一般的によく使われます。通常は次のような外見をしています。</p>
10
<p class="imgcenter"><img src="../images/big-1d.png"/></p>
11
<p>通常これらの一次元バーコードにはCDや本といった商品を表す商品固有のコードが含まれています。このコードをインターネットで検索すると価格やレビューなどがわかります。</p>
12
<p>本を読み取った場合、次のように本の中から単語やフレーズを検索でき、単語やフレーズが含まれる全てのページを一覧できます。</p>
13
<p class="imgcenter"><img src="../images/search-book-contents.jpg"/></p>
14
</body>
15
</html>

+ 0 - 28
zxing/src/main/assets/html-ja/about2d.html

@ -1,28 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>二次元バーコードについて</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p><strong>QRコードスキャナー</strong>はQRコードやData Matrixといった二次元バーコードも認識します。例えば、次の二次元コードにはZXingプロジェクトのホームページへのリンクが含まれます。</p>
10
<p class="imgcenter">
11
  <img src="../images/big-qr.png"/>
12
  <img src="../images/big-datamatrix.png"/>
13
  <img src="../images/big-pdf417.png"/>
14
  <img src="../images/big-aztec.png"/>
15
</p>
16
<p>またQRコードで連絡先情報を表現して、名刺やウェブサイトに掲載できます。連絡先情報を含むQRコードを読み取ると、結果画面には処理の選択肢が表示されます。</p>
17
<p class="imgcenter"><img src="../images/contact-results-screen.jpg"/></p>
18
<p>URLや連絡先情報の他に、QRコードには次のような情報を含められます。</p>
19
<ul>
20
  <li>カレンダーのイベント。カレンダーに追加できます</li>
21
  <li>電話番号。電話を掛けられます</li>
22
  <li>SMS番号。テキストメッセージを送れます</li>
23
  <li>電子メールアドレス。メールを送れます</li>
24
  <li>地理座標。地図で開けます</li>
25
  <li>通常の文章。読んだり友人と共有したりできます</li>
26
</ul>
27
</body>
28
</html>

+ 0 - 22
zxing/src/main/assets/html-ja/index.html

@ -1,22 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>QRコードスキャナー ヘルプ</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>ZXingオープンソースプロジェクト(<a href="https://github.com/zxing/zxing">https://github.com/zxing/zxing</a>)の公式Androidアプリです。</p>
10
<p>QRコードスキャナーは携帯電話のカメラを使ってバーコードを読み取り、価格やレビューなどの製品情報を検索します。</p>
11
<p class="imgcenter"><img src="../images/scan-example.png"/></p>
12
<p>またQRコードやData Matrixといった二次元バーコードも読み取ります。二次元バーコードにはウェブサイトへのリンクや、電話番号やメールアドレスといった連絡先情報が含まれます。 </p>
13
<ul class="touchable">
14
  <li><a href="whatsnew.html">このバージョンでの新機能</a></li>
15
  <li><a href="scanning.html">スキャン方法</a></li>
16
  <li><a href="about1d.html">一次元バーコードについて</a></li>
17
  <li><a href="about2d.html">二次元バーコードについて</a></li>
18
  <li><a href="sharing.html">QRコードの作成方法</a></li>
19
  <li><a href="license.html">プライバシーポリシーおよび法的事項とライセンス情報</a></li>
20
</ul>
21
</body>
22
</html>

+ 0 - 29
zxing/src/main/assets/html-ja/license.html

@ -1,29 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
  <meta charset="UTF-8"/>
5
  <title>プライバシーポリシーおよび法的事項とライセンス情報</title>
6
  <link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
10
<h3>プライバシーポリシー</h3>
11
12
<p><strong class="notranslate">QRコードスキャナー</strong>はユーザに関する情報やアプリケーションの使用状況を収集・保存・送信しません。アプリケーションは連絡先情報やブックマークといった個人情報を、QRコードを画面上に表示して共有するといったアプリケーションの機能を実装するためのみに利用します。</p>
13
14
<p>このアプリケーションは、スキャン後に追加の情報を得るためにGoogle ブックスやGoogle Product SearchやAmazonといった第三者サービスにアクセスする点に注意してください。そららの第三者サービスはリクエストを受け取り保存する場合があります。また、第三者サービスを利用する上でリクエストに対して署名を追加するなどの加工をするために、このアプリケーションによって運営されるサーバに対してリクエストを送信する必要がある場合があります。リクエストには検索キーワード以外の情報は含まれません。</p>
15
16
<p>また、このアプリケーションは第三者のウェブサイトやアプリケーションにリンクする点にも注意してください。この場合もやはりリンクを通じては検索キーワード以外の情報は渡されません。それらのサイトおよびアプリケーションはこのアプリケーションとは独立しており、提携しておらず、このプライバシーポリシーは及びません。</p>
17
18
<h3>商標について</h3>
19
20
<p><span class="notranslate">Google, Google Books, Google ブックス, Google Product Search, Barcode Scanner, QRコードスキャナー, ZXing, QR Code, QRコード, Data Matrix, Aztec</span>はすべてそれぞれの所有者の商標または登録商標です。</p>
21
22
<h3>ライセンスと著作権</h3>
23
24
<p>このプロジェクトは<a href="https://github.com/zxing/zxing" class="notranslate">ZXing</a>オープンソースバーコード読み取りライブラリに基いており、次の<a href="http://www.apache.org/licenses/LICENSE-2.0.html" class="notranslate">Apache License 2.0</a>に従ってあなたにライセンスされています。</p>
25
26
<p style="font-size:200%"><a class="notranslate" href="../html/apache-license.txt">Apache License 2.0</a></p>
27
28
</body>
29
</html>

+ 0 - 19
zxing/src/main/assets/html-ja/scanning.html

@ -1,19 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>スキャン方法</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>QRコードスキャナーはスクリーン上の四角形の領域を連続して読み取ります。バーコードが完全にファインダーのフレームに収まるように携帯電話を動かしてください。</p>
10
<p class="imgcenter"><img src="../images/demo-yes.png" style="padding:5px"/><img src="../images/demo-no.png" style="padding:5px"/></p>
11
<p>商品に付与されているような一次元バーコードを読み取るためには、オートフォーカス付きの携帯電話が必要です。オートフォーカスが無い場合、QRコードとData Matrixのみが読み取れます。</p>
12
<p>バーコードが読み取られるとビープ音が鳴り、読み取り結果としてバーコードの内容の説明と、内容に対して実行できる処理の一覧が表示されます。</p>
13
<p>上手く読み取れない場合は、携帯電話を手でしっかりと固定してください。もしピントが合わない場合は、携帯電話をバーコードから離したり近づけたりしてみてください。</p>
14
<ul class="touchable">
15
  <li><a href="about1d.html">一次元バーコードについて</a></li>
16
  <li><a href="about2d.html">二次元バーコードについて</a></li>
17
</ul>
18
</body>
19
</html>

+ 0 - 14
zxing/src/main/assets/html-ja/sharing.html

@ -1,14 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>QRコードの作成方法</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>二次元バーコードの読み取りに加えて、QRコードスキャナーではQRコードを作成して携帯電話の画面に表示できます。そして次のように友人に見せて携帯電話で読み取ってもらえます。</p>
10
<p class="imgcenter"><img src="../images/scan-from-phone.png"/></p>
11
<p>この機能を使うためにはメインの読み取り画面でメニューボタンを押し、「共有」をタップします。そして連絡先情報・ブックマーク・アプリケーション・クリップボードの中身の中から共有したいものを選んで下さい。QRコードは自動で生成されます。共有が終了したら戻るボタンかホームボタンを押してください。</p>
12
<p>パソコンからQRコードを生成するには、ZXing QR Code Generator (<a href="https://zxing.appspot.com/generator/">https://zxing.appspot.com/generator/</a>)をご利用ください。</p>
13
</body>
14
</html>

+ 0 - 13
zxing/src/main/assets/html-ja/whatsnew.html

@ -1,13 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>このバージョンでの新機能</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<ul>
10
  <li> バグの修正 </li>
11
</ul>
12
<p>Googleが翻訳翻訳。</p></body>
13
</html>

+ 0 - 15
zxing/src/main/assets/html-ko/about1d.html

@ -1,15 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> 1D 바코드 정보 </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> 이러한 제품 포장에 인쇄 된 것과 같은 전통적인 바코드는도 1 차원 바코드로 알려져 있습니다. UPC 및 EAN 등 일반적으로 사용되는 여러 종류가 있습니다. 대부분은 다음과 유사 : </p>
10
<p class="imgcenter"><img src="../images/big-1d.png"/></p>
11
<p> 이 1D 바코드는 일반적으로 CD 나 책 같은 제품을 설명하는 고유 한 코드가 포함되어 있습니다. 당신은 가격, 리뷰 등을 찾아 인터넷에서이 코드를 찾아 볼 수 있습니다. </p>
12
<p> 당신은 책을 스캔 할 경우, 당신은 또한 단어 나 문구에 대한 책의 내용을 검색하고 표시 모든 페이지를 찾을 수 있습니다 : </p>
13
<p class="imgcenter"><img src="../images/search-book-contents.jpg"/></p>
14
<p>Google 번역을 통해 번역.</p></body>
15
</html>

+ 0 - 28
zxing/src/main/assets/html-ko/about2d.html

@ -1,28 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> 에 대한 2 차원 바코드 </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p><strong> 바코드 스캐너 </strong> 또한, QR 코드 및 데이터 매트릭스 코드와 같은 2 차원 바코드를 읽는 방법을 이해하고 있습니다. 예를 들어, 아래의 코드는 ZXing 프로젝트 홈 페이지에 하이퍼 링크를 포함 : </p>
10
<p class="imgcenter">
11
  <img src="../images/big-qr.png"/>
12
  <img src="../images/big-datamatrix.png"/>
13
  <img src="../images/big-pdf417.png"/>
14
  <img src="../images/big-aztec.png"/>
15
</p>
16
<p> 당신은 또한 QR 코드에 연락처 정보를 나타냅니다, 그리고 명함 또는 웹 사이트에 넣을 수 있습니다. 당신이 그것을 스캔하면 결과 화면이 작업의 선택을 제공합니다 : </p>
17
<p class="imgcenter"><img src="../images/contact-results-screen.jpg"/></p>
18
<p> URL 및 연락처 정보 외에, QR 코드도 포함 할 수 있습니다 : </p>
19
<ul>
20
  <li> 귀하의 캘린더에 추가 할 수있는 캘린더 이벤트, </li>
21
  <li> 당신이 전화를 걸 수 전화 번호, </li>
22
  <li> 당신은 문자 메시지를 보낼 수있는 SMS 번호, </li>
23
  <li> 당신은 이메일을 보낼 수 이메일 주소 </li>
24
  <li> 당신이지도에서 열 수있는 지리 좌표, </li>
25
  <li> 당신이 읽을 수있는 일반 텍스트는 다음 친구와 공유 </li>
26
</ul>
27
<p>Google 번역을 통해 번역.</p></body>
28
</html>

+ 0 - 23
zxing/src/main/assets/html-ko/index.html

@ -1,23 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> 바코드 스캐너 도움말 </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> 오픈 소스 ZXing 프로젝트의 공식 안드로이드 응용 프로그램 :<br/>
10
<a href="https://github.com/zxing/zxing"> https://github.com/zxing/zxing </a></p>
11
<p> 바코드 스캐너는 바코드를 읽어와 같은 가격과 리뷰 등의 제품 정보를 조회 할 휴대 전화의 카메라를 사용합니다. </p>
12
<p class="imgcenter"><img src="../images/scan-example.png"/></p>
13
<p> 그것은 또한 QR 코드와 데이터 매트릭스와 같은 2 차원 바코드를 읽습니다. 이러한 웹 사이트에 대한 링크를 포함 할 수 있습니다, 같은 전화 번호와 이메일 주소 등의 정보를 문의하십시오. </p>
14
<ul class="touchable">
15
  <li><a href="whatsnew.html"> 이 버전의 새로운 기능 </a></li>
16
  <li><a href="scanning.html"> 스캔하는 방법 </a></li>
17
  <li><a href="about1d.html"> 1D 바코드에 대한 </a></li>
18
  <li><a href="about2d.html"> 에 대한 2 차원 바코드 </a></li>
19
  <li><a href="sharing.html"> 어떻게 QR 코드를 만드는 방법 </a></li>
20
  <li><a href="license.html"> 개인 정보 보호 정책, 법률 및 라이센스 정보 </a></li>    
21
</ul>
22
<p>Google 번역에 의해 번역.</p></body>
23
</html>

+ 0 - 30
zxing/src/main/assets/html-ko/license.html

@ -1,30 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
  <meta charset="UTF-8"/>
5
  <title> 개인 정보 보호 정책, 법률 및 라이센스 정보 </title>
6
  <link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
10
<h3> 개인 정보 보호 정책 </h3>
11
12
<p><strong class="notranslate">Barcode Scanner</strong> 그 사용자 나 응용 프로그램의 사용에 대한 정보를 수집 저장하거나 전송하지 않습니다. 응용 프로그램은 연락처 및 책갈피 전용 같은 화면에 QR 코드로 연락처와 즐겨 찾기를 공유하는 등, 응용 프로그램 기능을 구현하기 위해 같은 개인 정보를 액세스 할 수 있습니다. </p>
13
14
<p> 이 응용 프로그램이 검색 다음에 대한 추가 정보를 검색하기 위해 Google 도서, 구글 제품 검색과 아마존 등의 써드 파티 서비스를 액세스합니다. 이러한 타사 수신하고 이러한 요청을 기록 할 수 있습니다. 또한, 이러한 요청을 서명 등의 타사 서비스 사용에 대한 요청을 변환하기 위해이 응용 프로그램에 의해 운영 서버에 요청을 보낼 필요가 있습니다. 더 자세한 내용은 쿼리 조건 외에 요청에 추가되지 않습니다. </p>
15
16
<p> 또한주의 그러한 구글 구매자와 같은 타사 웹 사이트 및 응용 프로그램이 응용 프로그램에 링크,. 다시 말하지만, 검색어 이외의 정보는 다음 링크의 일부로 전달되지 않습니다. 이러한 사이트 및 응용 프로그램에서 분리하고이 응용 프로그램과 제휴하지 않습니다, 그리고 본 개인 정보 보호 정책이 적용되지 않습니다. </p>
17
18
<h3> 상표 </h3>
19
20
<p><span class="notranslate">Google, Google Books, Google Product Search,
21
Barcode Scanner, ZXing, QR Code, Data Matrix, Aztec</span> 해당 소유자의 상표입니다. </p>
22
23
<h3> 라이센스 및 저작권 </h3>
24
25
<p> 이 프로젝트를 기반으로 <a class="notranslate" href="https://github.com/zxing/zxing">ZXing</a> 오픈 소스 바코드 라이브러리를 검색하고, 조건에 의거하여 라이센스가 부여됩니다 <a class="notranslate" href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License 2.0</a> : </p>
26
27
<p style="font-size:200%"><a class="notranslate" href="../html/apache-license.txt">Apache License 2.0</a></p>
28
29
<p>Google 번역에 의해 번역.</p></body>
30
</html>

+ 0 - 19
zxing/src/main/assets/html-ko/scanning.html

@ -1,19 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> 스캔하는 방법 </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> : 바코드가 완전히 뷰 파인더의 사각형 안에하도록 전화, 조금만 라인 - 바코드 스캐너는 지속적으로 화면에 표시 사각형 영역을 검사 </p>
10
<p class="imgcenter"><img src="../images/demo-yes.png" style="padding:5px"/><img src="../images/demo-no.png" style="padding:5px"/></p>
11
<p> 제품에서 발견 된 것과 같은 1D 바코드는 자동 초점과 전화를해야합니다. 가 없으면 만 QR 코드와 데이터 매트릭스 코드는 확인 가능한 것입니다. </p>
12
<p> 바코드를 읽을 때, 삐 소리가 재생됩니다 그리고 당신은 스캔, 바코드의 내용이 뭔지 설명 및 내용에 조치를 취할 수있는 옵션의 결과를 볼 수 있습니다. </p>
13
<p> 당신은 문제가 검색하는 데 문제가있는 경우 휴대 전화가 정상 상태에 있는지 확인하십시오. 카메라가 초점을 맞출 수없는 경우, 바코드에서 더 또는 더 가까이 휴대 전화를 이동하십시오. </p>
14
<ul class="touchable">
15
  <li><a href="about1d.html"> 1D 바코드 정보 </a></li>
16
  <li><a href="about2d.html"> 에 대한 2 차원 바코드 </a></li>
17
</ul>
18
<p>Google 번역을 통해 번역.</p></body>
19
</html>

+ 0 - 14
zxing/src/main/assets/html-ko/sharing.html

@ -1,14 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> 어떻게 QR 코드를 만드는 방법 </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> 2D 바코드를 스캔뿐만 아니라, 바코드 스캐너는 QR 코드를 생성 할 수 있으며 화면에 표시됩니다. 그럼 당신은 친구에게 보여, 그 자신의 휴대 전화로 바코드를 스캔하도록 할 수 있습니다 : </p>
10
<p class="imgcenter"><img src="../images/scan-from-phone.png"/></p>
11
<p> 이 기능을 사용하려면 기본 검색 화면에서 메뉴 버튼을 누르면,하고 공유를 누릅니다. 그런 다음 연락처, 즐겨 찾기, 응용 프로그램 또는 클립 보드의 내용을 공유할지 여부를 선택합니다. QR 코드가 자동으로 생성됩니다. 이 완료되면, 뒤로 또는 홈을 누릅니다. </p>
12
<p> 컴퓨터에서 QR 코드를 생성하려면 ZXing QR 코드 생성기를 사용해 : <a href="https://zxing.appspot.com/generator/"> https://zxing.appspot.com/generator/ </a></p>
13
<p>Google 번역을 통해 번역.</p></body>
14
</html>

+ 0 - 13
zxing/src/main/assets/html-ko/whatsnew.html

@ -1,13 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> 바코드 스캐너의 새로운 기능 </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<ul>
10
  <li> 버그 수정 </li>
11
</ul>
12
<p>구글 번역 번역.</p></body>
13
</html>

+ 0 - 15
zxing/src/main/assets/html-nl/about1d.html

@ -1,15 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Over 1D barcodes </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Traditionele barcodes, zoals gedrukt op de verpakking, ook bekend als eendimensionale barcodes. Er zijn verschillende types gebruikt, zoals UPC en EAN. De meeste lijken op deze: </p>
10
<p class="imgcenter"><img src="../images/big-1d.png"/></p>
11
<p> Deze 1D barcodes bevatten een unieke code die typisch beschrijft een product, zoals een cd of een boek. U kunt kijken deze code op het internet om de prijzen, reviews en nog veel meer te vinden. </p>
12
<p> Als u scant een boek, kunt u ook zoeken in de inhoud van het boek voor een woord of zin, en vind alle pagina's waar het verschijnt: </p>
13
<p class="imgcenter"><img src="../images/search-book-contents.jpg"/></p>
14
<p>Vertaald door Google Translate.</p></body>
15
</html>

+ 0 - 28
zxing/src/main/assets/html-nl/about2d.html

@ -1,28 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Over 2D barcodes </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p><strong> Barcode Scanner </strong> begrijpt ook hoe om te lezen tweedimensionale barcodes, zoals QR Codes en Data Matrix codes. Bijvoorbeeld, de volgende codes bevatten een hyperlink naar de ZXing Project home page: </p>
10
<p class="imgcenter">
11
  <img src="../images/big-qr.png"/>
12
  <img src="../images/big-datamatrix.png"/>
13
  <img src="../images/big-pdf417.png"/>
14
  <img src="../images/big-aztec.png"/>
15
</p>
16
<p> U kunt contactgegevens ook te vertegenwoordigen in een QR-code, en zet het op een visitekaartje of website. Als u het scannen, de resultaten scherm biedt een keuze van acties: </p>
17
<p class="imgcenter"><img src="../images/contact-results-screen.jpg"/></p>
18
<p> Naast URL's en contactgegevens, kunnen QR Codes bevatten: </p>
19
<ul>
20
  <li> Agenda-items, die u kunt toevoegen aan uw agenda </li>
21
  <li> Telefoonnummers, die u kunt bellen </li>
22
  <li> SMS-nummers, die u kunt SMS-bericht </li>
23
  <li> E-mailadressen, die u kunt e-mailen </li>
24
  <li> Geografische coördinaten, die u kunt openen in Google Maps </li>
25
  <li> Platte tekst, die u kunt lezen, dan delen met een vriend </li>
26
</ul>
27
<p>Vertaald door Google Translate.</p></body>
28
</html>

+ 0 - 23
zxing/src/main/assets/html-nl/index.html

@ -1,23 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Barcode Scanner Help </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> De officiële Android app van de open source ZXing project:<br/>
10
<a href="https://github.com/zxing/zxing"> https://github.com/zxing/zxing </a></p>
11
<p> Barcode Scanner maakt gebruik van de camera op je telefoon om barcodes te lezen en op te zoeken productinformatie, zoals prijzen en reviews. </p>
12
<p class="imgcenter"><img src="../images/scan-example.png"/></p>
13
<p> Het leest ook 2D barcodes zoals QR Codes en Data Matrix. Deze kunnen links naar websites bevatten, contactgegevens zoals telefoonnummers en e-mailadressen, en nog veel meer. </p>
14
<ul class="touchable">
15
  <li><a href="whatsnew.html"> Wat is nieuw in deze versie </a></li>
16
  <li><a href="scanning.html"> Hoe te scannen </a></li>
17
  <li><a href="about1d.html"> Over 1D barcodes </a></li>
18
  <li><a href="about2d.html"> Over 2D barcodes </a></li>
19
  <li><a href="sharing.html"> Hoe je QR Codes te maken </a></li>
20
  <li><a href="license.html"> Privacy Beleid, Juridische en Licentie-informatie </a></li>    
21
</ul>
22
<p>Vertaald door Google Translate.</p></body>
23
</html>

+ 0 - 30
zxing/src/main/assets/html-nl/license.html

@ -1,30 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
  <meta charset="UTF-8"/>
5
  <title> Privacy Beleid, Juridische en Licentie-informatie </title>
6
  <link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
10
<h3> Privacybeleid </h3>
11
12
<p><strong class="notranslate">Barcode Scanner</strong> geen informatie over haar gebruikers, noch het gebruik van de applicatie niet verzamelen, opslaan of verzenden. De applicatie geeft toegang tot persoonlijke informatie zoals contactpersonen en bookmarks alleen om uitvoering functionaliteit van de applicatie, zoals het delen van contacten en bladwijzers door QR Codes op het scherm. </p>
13
14
<p> Merk op dat deze applicatie naar diensten van derden, zoals Google Books, Google Product Search en Amazon, om aanvullende informatie op te halen na een scan. Deze derden ontvangen en kunnen deze verzoeken inloggen. Ook kan het nodig zijn om het verzoek naar een server die door deze aanvrage om het verzoek voor gebruik met de externe dienst, zoals het ondertekenen van het verzoek transformeren. Geen aanvullende informatie wordt toegevoegd aan de verzoeken naast de zoektermen. </p>
15
16
<p> Merk ook op dat deze applicatie links naar derden websites en applicaties. Weer geen uitzondering zoektermen informatie wordt doorgegeven als deel van deze verbindingen. Deze sites en applicaties staan los van en niet verbonden met deze toepassing, en vallen niet onder dit privacybeleid. </p>
17
18
<h3> Handelsmerken </h3>
19
20
<p><span class="notranslate">Google, Google Books, Google Product Search,
21
Barcode Scanner, ZXing, QR Code, Data Matrix, Aztec</span> zijn handelsmerken van hun respectievelijke eigenaars. </p>
22
23
<h3> Licentie en Copyright </h3>
24
25
<p> Dit project is gebaseerd op het <a class="notranslate" href="https://github.com/zxing/zxing">ZXing</a> open source barcode scanning bibliotheek, en wordt onder de voorwaarden van de licentie aan u <a class="notranslate" href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License 2.0</a> : </p>
26
27
<p style="font-size:200%"><a class="notranslate" href="../html/apache-license.txt">Apache License 2.0</a></p>
28
29
<p>Vertaald door Google Translate.</p></body>
30
</html>

+ 0 - 19
zxing/src/main/assets/html-nl/scanning.html

@ -1,19 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Hoe om te scannen </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Barcode Scanner scant continu een vierkant gebied op uw scherm - net line-up van de telefoon, zodat de barcode is helemaal in de zoeker rechthoek: </p>
10
<p class="imgcenter"><img src="../images/demo-yes.png" style="padding:5px"/><img src="../images/demo-no.png" style="padding:5px"/></p>
11
<p> 1D barcodes zoals die gevonden op producten vereisen een telefoon met autofocus. Zonder dat zal alleen maar QR Codes en Data Matrix codes zijn leesbaar. </p>
12
<p> Wanneer een barcode wordt gelezen, zal een pieptoon te spelen en zie je de resultaten van de scan, een beschrijving van wat de barcode bevat, en opties om actie te ondernemen op de inhoud. </p>
13
<p> Als u problemen ondervindt bij het scannen, moet u Houd de telefoon stil. Als de camera niet kan scherpstellen, probeer dan het verplaatsen van de telefoon verder of dichter van de barcode. </p>
14
<ul class="touchable">
15
  <li><a href="about1d.html"> Over 1D barcodes </a></li>
16
  <li><a href="about2d.html"> Over 2D barcodes </a></li>
17
</ul>
18
<p>Vertaald door Google Translate.</p></body>
19
</html>

+ 0 - 14
zxing/src/main/assets/html-nl/sharing.html

@ -1,14 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Hoe kan ik QR Codes te creëren </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> In aanvulling op het scannen van 2D-barcodes, kan Barcode Scanner ook het genereren van een QR-code en geeft deze weer op het scherm. Dan kunt u laten zien aan een vriend, en laat ze de streepjescode scannen met hun telefoon: </p>
10
<p class="imgcenter"><img src="../images/scan-from-phone.png"/></p>
11
<p> Om deze functie te gebruiken, drukt u op de knop Menu van de belangrijkste scannen scherm en tik op Delen. Vervolgens kiest u of u een contact, een bladwijzer, een toepassing, of de inhoud van het klembord te delen. Een QR-code wordt automatisch gegenereerd. Als u klaar bent, drukt u op Terug of Home. </p>
12
<p> Om QR Codes van uw computer te genereren, probeer dan de ZXing QR Code Generator: <a href="https://zxing.appspot.com/generator/"> https://zxing.appspot.com/generator/ </a></p>
13
<p>Vertaald door Google Translate.</p></body>
14
</html>

+ 0 - 13
zxing/src/main/assets/html-nl/whatsnew.html

@ -1,13 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Wat is nieuw in Barcode Scanner </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<ul>
10
  <li> Bugfixes </li>
11
</ul>
12
<p>Vertaald door Google Translate.</p></body>
13
</html>

+ 0 - 15
zxing/src/main/assets/html-pt/about1d.html

@ -1,15 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Sobre códigos de barras 1D </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Códigos de barras tradicionais, tais como aqueles impressos nas embalagens dos produtos, são também conhecidos como um código de barras de dimensão. Existem vários tipos comumente usados, incluindo UPC e EAN. Mais semelhante a este: </p>
10
<p class="imgcenter"><img src="../images/big-1d.png"/></p>
11
<p> Estes códigos de barras 1D conter um código único, o qual geralmente descreve um produto, como um CD ou um livro. Você pode olhar este código na internet para pesquisar preços, opiniões, e muito mais. </p>
12
<p> Se você digitalizar um livro, você também pode pesquisar o conteúdo do livro para uma palavra ou frase, e encontrar todas as páginas em que ele aparece: </p>
13
<p class="imgcenter"><img src="../images/search-book-contents.jpg"/></p>
14
<p>Traduzido pelo Google Translate.</p></body>
15
</html>

+ 0 - 28
zxing/src/main/assets/html-pt/about2d.html

@ -1,28 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Sobre códigos de barras 2D </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p><strong> Barcode Scanner </strong> também entende como ler dois códigos de barras bidimensionais, como QR Codes e códigos Data Matrix. Por exemplo, os códigos abaixo contêm um link para a página do Projeto ZXing casa: </p>
10
<p class="imgcenter">
11
  <img src="../images/big-qr.png"/>
12
  <img src="../images/big-datamatrix.png"/>
13
  <img src="../images/big-pdf417.png"/>
14
  <img src="../images/big-aztec.png"/>
15
</p>
16
<p> Você também pode representar informações de contato em um QR Code, e colocá-lo em um cartão de visita ou site. Quando você escaneá-lo, a tela de resultados fornece uma escolha de ações: </p>
17
<p class="imgcenter"><img src="../images/contact-results-screen.jpg"/></p>
18
<p> Além de URLs e informações de contato, QR Codes também pode conter: </p>
19
<ul>
20
  <li> Calendário de eventos, que você pode adicionar ao seu calendário </li>
21
  <li> Os números de telefone, que você pode discar </li>
22
  <li> Números de SMS, que você pode mensagem de texto </li>
23
  <li> Endereços de e-mail, que você pode enviar e-mail </li>
24
  <li> Coordenadas geográficas, que você pode abrir em Mapas </li>
25
  <li> Texto simples, que você pode ler, em seguida, compartilhar com um amigo </li>
26
</ul>
27
<p>Traduzido pelo Google Translate.</p></body>
28
</html>

+ 0 - 23
zxing/src/main/assets/html-pt/index.html

@ -1,23 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Ajuda Barcode Scanner </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> O app Android oficial do projeto de código aberto ZXing:<br/>
10
<a href="https://github.com/zxing/zxing"> https://github.com/zxing/zxing </a></p>
11
<p> Barcode Scanner utiliza a câmera do seu celular para ler códigos de barras e procurar informações sobre o produto, tais como preços e opiniões. </p>
12
<p class="imgcenter"><img src="../images/scan-example.png"/></p>
13
<p> Ele também lê código de barras 2D, tais como QR Codes e matriz de dados. Estes podem conter links para web sites, informações de contato, como números de telefone e endereços de e-mail, e muito mais. </p>
14
<ul class="touchable">
15
  <li><a href="whatsnew.html"> O que há de novo nesta versão </a></li>
16
  <li><a href="scanning.html"> Como digitalizar </a></li>
17
  <li><a href="about1d.html"> Sobre códigos de barras 1D </a></li>
18
  <li><a href="about2d.html"> Sobre códigos de barras 2D </a></li>
19
  <li><a href="sharing.html"> Como criar QR Codes </a></li>
20
  <li><a href="license.html"> Política de Privacidade, Legal e informação de licença </a></li>    
21
</ul>
22
<p>Traduzido pelo Google Translate.</p></body>
23
</html>

+ 0 - 30
zxing/src/main/assets/html-pt/license.html

@ -1,30 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
  <meta charset="UTF-8"/>
5
  <title> Política de Privacidade, Legal e informação de licença </title>
6
  <link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
10
<h3> Política de Privacidade </h3>
11
12
<p><strong class="notranslate">Barcode Scanner</strong> não coletar, armazenar ou transmitir informações sobre seus usuários, nem de uso da aplicação. O aplicativo acessa informações pessoais, como contatos e favoritos apenas para implementar a funcionalidade do aplicativo, tais como a partilha de contactos e favoritos por códigos QR na tela. </p>
13
14
<p> Note que este aplicativo acessa serviços de terceiros, incluindo o Google Books, Google Product Search and Amazon, a fim de obter informações após uma varredura. Esses terceiros podem receber e registrar esses pedidos. Além disso, pode ser necessário enviar o pedido para um servidor operado por esta aplicação, a fim de transformar o pedido para o uso com o serviço de terceira parte, tal como o pedido de assinatura. Nenhuma informação adicional é adicionada aos pedidos, além dos termos da consulta. </p>
15
16
<p> Observe também que as ligações esta aplicação para web sites de terceiros e aplicações. Mais uma vez, nenhuma informação que não seja os termos da consulta são passados como parte desses links. Esses sites e aplicativos são separados e não filiado a esta aplicação, e não são cobertos por esta Política de Privacidade. </p>
17
18
<h3> Marcas </h3>
19
20
<p><span class="notranslate">Google, Google Books, Google Product Search,
21
Barcode Scanner, ZXing, QR Code, Data Matrix, Aztec</span> são marcas comerciais de seus respectivos proprietários. </p>
22
23
<h3> Licença e Direitos de Autor </h3>
24
25
<p> Este projecto baseia-se no <a class="notranslate" href="https://github.com/zxing/zxing">ZXing</a> código de barras de código aberto digitalização da biblioteca, e é licenciado para você de acordo com os termos do <a class="notranslate" href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License 2.0</a> : </p>
26
27
<p style="font-size:200%"><a class="notranslate" href="../html/apache-license.txt">Apache License 2.0</a></p>
28
29
<p>Traduzido pelo Google Translate.</p></body>
30
</html>

+ 0 - 19
zxing/src/main/assets/html-pt/scanning.html

@ -1,19 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Como digitalizar </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Barcode Scanner examina continuamente uma região quadrada mostrado na tela - apenas a linha até o telefone para o código de barras é completamente dentro do retângulo do visor: </p>
10
<p class="imgcenter"><img src="../images/demo-yes.png" style="padding:5px"/><img src="../images/demo-no.png" style="padding:5px"/></p>
11
<p> Códigos de barras 1D como os encontrados em produtos necessitam de um telefone com foco automático. Sem ele, apenas QR Codes e códigos Data Matrix será legível. </p>
12
<p> Quando um código de barras é lido, um sinal sonoro vai jogar e você vai ver os resultados da verificação, uma descrição do que contém o código de barras, e as opções a tomar medidas sobre o conteúdo. </p>
13
<p> Se você está tendo problemas de digitalização, certifique-se de segurar o telefone fixo. Se a câmera não consegue focar, tente mover o telefone mais próximo ou a partir do código de barras. </p>
14
<ul class="touchable">
15
  <li><a href="about1d.html"> Sobre códigos de barras 1D </a></li>
16
  <li><a href="about2d.html"> Sobre códigos de barras 2D </a></li>
17
</ul>
18
<p>Traduzido pelo Google Translate.</p></body>
19
</html>

+ 0 - 14
zxing/src/main/assets/html-pt/sharing.html

@ -1,14 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Como criar QR Codes </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Além de digitalizar códigos de barras 2D, Barcode Scanner também pode gerar um QR Code e exibi-lo na tela. Então você pode mostrá-lo a um amigo, e deixe-escanear o código de barras com o seu telefone: </p>
10
<p class="imgcenter"><img src="../images/scan-from-phone.png"/></p>
11
<p> Para usar esse recurso, pressione o botão Menu a partir do ecrã de digitalização principal e toque em Compartilhar. Em seguida, escolha se você deseja compartilhar um contato, um marcador, um aplicativo, ou o conteúdo da área de transferência. Um QR Code será gerado automaticamente. Quando estiver pronto, pressione Voltar ou Casa. </p>
12
<p> Para gerar QR Codes do seu computador, experimente a Gerador de código QR ZXing: <a href="https://zxing.appspot.com/generator/"> https://zxing.appspot.com/generator/ </a></p>
13
<p>Traduzido pelo Google Translate.</p></body>
14
</html>

+ 0 - 13
zxing/src/main/assets/html-pt/whatsnew.html

@ -1,13 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> O que há de novo no Barcode Scanner </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<ul>
10
  <li> Correções de bugs </li>
11
</ul>
12
<p>Traduzido pelo Google Translate.</p></body>
13
</html>

+ 0 - 15
zxing/src/main/assets/html-ru/about1d.html

@ -1,15 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> О 1D штрих-кодов </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Традиционные штрих-коды, такие как напечатанный на упаковке продукта, также известный как одномерные штрих-коды. Есть несколько типов широко используются, в том числе UPC и EAN. Большинство выглядеть примерно так: </p>
10
<p class="imgcenter"><img src="../images/big-1d.png"/></p>
11
<p> Эти 1D штрих-коды содержат уникальный код, который обычно описывает продукт, как компакт-диск или книгу. Вы можете посмотреть этот код на Интернет, чтобы найти цены, обзоры и многое другое. </p>
12
<p> Если вы сканируете книгу, вы также можете найти в содержании книги слово или фразу, и найти все страницы, где он появляется: </p>
13
<p class="imgcenter"><img src="../images/search-book-contents.jpg"/></p>
14
<p>Перевод Google Translate.</p></body>
15
</html>

+ 0 - 28
zxing/src/main/assets/html-ru/about2d.html

@ -1,28 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> О 2D штрих-кодов </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p><strong> Barcode Scanner </strong> также понимает, как читать двумерные штрих-коды, такие как QR-коды и коды Data Matrix. Например, код ниже, содержат гиперссылки на ZXing домашней странице проекта: </p>
10
<p class="imgcenter">
11
  <img src="../images/big-qr.png"/>
12
  <img src="../images/big-datamatrix.png"/>
13
  <img src="../images/big-pdf417.png"/>
14
  <img src="../images/big-aztec.png"/>
15
</p>
16
<p> Вы также можете представлять контактную информацию в QR Code, и положил его на визитную карточку или веб-сайт. При сканировании она, результатов экрана обеспечивает выбор действий: </p>
17
<p class="imgcenter"><img src="../images/contact-results-screen.jpg"/></p>
18
<p> Кроме того адреса и контактные данные, QR-коды могут также содержать: </p>
19
<ul>
20
  <li> Календарь событий, которые вы можете добавить в свой календарь </li>
21
  <li> Телефонные номера, которые можно набрать </li>
22
  <li> SMS-номера, который вы можете тексте сообщения </li>
23
  <li> Адреса электронной почты, который вы можете по электронной почте </li>
24
  <li> Географические координаты, которые можно открыть в карты </li>
25
  <li> Обычный текст, который можно прочитать, а затем поделиться с другом </li>
26
</ul>
27
<p>Перевод Google Translate.</p></body>
28
</html>

+ 0 - 23
zxing/src/main/assets/html-ru/index.html

@ -1,23 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Помощь Barcode Scanner </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Официальное приложение для Android проекта с открытым ZXing источник:<br/>
10
<a href="https://github.com/zxing/zxing"> https://github.com/zxing/zxing </a></p>
11
<p> Barcode Scanner использует камеру на телефоне, чтобы читать штрих-код и посмотреть информацию о продуктах, таких как цены и отзывы. </p>
12
<p class="imgcenter"><img src="../images/scan-example.png"/></p>
13
<p> Он также читает 2D штрих-коды, такие как QR-коды и Data Matrix. Они могут содержать ссылки на веб-сайты, контактную информацию, такую как номера телефонов и адреса электронной почты и многое другое. </p>
14
<ul class="touchable">
15
  <li><a href="whatsnew.html"> Что нового в этой версии </a></li>
16
  <li><a href="scanning.html"> Как проверить </a></li>
17
  <li><a href="about1d.html"> О 1D штрих-кодов </a></li>
18
  <li><a href="about2d.html"> О 2D штрих-кодов </a></li>
19
  <li><a href="sharing.html"> Как создать QR-коды </a></li>
20
  <li><a href="license.html"> Политика конфиденциальности, Правовая информация и лицензии </a></li>    
21
</ul>
22
<p>Перевод Google Translate.</p></body>
23
</html>

+ 0 - 30
zxing/src/main/assets/html-ru/license.html

@ -1,30 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
  <meta charset="UTF-8"/>
5
  <title> Политика конфиденциальности, Правовая информация и лицензии </title>
6
  <link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
10
<h3> Политика конфиденциальности </h3>
11
12
<p><strong class="notranslate">Barcode Scanner</strong> не собирать, хранить и передавать информацию о своих пользователях, ни использования приложения. Приложение обращается к личной информации, такой как контакты и закладки только в целях реализации функциональности приложений, такие как совместное использование контактов и закладок на QR-коды на экране. </p>
13
14
<p> Заметим, что это приложение обращается сторонних сервисов, в том числе Google Books, Google Product Search и Amazon, для того, чтобы получить дополнительную информацию после сканирования. Эти третьи лица могут получать и регистрировать эти запросы. Кроме того, это может быть необходимо послать запрос на сервер, управляемый этого приложения, с тем чтобы превратить запрос для использования с сторонний сервис, например, подписание запроса. Никакой дополнительной информации не добавляется к запросам помимо запроса. </p>
15
16
<p> Также обратите внимание, что это приложение ссылки на сторонние веб-сайты и приложения. Опять же, никакой информации, кроме терминов запроса не передаются в рамках этих связей. Эти сайты и приложения отдельно и не связанные с данным приложением, и не подпадают под настоящую Политику конфиденциальности. </p>
17
18
<h3> Товарные знаки </h3>
19
20
<p><span class="notranslate">Google, Google Books, Google Product Search,
21
Barcode Scanner, ZXing, QR Code, Data Matrix, Aztec</span> являются торговыми марками их соответствующих владельцев. </p>
22
23
<h3> Лицензии и авторские права </h3>
24
25
<p> Этот проект основан на <a class="notranslate" href="https://github.com/zxing/zxing">ZXing</a> открытые сканирования штрих-кода исходный библиотека и лицензирована для вас в соответствии с условиями <a class="notranslate" href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License 2.0</a> : </p>
26
27
<p style="font-size:200%"><a class="notranslate" href="../html/apache-license.txt">Apache License 2.0</a></p>
28
29
<p>Перевод Google Translate.</p></body>
30
</html>

+ 0 - 19
zxing/src/main/assets/html-ru/scanning.html

@ -1,19 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Как проверить </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Штрих коды непрерывно сканирует площадь области, показанной на экране - просто линия телефона, чтобы штрих-код полностью внутри видоискателя прямоугольника: </p>
10
<p class="imgcenter"><img src="../images/demo-yes.png" style="padding:5px"/><img src="../images/demo-no.png" style="padding:5px"/></p>
11
<p> 1D штрих-кодов как найденные на продукты требуют телефону с автофокусом. Без него, только QR-коды и коды Data Matrix будет развертываемых. </p>
12
<p> Если штрих-код считывается, звуковой сигнал будет играть, и вы увидите результаты проверки, описание того, что штрих-код содержит и варианты принятия решений по содержанию. </p>
13
<p> Если у вас возникли проблемы сканирования, убедитесь, что держать телефон постоянно. Если фотокамера не может сфокусироваться, попробуйте переместить телефон дальше или ближе от штрих-кода. </p>
14
<ul class="touchable">
15
  <li><a href="about1d.html"> О 1D штрих-кодов </a></li>
16
  <li><a href="about2d.html"> О 2D штрих-кодов </a></li>
17
</ul>
18
<p>Перевод Google Translate.</p></body>
19
</html>

+ 0 - 14
zxing/src/main/assets/html-ru/sharing.html

@ -1,14 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Как создать QR-коды </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> В дополнение к сканированию 2D штрих-кодов, штрих-код сканером также может генерировать QR-код и отображает его на экране. Затем вы можете показать его другу, и пусть они сканировать штрих-код с телефона: </p>
10
<p class="imgcenter"><img src="../images/scan-from-phone.png"/></p>
11
<p> Чтобы использовать эту функцию, нажмите кнопку меню на главном экране сканирования и нажмите Отправить. Затем выберите, хотите ли вы поделиться контакт, закладки, приложения или содержимое буфера обмена. QR-код будет сгенерирован автоматически. Когда вы закончите, нажмите кнопку Назад или дома. </p>
12
<p> Для создания QR-коды с компьютера, попробуйте ZXing QR Генератор кода: <a href="https://zxing.appspot.com/generator/"> https://zxing.appspot.com/generator/ </a></p>
13
<p>Перевод Google Translate.</p></body>
14
</html>

+ 0 - 13
zxing/src/main/assets/html-ru/whatsnew.html

@ -1,13 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>Что нового в Barcode Scanner</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<ul>
10
  <li> Исправление ошибок </li>
11
</ul>
12
<p>Перевод Google Translate.</p></body>
13
</html>

+ 0 - 15
zxing/src/main/assets/html-uk/about1d.html

@ -1,15 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Про 1D штрих-коди </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Традиційні штрих коди, такі як на упаковках продуктів, також відомі як одновимірні штрих-коди. Є декілька типів, які широко використовуються, серед них UPC та EAN. Більшість з них виглядає десь так: </p>
10
<p class="imgcenter"><img src="../images/big-1d.png"/></p>
11
<p> Ці 1D штрих-коди містять унікальний код, який описує продукт, як cd-диск чи книгу. Ви можете переглянути цей код в інтернеті, аби відшукати ціни, огляд продукту та багато іншого, що пов'язано з цим кодом. </p>
12
<p> Якщо ви скануєте код книги, тоді також можете відшукати зміст цієї книги, чи фразу з неї: </p>
13
<p class="imgcenter"><img src="../images/search-book-contents.jpg"/></p>
14
</body>
15
</html>

+ 0 - 28
zxing/src/main/assets/html-uk/about2d.html

@ -1,28 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Про 2D штрих-коди </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p><strong> Barcode Scanner </strong> також розуміє, як читати двовимірні штрих-коди, такі як QR-коди чи Data Matrix. Наприклад нижче вказаний код, містить посилання на домашню сторінку проекту ZXing: </p>
10
<p class="imgcenter">
11
  <img src="../images/big-qr.png"/>
12
  <img src="../images/big-datamatrix.png"/>
13
  <img src="../images/big-pdf417.png"/>
14
  <img src="../images/big-aztec.png"/>
15
</p>
16
<p> Ви також можете передати контактну інформацію QR-кодом, і розмістити його на візитній картці чи веб-сайті. При скануванні, буде запропоновані доступні дії: </p>
17
<p class="imgcenter"><img src="../images/contact-results-screen.jpg"/></p>
18
<p> Окрім адреси та контактних даних, QR-коди можуть містити: </p>
19
<ul>
20
  <li> Календарні події, які можна додати до свого органайзеру </li>
21
  <li> Телефонні номери, які можна набрати </li>
22
  <li> SMS-номера, на які ви можете надіслати повідомлення </li>
23
  <li> Адреси електронної пошти, на які можна надіслати листа </li>
24
  <li> Географічні координати, які можна відкрити в картах </li>
25
  <li> Звичайний текст, який можна прочитати, а потім поділитися з другом </li>
26
</ul>
27
</body>
28
</html>

+ 0 - 23
zxing/src/main/assets/html-uk/index.html

@ -1,23 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Допомога по Barcode Scanner </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Офіційний додаток для Android з відкритим джерельним кодом на рушію ZXing:<br/>
10
<a href="https://github.com/zxing/zxing"> https://github.com/zxing/zxing </a></p>
11
<p> Barcode Scanner використовує камеру телефону, для зчитування штрих-кодів та пошуку за отриманим кодом інформації, такі як ціни, назви та відгуки. </p>
12
<p class="imgcenter"><img src="../images/scan-example.png"/></p>
13
<p> Він також читає 2D штрих-коди, такі як QR-коди та Data Matrix. Вони можуть містити в собі посилання на веб ресурси, контактну інформацію, такі як номера телефонів та електронні адреси, та багато іншого. </p>
14
<ul class="touchable">
15
  <li><a href="whatsnew.html"> Що нового в цій версії </a></li>
16
  <li><a href="scanning.html"> Як перевірити </a></li>
17
  <li><a href="about1d.html"> Про 1D штрих-код </a></li>
18
  <li><a href="about2d.html"> Про 2D штрих-коди </a></li>
19
  <li><a href="sharing.html"> Як створити QR-код </a></li>
20
  <li><a href="license.html"> Політика конфіденційності. Правова інформація та ліцензії. </a></li>    
21
</ul>
22
</body>
23
</html>

+ 0 - 29
zxing/src/main/assets/html-uk/license.html

@ -1,29 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
  <meta charset="UTF-8"/>
5
  <title> Політика конфіденційності. Правова інформація та ліцензії </title>
6
  <link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
	
10
<h3> Політика конфіденційності </h3>
11
12
<p><strong class="notranslate"> Barcode Scanner </strong> не збирає, не зберігає та не передає інформацію про своїх користувачів. Додаток звертається до особистої інформації, такої як контакти та закладки, тільки для реалізації таких функцій додатку, як сумісне використання контактів та закладок через QR-коди на екрані. </p>
13
14
<p> Зауважимо, що додаток звертається до сторонніх сервісів, в тому числі Google Books, Google Product Search та Amazon, для того, аби отримати додаткову інформацію після сканування. Ці треті учасники можуть отримувати та реєструвати ці запити. Також це може бути необхідним, аби обробити додатком відповідь від сервісу третіх сторін, наприклад для підписання запиту. Ніякої додаткової інформації не додається до запиту. </p>
15
16
<p> Також зверніть увагу на те, що додаток містить посилання на сторонні сайти і додатки. Знову ж таки, ніякої інформації, окрім самого запиту, не передаються за цими посиланнями. Ці сайти та додатки розповсюджуються окремо і на них не розповсюджується ця політика конфіденційності.</p>
17
18
<h3> Товарні знаки </h3>
19
20
<p><span class="notranslate">Google, Google Books, Google Product Search,
21
Barcode Scanner, ZXing, QR Code, Data Matrix, Aztec</span> є торговими марками їх відповідних власників. </p>
22
23
<h3> Ліцензії та авторські права </h3>
24
25
<p> Цей проект заснований на <a class="notranslate" href="https://github.com/zxing/zxing">ZXing</a> - відкрита бібліотека сканування штрих-кодів та ліцензована за умовами <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License 2.0</a> : </p>
26
27
<p style="font-size:200%"><a class="notranslate" href="../html/apache-license.txt">Apache License 2.0</a></p>
28
</body>
29
</html>

+ 0 - 19
zxing/src/main/assets/html-uk/scanning.html

@ -1,19 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Як перевірити </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Штрих коди неперервно шукаються в області, яка вказана на екрані - просто розмістіть штрих-код за лінією, аби він вписався в прямокутник відеошукача: </p>
10
<p class="imgcenter"><img src="../images/demo-yes.png" style="padding:5px"/><img src="../images/demo-no.png" style="padding:5px"/></p>
11
<p> 1D штрих-коди, які зазвичай знаходяться на продуктах, потребують функцію автофокусу вашої камери. Без нього доступні до визначення будуть лише QR-коди та Data Matrix. </p>
12
<p> Якщо штрих-код зчитався, ви почуєте звуковий сигнал та на екран буде виведено результати перевірки. Як правило це опис того, що містить штрих-код. В залежності від вмісту коду будуть запропоновані варіанти дії. </p>
13
<p> Якщо виникли проблеми під час зчитування штрих-коду, переконайтеся, що камеру ви тримаєте рівно. Якщо фотокамера не може сфокусуватися, спробуйте віддалити, чи наблизити телефон від штрих-коду. </p>
14
<ul class="touchable">
15
  <li><a href="about1d.html"> Про 1D штрих-коди </a></li>
16
  <li><a href="about2d.html"> Про 2D штрих-коди </a></li>
17
</ul>
18
</body>
19
</html>

+ 0 - 14
zxing/src/main/assets/html-uk/sharing.html

@ -1,14 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title> Як створити QR-код </title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> Окрім сканування 2D штрих-кодів, додаток може генерувати QR-код та виводити його на екран. Після чого, ви можете показати його другу, аби він міг його відсканувати: </p>
10
<p class="imgcenter"><img src="../images/scan-from-phone.png"/></p>
11
<p> Для використання цієї функції, натисніть кнопку на головному екрані сканування «Відправити». Потім оберіть, чим саме ви бажаєте відправити: контакт, закладку, додаток чи вміст буферу обміну. QR-код буде згенеровано автоматично. Коли ви завершите, натисніть кнопку «Назад» чи «Додому». </p>
12
<p> Для створення QR-кода з комп'ютеру, спробуйте ZXing QR Генератор: <a href="https://zxing.appspot.com/generator/"> https://zxing.appspot.com/generator/ </a></p>
13
</body>
14
</html>

+ 0 - 13
zxing/src/main/assets/html-uk/whatsnew.html

@ -1,13 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>Що нового у Barcode Scanner</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<ul>
10
  <li> Виправлення помилок </li>
11
</ul>
12
<p>Переклад Google Translate.</p></body>
13
</html>

+ 0 - 15
zxing/src/main/assets/html-zh-rCN/about1d.html

@ -1,15 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>关于条形码</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> 传统的条形码,也被称为一维码。常见的条形码有几种(比如 UPC 和 EAN)。下面是一种常见的条形码: </p>
10
<p class="imgcenter"><img src="../images/big-1d.png"/></p>
11
<p> 条形码内含有一些数字或字符。商品或书本背后通常就会有条形码,并且每种商品的条码都不相同。你可以搜索商品条码来获得相应商品的价格、评论等信息。</p>
12
<p> 如果扫描了图书的条码,还可以使用 Google Book Search 在这本书里找某个单词或短语在哪一页。在中国大陆由于特殊国情暂时无法使用此功能。 </p>
13
<p class="imgcenter"><img src="../images/search-book-contents.jpg"/></p>
14
</body>
15
</html>

+ 0 - 29
zxing/src/main/assets/html-zh-rCN/about2d.html

@ -1,29 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>关于二维码</title>
6
<link rel="stylesheet" href="../style.css" type="text/css"/>
7
</head>
8
<body>
9
<p><strong>条码扫描器</strong> 还能扫描二维码(比如 QR 码和 Data Matrix 码)。</p>
10
<p>下面二维码包含了到 zxing 项目官网的链接:</p>
11
<p class="imgcenter">
12
  <img src="../images/big-qr.png"/>
13
  <img src="../images/big-datamatrix.png"/>
14
  <img src="../images/big-pdf417.png"/>
15
  <img src="../images/big-aztec.png"/>
16
</p>
17
<p>也可以将联系方式储存在二维码里,然后把它印在名片或放在网站上。本软件可以识别联系人信息并提示您进行操作:</p>
18
<p class="imgcenter"><img src="../images/contact-results-screen.jpg"/></p>
19
<p>除了网址和联系方式,二维码还可以包含下面的内容:</p>
20
<ul>
21
  <li>日程信息</li>
22
  <li>电话号码</li>
23
  <li>短信号码</li>
24
  <li>电子邮件地址</li>
25
  <li>地理位置信息</li>
26
  <li>纯文本</li>
27
</ul>
28
</body>
29
</html>

+ 0 - 23
zxing/src/main/assets/html-zh-rCN/index.html

@ -1,23 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>帮助</title>
6
<link rel="stylesheet" href="../style.css" type="text/css"/>
7
</head>
8
<body>
9
<p> 这是开源 ZXing 条码扫描器项目的官方 Android 应用。<br/>
10
<a href="https://github.com/zxing/zxing">项目地址</a></p>
11
<p> 条码扫描器可以使用手机的相机来扫描条码,还可以查询产品的信息、价格和评论。</p>
12
<p class="imgcenter"><img src="../images/scan-example.png"/></p>
13
<p> 它还能扫描二维码。二维码也可以包含超链接、联系方式等信息。</p>
14
<ul class="touchable">
15
  <li><a href="whatsnew.html">此版本的新功能</a></li>
16
  <li><a href="scanning.html">使用说明</a></li>
17
  <li><a href="about1d.html">关于条形码</a></li>
18
  <li><a href="about2d.html">关于二维码</a></li>
19
  <li><a href="sharing.html">如何创建二维码</a></li>
20
  <li><a href="license.html">法律信息</a></li>    
21
</ul>
22
</body>
23
</html>

+ 0 - 30
zxing/src/main/assets/html-zh-rCN/license.html

@ -1,30 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
  <meta charset="UTF-8"/>
5
  <title>法律信息</title>
6
  <link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
10
<h3> 隐私政策 </h3>
11
12
<p><strong class="notranslate">Barcode Scanner</strong> 不会收集,储存或传送它的用户,也不使用的应用程序的信息。应用程序访问个人信息,如联系人和书签只是为了实现应用程序的功能,如共享联系人和书签在屏幕上的QR码。 </p>
13
14
<p> 请注意,这个应用程序访问第三方服务,包括产品搜索,谷歌和亚马逊,谷歌图书扫描后,为了获取更多的信息。这些第三方接收和记录这些请求。此外,它可能是必要的,以将请求发送到由该应用程序操作的服务器,以改造用于与第三方服务,如标识请求的请求。没有附加的信息添加到请求除了查询词。 </p>
15
16
<p> 另外请注意,这个应用程序链接到第三方网站和应用程序,如谷歌购物。同样,没有信息查询以外通过这些链接的一部分。这些站点和应用程序是独立的,不属于该应用程序,并且不包括在本隐私政策。 </p>
17
18
<h3> 商标 </h3>
19
20
<p><span class="notranslate">Google, Google Books, Google Product Search,
21
Barcode Scanner, ZXing, QR Code, Data Matrix, Aztec</span> 都是其各自所有者的商标。 </p>
22
23
<h3> 许可和版权 </h3>
24
25
<p> 该项目是基于 <a class="notranslate" href="https://github.com/zxing/zxing">ZXing</a> 开源条形码扫描库,并授权给您的条款下 <a class="notranslate" href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License 2.0</a> : </p>
26
27
<p style="font-size:200%"><a class="notranslate" href="../html/apache-license.txt">Apache License 2.0</a></p>
28
29
<p>由谷歌翻译翻译。</p></body>
30
</html>

+ 0 - 19
zxing/src/main/assets/html-zh-rCN/scanning.html

@ -1,19 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>使用说明</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> 条码扫描器会不断扫描屏幕上的方形区域。请将条码水平放置于扫描方框内。</p>
10
<p class="imgcenter"><img src="../images/demo-yes.png" style="padding:5px"/><img src="../images/demo-no.png" style="padding:5px"/></p>
11
<p> 一维条形码需要手机相机支持自动对焦。如果不支持自动对焦,将只能扫描二维码。 </p>
12
<p> 扫描成功时,会有声音提示,并且屏幕上会显示条码内容以及对应操作。 </p>
13
<p> 如果扫描失败,请尝试稳住你的手机,不要手抖。如果相机不能对焦,则尝试调整相机到条码的距离。 </p>
14
<ul class="touchable">
15
  <li><a href="about1d.html"> 关于条形码 </a></li>
16
  <li><a href="about2d.html"> 关于二维码 </a></li>
17
</ul>
18
</body>
19
</html>

+ 0 - 14
zxing/src/main/assets/html-zh-rCN/sharing.html

@ -1,14 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>如何创建二维码</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p> 除了扫描二维码,条码扫描器还可以创建二维码,并将其显示在屏幕上。你可以让你的朋友扫描你的二维码。 </p>
10
<p class="imgcenter"><img src="../images/scan-from-phone.png"/></p>
11
<p> 要使用此功能,请在主屏幕上点击“分享”。你可以选择想要分享的内容。完成后,按返回键可以回到主屏。 </p>
12
<p> 在电脑上可以使用 ZXing 二维码生成器: <a href="https://zxing.appspot.com/generator/"> https://zxing.appspot.com/generator/ </a></p>
13
</body>
14
</html>

+ 0 - 13
zxing/src/main/assets/html-zh-rCN/whatsnew.html

@ -1,13 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>此版本的新功能</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<ul>
10
  <li> Bug修复 </li>
11
</ul>
12
<p>由谷歌翻译翻译。</p></body>
13
</html>

+ 0 - 15
zxing/src/main/assets/html-zh-rHK/about1d.html

@ -1,15 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>關於一維條碼</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>傳統條碼,如產品包裝上出現的條碼,常被稱為一維條碼。一維條碼中,常見的格式包含 UPC 和 EAN,而大多數看起來像這樣:</p>
10
<p class="imgcenter"><img src="../images/big-1d.png"/></p>
11
<p>這些一維條碼包含一個獨特的編碼,它通常代表一種產品,如一張 CD 或一本書。你可以在網路上搜尋這串數字,在網路上找到價格與評論。</p>
12
<p>如果掃描的是一本書,您也可以對書本的內容進行搜尋:</p>
13
<p class="imgcenter"><img src="../images/search-book-contents.jpg"/></p>
14
</body>
15
</html>

+ 0 - 28
zxing/src/main/assets/html-zh-rHK/about2d.html

@ -1,28 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>關於二維條碼</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p><strong>條碼掃描器</strong>也可以讀取二維條碼,例如 QR Code 和 Data Matrix 條碼。例如,下面的條碼包含 ZXing 計畫的首頁連結:</p>
10
<p class="imgcenter">
11
  <img src="../images/big-qr.png"/>
12
  <img src="../images/big-datamatrix.png"/>
13
  <img src="../images/big-pdf417.png"/>
14
  <img src="../images/big-aztec.png"/>
15
</p>
16
<p>您也可以將聯絡人資訊做成 QR Code,並放在名片或網站上。當您掃描時,掃描結果會提供操作選項:</p>
17
<p class="imgcenter"><img src="../images/contact-results-screen.jpg"/></p>
18
<p>除了網址和聯絡人資訊,QR Code 還可以包含以下內容:</p>
19
<ul>
20
  <li>行事曆事件,可以新增到您的行事曆</li>
21
  <li>電話號碼,可以撥打電話</li>
22
  <li>簡訊號碼,可以發送簡訊</li>
23
  <li>電子郵件地址,可以寄信</li>
24
  <li>地理坐標,可以呈現在地圖上</li>
25
  <li>文字訊息,可以閱讀,並與他人分享</li>
26
</ul>
27
</body>
28
</html>

+ 0 - 23
zxing/src/main/assets/html-zh-rHK/index.html

@ -1,23 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>條碼掃描器說明</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>開放原始碼條碼掃描函式庫 ZXing 的官方 Android app:<br/>
10
<a href="https://github.com/zxing/zxing"> https://github.com/zxing/zxing </a></p>
11
<p>條碼掃描器使用您的 Android 手機鏡頭掃描條碼,並查詢產品的價格和評論等相關訊息。</p>
12
<p class="imgcenter"><img src="../images/scan-example.png"/></p>
13
<p>這個 app 還可以讀取 QR Code 與 Data Matrix 等二維條碼。這些條碼可以包含網站連結,聯絡人資訊(含電話號碼和電子郵件地址)等內容。</p>
14
<ul class="touchable">
15
  <li><a href="whatsnew.html">在這個版本中有什麼新功能</a></li>
16
  <li><a href="scanning.html">如何掃描</a></li>
17
  <li><a href="about1d.html">關於一維條碼</a></li>
18
  <li><a href="about2d.html">關於二維條碼</a></li>
19
  <li><a href="sharing.html">如何建立 QR Code</a></li>
20
  <li><a href="license.html">隱私政策、法律和授權條款</a></li>
21
</ul>
22
</body>
23
</html>

+ 0 - 31
zxing/src/main/assets/html-zh-rHK/license.html

@ -1,31 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
  <meta charset="UTF-8"/>
5
  <title>隱私政策,法律和授權條款</title>
6
  <link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
10
<h3>隱私政策</h3>
11
12
<p><strong class="notranslate">Barcode Scanner</strong> 不收集,儲存或傳送使用者訊息或應用程式的使用情形。本應用程式會存取如聯絡人、書籤等個人資料,僅為提供應用程式功能,例如透過 QR code 分享聯絡人資訊以及書籤。</p>
13
14
<p>請注意,本應用程式在掃描後為取得額外的資訊,會存取第三方服務,例如 Google Books、Google Product Search 以及 Amazon。這些第三方服務會接收,並有可能儲存這些請求。此外,為了轉換成第三方服務可以使用的請求,例如簽署請求,本應用程式可能需要傳送請求到為本應用程式運作的伺服器。除了查詢字外,沒有額外的資訊會加進請求中。</p>
15
16
<p>並請注意,本應用程式會連結到第三方的網站以及應用程式。再次聲明,本應用程式除了查詢字外不會新增額外資訊到連結上。這些網站與應用程式與本程式獨立且無關,不包含在本隱私政策的適用範圍。</p>
17
18
<h3>商標</h3>
19
20
<p><span class="notranslate">Google, Google Books, Google Product Search,
21
Barcode Scanner, ZXing, QR Code, Data Matrix, Aztec</span>
22
均為各自擁有者的商標。</p>
23
24
<h3>授權條款與版權聲明</h3>
25
26
<p>本計畫是基於 <a class="notranslate" href="https://github.com/zxing/zxing">ZXing</a> 開放原始碼條碼掃描函式庫,並以 <a class="notranslate" href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License 2.0</a> 授權條款提供:</p>
27
28
<p style="font-size:200%"><a class="notranslate" href="../html/apache-license.txt">Apache License 2.0</a></p>
29
30
</body>
31
</html>

+ 0 - 21
zxing/src/main/assets/html-zh-rHK/scanning.html

@ -1,21 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>如何掃描</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>條碼掃描器會不斷的掃描您螢幕上方框內的區域 —— 您只需要移動手機,使得完整的條碼顯示在方框內即可:</p>
10
11
<p class="imgcenter"><img src="../images/demo-yes.png" style="padding:5px"/><img src="../images/demo-no.png" style="padding:5px"/></p>
12
<p>一維條碼(如產品上的條碼)需要可以自動對焦的手機,若無自動對焦,只有二維條碼如 QR Code 以及 Data Matrix 條碼能夠掃描。</p>
13
<p>當條碼掃描後,會有嗶聲提示,您將會看到掃描結果、註釋,以及條碼內容的操作選項。</p>
14
<p>如果您在掃描上遇到麻煩,請嘗試握穩您的手機。如果相機無法對焦,請試著調整相機與條碼的距離。</p>
15
16
<ul class="touchable">
17
  <li><a href="about1d.html">關於一維條碼</a></li>
18
  <li><a href="about2d.html">關於二維條碼</a></li>
19
</ul>
20
</body>
21
</html>

+ 0 - 14
zxing/src/main/assets/html-zh-rHK/sharing.html

@ -1,14 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>如何建立 QR Code</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>除了掃描二維條碼,條碼掃描器還可以產生 QR Code 並顯示在螢幕上,並讓別人掃描您手機螢幕上的條碼:</p>
10
<p class="imgcenter"><img src="../images/scan-from-phone.png"/></p>
11
<p>要使用此功能,請在掃描畫面按下選單按鈕,並點選「分享」,然後選擇分享聯絡人、書籤、應用程式或剪貼簿的內容,QR Code 將會自動產生。完成後,請按返回或首頁按鈕。</p>
12
<p>要從您的電腦產生 QR Code,請試用 ZXing QR Code 產生器(英文):<a href="https://zxing.appspot.com/generator/"> https://zxing.appspot.com/generator/ </a></p>
13
</body>
14
</html>

+ 0 - 13
zxing/src/main/assets/html-zh-rHK/whatsnew.html

@ -1,13 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>條碼掃描器更新資訊</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<ul>
10
  <li> Bug修復 </li>
11
</ul>
12
<p>由谷歌翻譯翻譯。</p></body>
13
</html>

+ 0 - 15
zxing/src/main/assets/html-zh-rTW/about1d.html

@ -1,15 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>關於一維條碼</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>傳統條碼,如產品包裝上出現的條碼,常被稱為一維條碼。一維條碼中,常見的格式包含 UPC 和 EAN,而大多數看起來像這樣:</p>
10
<p class="imgcenter"><img src="../images/big-1d.png"/></p>
11
<p>這些一維條碼包含一個獨特的編碼,它通常代表一種產品,如一張 CD 或一本書。你可以在網路上搜尋這串數字,在網路上找到價格與評論。</p>
12
<p>如果掃描的是一本書,您也可以對書本的內容進行搜尋:</p>
13
<p class="imgcenter"><img src="../images/search-book-contents.jpg"/></p>
14
</body>
15
</html>

+ 0 - 28
zxing/src/main/assets/html-zh-rTW/about2d.html

@ -1,28 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>關於二維條碼</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p><strong>條碼掃描器</strong>也可以讀取二維條碼,例如 QR Code 和 Data Matrix 條碼。例如,下面的條碼包含 ZXing 計畫的首頁連結:</p>
10
<p class="imgcenter">
11
  <img src="../images/big-qr.png"/>
12
  <img src="../images/big-datamatrix.png"/>
13
  <img src="../images/big-pdf417.png"/>
14
  <img src="../images/big-aztec.png"/>
15
</p>
16
<p>您也可以將聯絡人資訊做成 QR Code,並放在名片或網站上。當您掃描時,掃描結果會提供操作選項:</p>
17
<p class="imgcenter"><img src="../images/contact-results-screen.jpg"/></p>
18
<p>除了網址和聯絡人資訊,QR Code 還可以包含以下內容:</p>
19
<ul>
20
  <li>行事曆事件,可以新增到您的行事曆</li>
21
  <li>電話號碼,可以撥打電話</li>
22
  <li>簡訊號碼,可以發送簡訊</li>
23
  <li>電子郵件地址,可以寄信</li>
24
  <li>地理坐標,可以呈現在地圖上</li>
25
  <li>文字訊息,可以閱讀,並與他人分享</li>
26
</ul>
27
</body>
28
</html>

+ 0 - 23
zxing/src/main/assets/html-zh-rTW/index.html

@ -1,23 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>條碼掃描器說明</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>開放原始碼條碼掃描函式庫 ZXing 的官方 Android app:<br/>
10
<a href="https://github.com/zxing/zxing"> https://github.com/zxing/zxing </a></p>
11
<p>條碼掃描器使用您的 Android 手機鏡頭掃描條碼,並查詢產品的價格和評論等相關訊息。</p>
12
<p class="imgcenter"><img src="../images/scan-example.png"/></p>
13
<p>這個 app 還可以讀取 QR Code 與 Data Matrix 等二維條碼。這些條碼可以包含網站連結,聯絡人資訊(含電話號碼和電子郵件地址)等內容。</p>
14
<ul class="touchable">
15
  <li><a href="whatsnew.html">在這個版本中有什麼新功能</a></li>
16
  <li><a href="scanning.html">如何掃描</a></li>
17
  <li><a href="about1d.html">關於一維條碼</a></li>
18
  <li><a href="about2d.html">關於二維條碼</a></li>
19
  <li><a href="sharing.html">如何建立 QR Code</a></li>
20
  <li><a href="license.html">隱私政策、法律和授權條款</a></li>
21
</ul>
22
</body>
23
</html>

+ 0 - 31
zxing/src/main/assets/html-zh-rTW/license.html

@ -1,31 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
  <meta charset="UTF-8"/>
5
  <title>隱私政策,法律和授權條款</title>
6
  <link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
10
<h3>隱私政策</h3>
11
12
<p><strong class="notranslate">Barcode Scanner</strong> 不收集,儲存或傳送使用者訊息或應用程式的使用情形。本應用程式會存取如聯絡人、書籤等個人資料,僅為提供應用程式功能,例如透過 QR code 分享聯絡人資訊以及書籤。</p>
13
14
<p>請注意,本應用程式在掃描後為取得額外的資訊,會存取第三方服務,例如 Google Books、Google Product Search 以及 Amazon。這些第三方服務會接收,並有可能儲存這些請求。此外,為了轉換成第三方服務可以使用的請求,例如簽署請求,本應用程式可能需要傳送請求到為本應用程式運作的伺服器。除了查詢字外,沒有額外的資訊會加進請求中。</p>
15
16
<p>並請注意,本應用程式會連結到第三方的網站以及應用程式。再次聲明,本應用程式除了查詢字外不會新增額外資訊到連結上。這些網站與應用程式與本程式獨立且無關,不包含在本隱私政策的適用範圍。</p>
17
18
<h3>商標</h3>
19
20
<p><span class="notranslate">Google, Google Books, Google Product Search,
21
Barcode Scanner, ZXing, QR Code, Data Matrix, Aztec</span>
22
均為各自擁有者的商標。</p>
23
24
<h3>授權條款與版權聲明</h3>
25
26
<p>本計畫是基於 <a class="notranslate" href="https://github.com/zxing/zxing">ZXing</a> 開放原始碼條碼掃描函式庫,並以 <a class="notranslate" href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License 2.0</a> 授權條款提供:</p>
27
28
<p style="font-size:200%"><a class="notranslate" href="../html/apache-license.txt">Apache License 2.0</a></p>
29
30
</body>
31
</html>

+ 0 - 21
zxing/src/main/assets/html-zh-rTW/scanning.html

@ -1,21 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>如何掃描</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>條碼掃描器會不斷的掃描您螢幕上方框內的區域 —— 您只需要移動手機,使得完整的條碼顯示在方框內即可:</p>
10
11
<p class="imgcenter"><img src="../images/demo-yes.png" style="padding:5px"/><img src="../images/demo-no.png" style="padding:5px"/></p>
12
<p>一維條碼(如產品上的條碼)需要可以自動對焦的手機,若無自動對焦,只有二維條碼如 QR Code 以及 Data Matrix 條碼能夠掃描。</p>
13
<p>當條碼掃描後,會有嗶聲提示,您將會看到掃描結果、註釋,以及條碼內容的操作選項。</p>
14
<p>如果您在掃描上遇到麻煩,請嘗試握穩您的手機。如果相機無法對焦,請試著調整相機與條碼的距離。</p>
15
16
<ul class="touchable">
17
  <li><a href="about1d.html">關於一維條碼</a></li>
18
  <li><a href="about2d.html">關於二維條碼</a></li>
19
</ul>
20
</body>
21
</html>

+ 0 - 14
zxing/src/main/assets/html-zh-rTW/sharing.html

@ -1,14 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>如何建立 QR Code</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<p>除了掃描二維條碼,條碼掃描器還可以產生 QR Code 並顯示在螢幕上,並讓別人掃描您手機螢幕上的條碼:</p>
10
<p class="imgcenter"><img src="../images/scan-from-phone.png"/></p>
11
<p>要使用此功能,請在掃描畫面按下選單按鈕,並點選「分享」,然後選擇分享聯絡人、書籤、應用程式或剪貼簿的內容,QR Code 將會自動產生。完成後,請按返回或首頁按鈕。</p>
12
<p>要從您的電腦產生 QR Code,請試用 ZXing QR Code 產生器(英文):<a href="https://zxing.appspot.com/generator/"> https://zxing.appspot.com/generator/ </a></p>
13
</body>
14
</html>

+ 0 - 13
zxing/src/main/assets/html-zh-rTW/whatsnew.html

@ -1,13 +0,0 @@
1
<!DOCTYPE HTML>
2
<html>
3
<head>
4
<meta charset="UTF-8"/>
5
<title>條碼掃描器更新資訊</title>
6
<link href="../style.css" rel="stylesheet" type="text/css"/>
7
</head>
8
<body>
9
<ul>
10
  <li> Bug修復 </li>
11
</ul>
12
<p>由谷歌翻譯翻譯。</p></body>
13
</html>

+ 0 - 201
zxing/src/main/assets/html/apache-license.txt

@ -1,201 +0,0 @@
1
                                 Apache License
2
                           Version 2.0, January 2004
3
                        http://www.apache.org/licenses/
4
5
   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
7
   1. Definitions.
8
9
      "License" shall mean the terms and conditions for use, reproduction,
10
      and distribution as defined by Sections 1 through 9 of this document.
11
12
      "Licensor" shall mean the copyright owner or entity authorized by
13
      the copyright owner that is granting the License.
14
15
      "Legal Entity" shall mean the union of the acting entity and all
16
      other entities that control, are controlled by, or are under common
17
      control with that entity. For the purposes of this definition,
18
      "control" means (i) the power, direct or indirect, to cause the
19
      direction or management of such entity, whether by contract or
20
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
      outstanding shares, or (iii) beneficial ownership of such entity.
22
23
      "You" (or "Your") shall mean an individual or Legal Entity
24
      exercising permissions granted by this License.
25
26
      "Source" form shall mean the preferred form for making modifications,
27
      including but not limited to software source code, documentation
28
      source, and configuration files.
29
30
      "Object" form shall mean any form resulting from mechanical
31
      transformation or translation of a Source form, including but
32
      not limited to compiled object code, generated documentation,
33
      and conversions to other media types.
34
35
      "Work" shall mean the work of authorship, whether in Source or
36
      Object form, made available under the License, as indicated by a
37
      copyright notice that is included in or attached to the work
38
      (an example is provided in the Appendix below).
39
40
      "Derivative Works" shall mean any work, whether in Source or Object
41
      form, that is based on (or derived from) the Work and for which the
42
      editorial revisions, annotations, elaborations, or other modifications
43
      represent, as a whole, an original work of authorship. For the purposes
44
      of this License, Derivative Works shall not include works that remain
45
      separable from, or merely link (or bind by name) to the interfaces of,
46
      the Work and Derivative Works thereof.
47
48
      "Contribution" shall mean any work of authorship, including
49
      the original version of the Work and any modifications or additions
50
      to that Work or Derivative Works thereof, that is intentionally
51
      submitted to Licensor for inclusion in the Work by the copyright owner
52
      or by an individual or Legal Entity authorized to submit on behalf of
53
      the copyright owner. For the purposes of this definition, "submitted"
54
      means any form of electronic, verbal, or written communication sent
55
      to the Licensor or its representatives, including but not limited to
56
      communication on electronic mailing lists, source code control systems,
57
      and issue tracking systems that are managed by, or on behalf of, the
58
      Licensor for the purpose of discussing and improving the Work, but
59
      excluding communication that is conspicuously marked or otherwise
60
      designated in writing by the copyright owner as "Not a Contribution."
61
62
      "Contributor" shall mean Licensor and any individual or Legal Entity
63
      on behalf of whom a Contribution has been received by Licensor and
64
      subsequently incorporated within the Work.
65
66
   2. Grant of Copyright License. Subject to the terms and conditions of
67
      this License, each Contributor hereby grants to You a perpetual,
68
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
      copyright license to reproduce, prepare Derivative Works of,
70
      publicly display, publicly perform, sublicense, and distribute the
71
      Work and such Derivative Works in Source or Object form.
72
73
   3. Grant of Patent License. Subject to the terms and conditions of
74
      this License, each Contributor hereby grants to You a perpetual,
75
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
      (except as stated in this section) patent license to make, have made,
77
      use, offer to sell, sell, import, and otherwise transfer the Work,
78
      where such license applies only to those patent claims licensable
79
      by such Contributor that are necessarily infringed by their
80
      Contribution(s) alone or by combination of their Contribution(s)
81
      with the Work to which such Contribution(s) was submitted. If You
82
      institute patent litigation against any entity (including a
83
      cross-claim or counterclaim in a lawsuit) alleging that the Work
84
      or a Contribution incorporated within the Work constitutes direct
85
      or contributory patent infringement, then any patent licenses
86
      granted to You under this License for that Work shall terminate
87
      as of the date such litigation is filed.
88
89
   4. Redistribution. You may reproduce and distribute copies of the
90
      Work or Derivative Works thereof in any medium, with or without
91
      modifications, and in Source or Object form, provided that You
92
      meet the following conditions:
93
94
      (a) You must give any other recipients of the Work or
95
          Derivative Works a copy of this License; and
96
97
      (b) You must cause any modified files to carry prominent notices
98
          stating that You changed the files; and
99
100
      (c) You must retain, in the Source form of any Derivative Works
101
          that You distribute, all copyright, patent, trademark, and
102
          attribution notices from the Source form of the Work,
103
          excluding those notices that do not pertain to any part of
104
          the Derivative Works; and
105
106
      (d) If the Work includes a "NOTICE" text file as part of its
107
          distribution, then any Derivative Works that You distribute must
108
          include a readable copy of the attribution notices contained
109
          within such NOTICE file, excluding those notices that do not
110
          pertain to any part of the Derivative Works, in at least one
111
          of the following places: within a NOTICE text file distributed
112
          as part of the Derivative Works; within the Source form or
113
          documentation, if provided along with the Derivative Works; or,
114
          within a display generated by the Derivative Works, if and
115
          wherever such third-party notices normally appear. The contents
116
          of the NOTICE file are for informational purposes only and
117
          do not modify the License. You may add Your own attribution
118
          notices within Derivative Works that You distribute, alongside
119
          or as an addendum to the NOTICE text from the Work, provided
120
          that such additional attribution notices cannot be construed
121
          as modifying the License.
122
123
      You may add Your own copyright statement to Your modifications and
124
      may provide additional or different license terms and conditions
125
      for use, reproduction, or distribution of Your modifications, or
126
      for any such Derivative Works as a whole, provided Your use,
127
      reproduction, and distribution of the Work otherwise complies with
128
      the conditions stated in this License.
129
130
   5. Submission of Contributions. Unless You explicitly state otherwise,
131
      any Contribution intentionally submitted for inclusion in the Work
132
      by You to the Licensor shall be under the terms and conditions of
133
      this License, without any additional terms or conditions.
134
      Notwithstanding the above, nothing herein shall supersede or modify
135
      the terms of any separate license agreement you may have executed
136
      with Licensor regarding such Contributions.
137
138
   6. Trademarks. This License does not grant permission to use the trade
139
      names, trademarks, service marks, or product names of the Licensor,
140
      except as required for reasonable and customary use in describing the
141
      origin of the Work and reproducing the content of the NOTICE file.
142
143
   7. Disclaimer of Warranty. Unless required by applicable law or
144
      agreed to in writing, Licensor provides the Work (and each
145
      Contributor provides its Contributions) on an "AS IS" BASIS,
146
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
      implied, including, without limitation, any warranties or conditions
148
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
      PARTICULAR PURPOSE. You are solely responsible for determining the
150
      appropriateness of using or redistributing the Work and assume any
151
      risks associated with Your exercise of permissions under this License.
152
153
   8. Limitation of Liability. In no event and under no legal theory,
154
      whether in tort (including negligence), contract, or otherwise,
155
      unless required by applicable law (such as deliberate and grossly
156
      negligent acts) or agreed to in writing, shall any Contributor be
157
      liable to You for damages, including any direct, indirect, special,
158
      incidental, or consequential damages of any character arising as a
159
      result of this License or out of the use or inability to use the
160
      Work (including but not limited to damages for loss of goodwill,
161
      work stoppage, computer failure or malfunction, or any and all
162
      other commercial damages or losses), even if such Contributor
163
      has been advised of the possibility of such damages.
164
165
   9. Accepting Warranty or Additional Liability. While redistributing
166
      the Work or Derivative Works thereof, You may choose to offer,
167
      and charge a fee for, acceptance of support, warranty, indemnity,
168
      or other liability obligations and/or rights consistent with this
169
      License. However, in accepting such obligations, You may act only
170
      on Your own behalf and on Your sole responsibility, not on behalf
171
      of any other Contributor, and only if You agree to indemnify,
172
      defend, and hold each Contributor harmless for any liability
173
      incurred by, or claims asserted against, such Contributor by reason
174
      of your accepting any such warranty or additional liability.
175
176
   END OF TERMS AND CONDITIONS
177
178
   APPENDIX: How to apply the Apache License to your work.
179
180
      To apply the Apache License to your work, attach the following
181
      boilerplate notice, with the fields enclosed by brackets "[]"
182
      replaced with your own identifying information. (Don't include
183
      the brackets!)  The text should be enclosed in the appropriate
184
      comment syntax for the file format. We also recommend that a
185
      file or class name and description of purpose be included on the
186
      same "printed page" as the copyright notice for easier
187
      identification within third-party archives.
188
189
   Copyright [yyyy] [name of copyright owner]
190
191
   Licensed under the Apache License, Version 2.0 (the "License");
192
   you may not use this file except in compliance with the License.
193
   You may obtain a copy of the License at
194
195
       http://www.apache.org/licenses/LICENSE-2.0
196
197
   Unless required by applicable law or agreed to in writing, software
198
   distributed under the License is distributed on an "AS IS" BASIS,
199
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
   See the License for the specific language governing permissions and
201
   limitations under the License.

BIN
zxing/src/main/assets/images/big-1d.png


BIN
zxing/src/main/assets/images/big-aztec.png


BIN
zxing/src/main/assets/images/big-datamatrix.png


BIN
zxing/src/main/assets/images/big-pdf417.png


BIN
zxing/src/main/assets/images/big-qr.png


BIN
zxing/src/main/assets/images/contact-results-screen.jpg


BIN
zxing/src/main/assets/images/demo-no.png


BIN
zxing/src/main/assets/images/demo-yes.png


BIN
zxing/src/main/assets/images/scan-example.png


BIN
zxing/src/main/assets/images/scan-from-phone.png


BIN
zxing/src/main/assets/images/search-book-contents.jpg


+ 0 - 28
zxing/src/main/assets/style.css

@ -1,28 +0,0 @@
1
body {
2
  background-color: #000000;
3
  color: #FFFFFF;
4
}
5
img {
6
  margin: 3px;
7
}
8
li {
9
  padding-top: 3px;
10
  padding-bottom: 3px;
11
  margin-left: -3px;
12
}
13
ul.touchable li {
14
  padding-top: 8px;
15
  padding-bottom: 8px;
16
}
17
a:link {
18
  color: #FFFFFF;
19
}
20
a:visited {
21
  color: #C0C0C0;
22
}
23
td {
24
  vertical-align: top;
25
}
26
p.imgcenter {
27
  text-align:center;
28
}

+ 93 - 95
zxing/src/main/java/com/google/zxing/client/android/CaptureActivity.java

@ -49,7 +49,6 @@ import android.widget.RelativeLayout;
49 49
import android.widget.TextView;
50 50
import android.widget.Toast;
51 51
52
import com.blankj.utilcode.util.BarUtils;
53 52
import com.blankj.utilcode.util.CacheUtils;
54 53
import com.blankj.utilcode.util.EmptyUtils;
55 54
import com.blankj.utilcode.util.LogUtils;
@ -95,11 +94,12 @@ import pub.devrel.easypermissions.EasyPermissions;
95 94
 * @author dswitkin@google.com (Daniel Switkin)
96 95
 * @author Sean Owen
97 96
 */
98
public final class CaptureActivity extends Activity implements SurfaceHolder.Callback ,EasyPermissions.PermissionCallbacks{
99
    private TextView tv_light,tv_input;
97
public final class CaptureActivity extends Activity implements SurfaceHolder.Callback,
98
        EasyPermissions.PermissionCallbacks {
99
    private TextView tv_light, tv_input;
100 100
    private LoadingDialog loadingDialog;
101
    private LinearLayout ll_light,ll_input;
102
    private ImageView iv_light,iv_back,iv_tip;
101
    private LinearLayout ll_light, ll_input;
102
    private ImageView iv_light, iv_back, iv_tip;
103 103
    private AlertDialogTwo alertDialog;
104 104
    private ArrayList<OperatorPicsBean> operatorPicBeen;
105 105
    private RelativeLayout rl_costway;
@ -125,7 +125,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
125 125
    private CaptureActivityHandler handler;
126 126
    private Result savedResultToShow;
127 127
    private ViewfinderView viewfinderView;
128
    private TextView statusView,tv_cost_type,tv_yue,tv_recharge;
128
    private TextView statusView, tv_cost_type, tv_yue, tv_recharge;
129 129
    private View resultView;
130 130
    private Result lastResult;
131 131
    private boolean hasSurface;
@ -144,7 +144,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
144 144
    private Camera camera;
145 145
    private Camera.Parameters params;
146 146
    private boolean isOpen = false;
147
    private String url="",user_id="",user_password="",user_phone="";
147
    private String url = "", user_id = "", user_password = "", user_phone = "";
148 148
    private long cha;
149 149
    private static final String numType = "1";
150 150
    private static final int checkInterface = 1;
@ -179,7 +179,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
179 179
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
180 180
        setContentView(R.layout.capture);
181 181
        activity = this;
182
        tellList = CacheUtils.getInstance().getString("tellList","");
182
        tellList = CacheUtils.getInstance().getString("tellList", "");
183 183
184 184
        alertDialog = new AlertDialogTwo(CaptureActivity.this);
185 185
@ -204,13 +204,13 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
204 204
            @Override
205 205
            public void onClick(View v) {
206 206
207
                if (!isOpen){
207
                if (!isOpen) {
208 208
//                    CameraManager.openLight();
209 209
                    cameraManager.setTorch(true);
210 210
                    iv_light.setImageResource(R.drawable.icon_light_open);
211 211
                    tv_light.setText("关闭手电筒");
212 212
                    isOpen = true;
213
                }else {
213
                } else {
214 214
//                    CameraManager.closeLight();
215 215
                    cameraManager.setTorch(false);
216 216
                    iv_light.setImageResource(R.drawable.icon_light_close);
@ -270,15 +270,15 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
270 270
271 271
    }
272 272
273
    private void getIntentData(){
273
    private void getIntentData() {
274 274
        url = getIntent().getStringExtra("url");
275 275
        user_id = getIntent().getStringExtra("user_id");
276 276
        user_password = getIntent().getStringExtra("user_password");
277 277
        user_phone = getIntent().getStringExtra("user_phone");
278 278
        LogUtils.e(user_phone);
279
        Log.e(TAG, "getIntentData: "+url );
280
        cha = getIntent().getLongExtra("cha",0);
281
        Log.e(TAG, "getIntentData: "+cha );
279
        Log.e(TAG, "getIntentData: " + url);
280
        cha = getIntent().getLongExtra("cha", 0);
281
        Log.e(TAG, "getIntentData: " + cha);
282 282
        userChargingCheck();
283 283
    }
284 284
@ -331,12 +331,12 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
331 331
332 332
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
333 333
334
    if (prefs.getBoolean(PreferencesActivity.KEY_DISABLE_AUTO_ORIENTATION, true)) {
335
        setRequestedOrientation(getCurrentOrientation());
336
    } else {
337
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); // 旋转
338
        myOrientationDetector.enable(); //启用监听
339
    }
334
        if (prefs.getBoolean(PreferencesActivity.KEY_DISABLE_AUTO_ORIENTATION, true)) {
335
            setRequestedOrientation(getCurrentOrientation());
336
        } else {
337
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); // 旋转
338
            myOrientationDetector.enable(); //启用监听
339
        }
340 340
341 341
342 342
        resetStatusView();
@ -621,7 +621,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
621 621
    public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) {
622 622
623 623
        inactivityTimer.onActivity();
624
        Toast.makeText(getApplicationContext(),rawResult.getText(),Toast.LENGTH_SHORT);
624
        Toast.makeText(getApplicationContext(), rawResult.getText(), Toast.LENGTH_SHORT);
625 625
        lastResult = rawResult;
626 626
        loadingDialog.show();
627 627
        startCharging(rawResult.getText());
@ -950,7 +950,6 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
950 950
    }
951 951
952 952
953
954 953
    MyOrientationDetector myOrientationDetector;
955 954
956 955
    @Override
@ -998,7 +997,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
998 997
            } else {
999 998
                orientation = -1;
1000 999
            }
1001
            if ((orientation == 90  && lastOrientation == 270) || (orientation == 270  && lastOrientation == 90)) {
1000
            if ((orientation == 90 && lastOrientation == 270) || (orientation == 270 && lastOrientation == 90)) {
1002 1001
                Log.i(TAG, "orientation:" + orientation + "lastOrientation:" + lastOrientation);
1003 1002
                Intent intent = getIntent();
1004 1003
                finish();
@ -1021,7 +1020,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
1021 1020
            e.printStackTrace();
1022 1021
        }
1023 1022
        String url = UrlConstants.HOST_URL + "member/get-score?id=" + user_id +
1024
                "&phone=" +user_phone + "&password=" + URLEncoder.encode(user_password) + "&token=" + replace;
1023
                "&phone=" + user_phone + "&password=" + URLEncoder.encode(user_password) + "&token=" + replace;
1025 1024
        LogUtils.e(url);
1026 1025
        OkHttpUtils.get().url(url).build().execute(new StringCallback() {
1027 1026
            @Override
@ -1052,7 +1051,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
1052 1051
1053 1052
                            }
1054 1053
                        });
1055
                        if (!tellList.contains(user_phone)){
1054
                        if (!tellList.contains(user_phone)) {
1056 1055
//                            showNonSecretDialog(money,free_status);
1057 1056
                        }
1058 1057
                    } else {
@ -1070,60 +1069,60 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
1070 1069
        });
1071 1070
    }
1072 1071
1073
    private void showNonSecretDialog(final String money, final String free_status){
1072
    private void showNonSecretDialog(final String money, final String free_status) {
1074 1073
        new Handler().postDelayed(new Runnable() {
1075 1074
            @Override
1076 1075
            public void run() {
1077
                    if (Float.parseFloat(money) > 3 && free_status.equals("0")) {
1078
                        boolean isDestory = true;
1079
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
1080
                            isDestory = CaptureActivity.this.isDestroyed();
1081
                        }
1082
                        if (!CaptureActivity.this.isFinishing() && isDestory == false) {
1083
                            alertDialog.builder()
1084
                                    .setMsg("新增支付宝小额免密支付功能,开通后无需充值,直接充电,快来开通吧")
1085
                                    .setPositiveButton("去开通", new View.OnClickListener() {
1086
                                        @Override
1087
                                        public void onClick(View v) {
1088
                                            Intent intent = new Intent();
1089
                                            intent.setClassName("com.electric.chargingpile",
1090
                                                    "com.electric.chargingpile.activity.NonSecretSeettingActivity");
1091
                                            Uri uri = Uri.parse("chongdianzhuang://");
1092
                                            intent.setData(uri);
1093
                                            startActivity(intent);
1094
                                        }
1095
                                    }).setNegativeButton("忽略", new View.OnClickListener() {
1096
                                @Override
1097
                                public void onClick(View v) {
1076
                if (Float.parseFloat(money) > 3 && free_status.equals("0")) {
1077
                    boolean isDestory = true;
1078
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
1079
                        isDestory = CaptureActivity.this.isDestroyed();
1080
                    }
1081
                    if (!CaptureActivity.this.isFinishing() && isDestory == false) {
1082
                        alertDialog.builder()
1083
                                .setMsg("新增支付宝小额免密支付功能,开通后无需充值,直接充电,快来开通吧")
1084
                                .setPositiveButton("去开通", new View.OnClickListener() {
1085
                                    @Override
1086
                                    public void onClick(View v) {
1087
                                        Intent intent = new Intent();
1088
                                        intent.setClassName("com.electric.chargingpile",
1089
                                                "com.electric.chargingpile.activity.NonSecretSeettingActivity");
1090
                                        Uri uri = Uri.parse("chongdianzhuang://");
1091
                                        intent.setData(uri);
1092
                                        startActivity(intent);
1093
                                    }
1094
                                }).setNegativeButton("忽略", new View.OnClickListener() {
1095
                            @Override
1096
                            public void onClick(View v) {
1098 1097
1099
                                }
1100
                            }).show();
1101
                            tellList += user_phone;
1102
                            CacheUtils.getInstance().put("tellList",tellList);
1103
                        }
1098
                            }
1099
                        }).show();
1100
                        tellList += user_phone;
1101
                        CacheUtils.getInstance().put("tellList", tellList);
1104 1102
                    }
1103
                }
1105 1104
            }
1106 1105
        }, 50);
1107 1106
    }
1108 1107
1109
    private void handlingOperations(String response,int interfaceType){
1110
        LogUtils.e(interfaceType+"---"+response);
1111
        String rtnCode = JsonUtils.getKeyResult(response,"rtnCode");
1112
        String rtnMsg = JsonUtils.getKeyResult(response,"rtnMsg");
1113
        switch (rtnCode){
1108
    private void handlingOperations(String response, int interfaceType) {
1109
        LogUtils.e(interfaceType + "---" + response);
1110
        String rtnCode = JsonUtils.getKeyResult(response, "rtnCode");
1111
        String rtnMsg = JsonUtils.getKeyResult(response, "rtnMsg");
1112
        switch (rtnCode) {
1114 1113
            case "01":
1115
                if (interfaceType == startInterface){
1116
                    String data = JsonUtils.getKeyResult(response,"data");
1117
                    String orderid = JsonUtils.getKeyResult(data,"orderId");
1114
                if (interfaceType == startInterface) {
1115
                    String data = JsonUtils.getKeyResult(response, "data");
1116
                    String orderid = JsonUtils.getKeyResult(data, "orderId");
1118 1117
                    Intent intent = new Intent();
1119 1118
                    intent.setClassName("com.electric.chargingpile",
1120 1119
                            "com.electric.chargingpile.activity.TLDLoadingActivity");
1121
                    intent.putExtra(ChargingConstants.ORDERID,orderid);
1120
                    intent.putExtra(ChargingConstants.ORDERID, orderid);
1122 1121
                    startActivity(intent);
1123 1122
                }
1124 1123
                break;
1125 1124
            case "304":
1126
                if (try304Count > 1){
1125
                if (try304Count > 1) {
1127 1126
                    break;
1128 1127
                }
1129 1128
                try304Count++;
@ -1156,7 +1155,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
1156 1155
                }
1157 1156
                break;
1158 1157
            case "305":
1159
                if (try305Count > 1){
1158
                if (try305Count > 1) {
1160 1159
                    break;
1161 1160
                }
1162 1161
                try305Count++;
@ -1178,7 +1177,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
1178 1177
                }
1179 1178
                break;
1180 1179
            case "309":
1181
                if (try309Count > 1){
1180
                if (try309Count > 1) {
1182 1181
                    break;
1183 1182
                }
1184 1183
                try309Count++;
@ -1200,17 +1199,17 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
1200 1199
                }
1201 1200
                break;
1202 1201
            case "306":
1203
                if (try306Count > 1){
1202
                if (try306Count > 1) {
1204 1203
                    break;
1205 1204
                }
1206 1205
                try306Count++;
1207 1206
                //跳转到充电详情界面
1208
                String data306 = JsonUtils.getKeyResult(response,"data");
1209
                String orderid = JsonUtils.getKeyResult(data306,"orderId");
1207
                String data306 = JsonUtils.getKeyResult(response, "data");
1208
                String orderid = JsonUtils.getKeyResult(data306, "orderId");
1210 1209
                Intent intent306 = new Intent();
1211 1210
                intent306.setClassName("com.electric.chargingpile",
1212 1211
                        "com.electric.chargingpile.activity.ChargingStatusActivity");
1213
                intent306.putExtra(ChargingConstants.ORDERID,orderid);
1212
                intent306.putExtra(ChargingConstants.ORDERID, orderid);
1214 1213
                startActivity(intent306);
1215 1214
                finish();
1216 1215
                break;
@ -1230,7 +1229,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
1230 1229
                }
1231 1230
                break;
1232 1231
            case "311":
1233
                if (try311Count > 1){
1232
                if (try311Count > 1) {
1234 1233
                    break;
1235 1234
                }
1236 1235
                try311Count++;
@ -1253,29 +1252,29 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
1253 1252
                break;
1254 1253
            case "1800":
1255 1254
                //运营商为彭辉时的操作
1256
                String data1800 = JsonUtils.getKeyResult(response,"data");
1257
                String pileId = JsonUtils.getKeyResult(data1800,"pileId");
1255
                String data1800 = JsonUtils.getKeyResult(response, "data");
1256
                String pileId = JsonUtils.getKeyResult(data1800, "pileId");
1258 1257
                Intent intent1800 = new Intent();
1259 1258
                intent1800.setClassName("com.electric.chargingpile",
1260 1259
                        "com.electric.chargingpile.activity.SelectPileActivity");
1261
                intent1800.putExtra(ChargingConstants.ORDERID,pileId);
1260
                intent1800.putExtra(ChargingConstants.ORDERID, pileId);
1262 1261
                startActivity(intent1800);
1263 1262
                break;
1264 1263
            default:
1265 1264
                new Handler().postDelayed(new Runnable() {
1266
                        public void run() {
1267
                            restartPreviewAfterDelay(0L);
1268
                        }
1269
                    }, 1500);
1270
                ToastUtil.showToast(getApplicationContext(),rtnMsg,Toast.LENGTH_SHORT);
1265
                    public void run() {
1266
                        restartPreviewAfterDelay(0L);
1267
                    }
1268
                }, 1500);
1269
                ToastUtil.showToast(getApplicationContext(), rtnMsg, Toast.LENGTH_SHORT);
1271 1270
                break;
1272 1271
        }
1273 1272
    }
1274 1273
1275
    private void userChargingCheck(){
1274
    private void userChargingCheck() {
1276 1275
        OkHttpUtils.get().url(UrlConstants.USER_CHARGING_CHECK_URL)
1277
                .addParams(ChargingConstants.USERID,user_id)
1278
                .addParams(ChargingConstants.PWD,user_password)
1276
                .addParams(ChargingConstants.USERID, user_id)
1277
                .addParams(ChargingConstants.PWD, user_password)
1279 1278
                .build().execute(new StringCallback() {
1280 1279
            @Override
1281 1280
            public void onError(Call call, Exception e) {
@ -1286,22 +1285,22 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
1286 1285
            public void onResponse(String response) {
1287 1286
                LogUtils.e(response);
1288 1287
                if (EmptyUtils.isNotEmpty(response)) {
1289
                    handlingOperations(response,checkInterface);
1288
                    handlingOperations(response, checkInterface);
1290 1289
                }
1291 1290
            }
1292 1291
        });
1293 1292
    }
1294 1293
1295
    private void startCharging(String result){
1294
    private void startCharging(String result) {
1296 1295
        OkHttpUtils.get().url(UrlConstants.START_CHARGING_URL)
1297
                .addParams(ChargingConstants.FLAG,numType)
1298
                .addParams(ChargingConstants.URL,URLEncoder.encode(result))
1299
                .addParams(ChargingConstants.USERID,user_id)
1300
                .addParams(ChargingConstants.PWD,user_password)
1296
                .addParams(ChargingConstants.FLAG, numType)
1297
                .addParams(ChargingConstants.URL, URLEncoder.encode(result))
1298
                .addParams(ChargingConstants.USERID, user_id)
1299
                .addParams(ChargingConstants.PWD, user_password)
1301 1300
                .build().connTimeOut(30000).readTimeOut(30000).execute(new StringCallback() {
1302 1301
            @Override
1303 1302
            public void onError(Call call, Exception e) {
1304
                ToastUtil.showToast(getApplicationContext(),"网络异常,请检查您的网络连接", Toast.LENGTH_SHORT);
1303
                ToastUtil.showToast(getApplicationContext(), "网络异常,请检查您的网络连接", Toast.LENGTH_SHORT);
1305 1304
            }
1306 1305
1307 1306
            @Override
@ -1317,9 +1316,9 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
1317 1316
        });
1318 1317
    }
1319 1318
1320
    private void dismissDialog(){
1319
    private void dismissDialog() {
1321 1320
        if (activity != null && !activity.isFinishing()) {
1322
            if (loadingDialog.isShowing()){
1321
            if (loadingDialog.isShowing()) {
1323 1322
                loadingDialog.dismiss();
1324 1323
            }
1325 1324
@ -1353,8 +1352,8 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
1353 1352
        return EasyPermissions.hasPermissions(this, Manifest.permission.CALL_PHONE);
1354 1353
    }
1355 1354
1356
    private void getOperatorList(){
1357
        String url = UrlConstants.HOST_URL+"suppiler/operator-list";
1355
    private void getOperatorList() {
1356
        String url = UrlConstants.HOST_URL + "suppiler/operator-list";
1358 1357
        OkHttpUtils.get().url(url).build().execute(new StringCallback() {
1359 1358
            @Override
1360 1359
            public void onError(Call call, Exception e) {
@ -1364,8 +1363,9 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
1364 1363
            @Override
1365 1364
            public void onResponse(String response) {
1366 1365
                LogUtils.e(response);
1367
                    Gson g = new Gson();
1368
                    operatorPicBeen = g.fromJson(response,new TypeToken<ArrayList<OperatorPicsBean>>(){}.getType());
1366
                Gson g = new Gson();
1367
                operatorPicBeen = g.fromJson(response, new TypeToken<ArrayList<OperatorPicsBean>>() {
1368
                }.getType());
1369 1369
            }
1370 1370
        });
1371 1371
    }
@ -1456,6 +1456,4 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
1456 1456
//    }
1457 1457
1458 1458
1459
1460
1461 1459
}