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版本特有返回的字段,此字段有值就用来做上传使用
|
// 如果同时开启裁剪和压缩,则取压缩路径为准因为是先裁剪后压缩
|
}
|
}
|
}
|
|
}
|
}
|