lmw
2025-04-24 718f31c92e2029d05260810435a2c70cef6e6ce5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
package com.sinata.xqmuse.utils.picture
 
import android.app.Activity
import android.content.Intent
import android.content.pm.ActivityInfo
import androidx.core.content.ContextCompat
import com.luck.picture.lib.PictureSelector
import com.luck.picture.lib.config.PictureConfig
import com.luck.picture.lib.config.PictureMimeType
import com.luck.picture.lib.style.PictureCropParameterStyle
import com.sinata.xqmuse.R
import com.sinata.xqmuse.utils.interfaces.StringCallback
 
 
/**
 * ZhongTian
 * Created by hds with AndroidStudio
 * Contact me by SCKJ Co.,Ltd
 * 2019-12-16 14:57 Monday
 * Description:PictureSelector
 */
object PictureSelectorHelper {
    val CROP_RATIO_AVATAR = intArrayOf(1,1)
    val CROP_RATIO_MOMENT_BG = intArrayOf(5,4)
    val CROP_RATIO_CHAT_BG = intArrayOf(9,16)
 
    val TYPE_AVATAR = 1
    val TYPE_MOMENT_BG = 2
    val TYPE_CHAT_BG = 3
 
    /**
     * 从相册中单选
     */
    @JvmStatic
    fun pickSingleImage(activity:Activity, type:Int = TYPE_AVATAR, enableCrop:Boolean = true){
        val cropRatio = when(type){
            TYPE_MOMENT_BG -> CROP_RATIO_MOMENT_BG
            TYPE_CHAT_BG -> CROP_RATIO_CHAT_BG
            else-> CROP_RATIO_AVATAR
        }
        PictureSelector.create(activity)
            .openGallery(PictureMimeType.ofImage())
            .loadImageEngine(GlideEngine.createGlideEngine())
            .selectionMode(PictureConfig.SINGLE)
            .isSingleDirectReturn(true)
//            .isWeChatStyle(true)
            .isCamera(false)
            .isCompress(true)
            .isEnableCrop(enableCrop)
            .setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
            .circleDimmedLayer(type == TYPE_AVATAR)
            .showCropFrame(type != TYPE_AVATAR) // 是否显示裁剪矩形边框 圆形裁剪时建议设为false
            .showCropGrid(type != TYPE_AVATAR)// 是否显示裁剪矩形网格 圆形裁剪时建议设为false
            .withAspectRatio(cropRatio[0],cropRatio[1])
            .forResult(PictureConfig.CHOOSE_REQUEST)
 
    }
 
    /**
     * 从相册中单选
     */
    @JvmStatic
    fun pickSingleVideo(activity:Activity){
        PictureSelector.create(activity)
            .openGallery(PictureMimeType.ofVideo())
            .loadImageEngine(GlideEngine.createGlideEngine())
            .selectionMode(PictureConfig.SINGLE)
            .isSingleDirectReturn(true)
//            .isWeChatStyle(true)
            .isCamera(false)
            .compress(true)
            .setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
            .forResult(PictureConfig.CHOOSE_REQUEST)
    }
 
 
    /**
     * 从相册中多选
     */
    @JvmStatic
    fun pickMultipleImage(activity:Activity,max:Int){
        PictureSelector.create(activity)
            .openGallery(PictureMimeType.ofImage())
            .loadImageEngine(GlideEngine.createGlideEngine())
            .selectionMode(PictureConfig.MULTIPLE)
//            .isWeChatStyle(true)
            .maxSelectNum(max)
            .setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
            .isCamera(false)
            .compress(true)
            .forResult(PictureConfig.CHOOSE_REQUEST)
    }
 
    /**
     * 从相册中选多图或视频
     */
    @JvmStatic
    fun pickMultipleMedia(activity:Activity,max:Int,enableVideo: Boolean = true){
        PictureSelector.create(activity)
            .openGallery(if (enableVideo) PictureMimeType.ofVideo() else PictureMimeType.ofImage())
            .loadImageEngine(GlideEngine.createGlideEngine())
            .selectionMode(PictureConfig.MULTIPLE)
//            .isWeChatStyle(true)
            .maxSelectNum(max)
            .setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
            .isCamera(true)
            .compress(true)
            .maxVideoSelectNum(1)
            .filterMaxFileSize(10*1024)
            .forResult(PictureConfig.CHOOSE_REQUEST)
    }
 
 
    /**
     * 启动相机拍照
     */
    @JvmStatic
    fun takePicture(activity:Activity, type:Int = TYPE_AVATAR, isCrop:Boolean = true, enableVideo:Boolean = false){
        val cropRatio = when(type){
            TYPE_MOMENT_BG -> CROP_RATIO_MOMENT_BG
            TYPE_CHAT_BG -> CROP_RATIO_CHAT_BG
            else-> CROP_RATIO_AVATAR
        }
        // 裁剪主题
        val mCropParameterStyle = PictureCropParameterStyle(
            ContextCompat.getColor(activity, R.color.picture_color_grey),
            ContextCompat.getColor(activity, R.color.picture_color_grey),
            ContextCompat.getColor(activity, R.color.white),
            true
        )
        PictureSelector.create(activity)
            .openCamera(PictureMimeType.ofImage())
            .compress(true)
            .enableCrop(isCrop)
            .isUseCustomCamera(enableVideo)
            .recordVideoSecond(15)
            .circleDimmedLayer(type == TYPE_AVATAR)
            .showCropFrame(type != TYPE_AVATAR) // 是否显示裁剪矩形边框 圆形裁剪时建议设为false
            .showCropGrid(type != TYPE_AVATAR)// 是否显示裁剪矩形网格 圆形裁剪时建议设为false
            .setPictureCropStyle(mCropParameterStyle)
            .isWeChatStyle(true)
            .withAspectRatio(cropRatio[0],cropRatio[1])
            .loadImageEngine(GlideEngine.createGlideEngine()) // 请参考Demo GlideEngine.java
            .forResult(PictureConfig.REQUEST_CAMERA)
    }
 
    /**
     * 启动相机录制
     */
    @JvmStatic
    fun takeVideo(activity:Activity){
        PictureSelector.create(activity)
            .openCamera(PictureMimeType.ofVideo())
            .compress(true)
            .isUseCustomCamera(false)
            .recordVideoSecond(15)
            .loadImageEngine(GlideEngine.createGlideEngine()) // 请参考Demo GlideEngine.java
            .forResult(PictureConfig.REQUEST_CAMERA)
    }
 
    /**
     * 处理图片返回
     */
    @JvmStatic
    fun onPickResult(requestCode:Int, resultCode:Int, data:Intent?, videoCallback: StringCallback? = null, callback:(paths:List<String>)->Unit){
        if (resultCode==Activity.RESULT_OK){
            when (requestCode) {
                PictureConfig.CHOOSE_REQUEST,PictureConfig.REQUEST_CAMERA -> {
                    // 图片选择结果回调
                    val selectList = PictureSelector.obtainMultipleResult(data)
                    val result = ArrayList<String>()
                    val videos = selectList.filter { PictureMimeType.isHasVideo(it.mimeType) }
                    if (videos.isEmpty()){ //没有视频,处理图片
                        selectList.forEach {
                            if (it.isCompressed){
                                result.add(it.compressPath)
                            }
                        }
                        if (result.isNotEmpty()){
                            callback.invoke(result)
                        }
                    }else if (videos.size != selectList.size){//不全为视频
                    }else if (videos.size>1){
                        videoCallback?.onResult("只能发布一个视频")
                    }else if (videos.size == 1){ //一条视频
                        videoCallback?.onResult(videos[0].realPath)
                    }
                    // 例如 LocalMedia 里面返回五种path
                    // 1.media.getPath(); 为原图path
                    // 2.media.getCutPath();为裁剪后path,需判断media.isCut();是否为true
                    // 3.media.getCompressPath();为压缩后path,需判断media.isCompressed();是否为true
                    // 4.media.getOriginalPath()); media.isOriginal());为true时此字段才有值
                    // 5.media.getAndroidQToPath();为Android Q版本特有返回的字段,此字段有值就用来做上传使用
                    // 如果同时开启裁剪和压缩,则取压缩路径为准因为是先裁剪后压缩
                }
            }
        }
 
    }
}