一、导入依赖:
implementation ("com.github.bumptech.glide:glide:4.11.0")
implementation ("com.github.LuckSiege.PictureSelector:picture_library:v2.6.0")
二、创建预览相册工具类
public class PictureSelectorGlideUtil implements ImageEngine {
@Override
public void loadImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
Glide.with(context)
.load(url)
.into(imageView);
}
@Override
public void loadImage(@NonNull Context context, @NonNull String url,
@NonNull ImageView imageView,
SubsamplingScaleImageView longImageView, OnImageCompleteCallback callback) {
Glide.with(context)
.asBitmap()
.load(url)
.into(new ImageViewTarget<Bitmap>(imageView) {
@Override
public void onLoadStarted(@Nullable Drawable placeholder) {
super.onLoadStarted(placeholder);
if (callback != null) {
callback.onShowLoading();
}
}
@Override
public void onLoadFailed(@Nullable Drawable errorDrawable) {
super.onLoadFailed(errorDrawable);
if (callback != null) {
callback.onHideLoading();
}
}
@Override
protected void setResource(@Nullable Bitmap resource) {
if (callback != null) {
callback.onHideLoading();
}
if (resource != null) {
boolean eqLongImage = MediaUtils.isLongImg(resource.getWidth(),
resource.getHeight());
longImageView.setVisibility(eqLongImage ? View.VISIBLE : View.GONE);
imageView.setVisibility(eqLongImage ? View.GONE : View.VISIBLE);
if (eqLongImage) {
longImageView.setQuickScaleEnabled(true);
longImageView.setZoomEnabled(true);
longImageView.setPanEnabled(true);
longImageView.setDoubleTapZoomDuration(100);
longImageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP);
longImageView.setDoubleTapZoomDpi(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER);
longImageView.setImage(ImageSource.bitmap(resource),
new ImageViewState(0, new PointF(0, 0), 0));
} else {
imageView.setImageBitmap(resource);
}
}
}
});
}
@Override
public void loadImage(@NonNull Context context, @NonNull String url,
@NonNull ImageView imageView,
SubsamplingScaleImageView longImageView) {
Glide.with(context)
.asBitmap()
.load(url)
.into(new ImageViewTarget<Bitmap>(imageView) {
@Override
protected void setResource(@Nullable Bitmap resource) {
if (resource != null) {
boolean eqLongImage = MediaUtils.isLongImg(resource.getWidth(),
resource.getHeight());
longImageView.setVisibility(eqLongImage ? View.VISIBLE : View.GONE);
imageView.setVisibility(eqLongImage ? View.GONE : View.VISIBLE);
if (eqLongImage) {
longImageView.setQuickScaleEnabled(true);
longImageView.setZoomEnabled(true);
longImageView.setPanEnabled(true);
longImageView.setDoubleTapZoomDuration(100);
longImageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP);
longImageView.setDoubleTapZoomDpi(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER);
longImageView.setImage(ImageSource.bitmap(resource),
new ImageViewState(0, new PointF(0, 0), 0));
} else {
imageView.setImageBitmap(resource);
}
}
}
});
}
@Override
public void loadFolderImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
Glide.with(context)
.asBitmap()
.load(url)
.override(180, 180)
.centerCrop()
.sizeMultiplier(0.5f)
.apply(new RequestOptions().placeholder(R.mipmap.logo_app))
.into(new BitmapImageViewTarget(imageView) {
@Override
protected void setResource(Bitmap resource) {
RoundedBitmapDrawable circularBitmapDrawable =
RoundedBitmapDrawableFactory.
create(context.getResources(), resource);
circularBitmapDrawable.setCornerRadius(8);
imageView.setImageDrawable(circularBitmapDrawable);
}
});
}
@Override
public void loadAsGifImage(@NonNull Context context, @NonNull String url,
@NonNull ImageView imageView) {
Glide.with(context)
.asGif()
.load(url)
.into(imageView);
}
@Override
public void loadGridImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
Glide.with(context)
.load(url)
.override(200, 200)
.centerCrop()
.apply(new RequestOptions().placeholder(R.mipmap.logo_app))
.into(imageView);
}
private PictureSelectorGlideUtil() {
}
private static PictureSelectorGlideUtil instance;
public static PictureSelectorGlideUtil createGlideEngine() {
if (null == instance) {
synchronized (PictureSelectorGlideUtil.class) {
if (null == instance) {
instance = new PictureSelectorGlideUtil();
}
}
}
return instance;
}
}
三、获取相关权限,弹出Dialog选择相册、相机、取消
AndroidManifest中添加权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
AndroidManifest的application中添加:
android:requestLegacyExternalStorage="true"
mViewBind.rlMyHead.setOnClickListener {
checkPermissions()
}
private fun checkPermissions() {
val permissions = arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
)
val requestPermissions = permissions.filter {
ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED
}
if (requestPermissions.isNotEmpty()) {
ActivityCompat.requestPermissions(
this,
requestPermissions.toTypedArray(),
PERMISSION_REQUEST_CODE
)
} else {
showChangeDialog()
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == PERMISSION_REQUEST_CODE) {
if (grantResults.all { it == PackageManager.PERMISSION_GRANTED }) {
showChangeDialog()
} else {
Toast.makeText(this, "读写和相机权限被拒绝,请在设置中开启权限", Toast.LENGTH_SHORT)
.show()
}
}
}
private fun showChangeDialog() {
val dialog = Dialog(this)
dialog.setContentView(R.layout.change_head_image_dialog_layout)
val tv_Gallery = dialog.findViewById<TextView>(R.id.tv_Gallery)
tv_Gallery.setOnClickListener {
openGallery()
dialog.dismiss()
}
val tv_Camera = dialog.findViewById<TextView>(R.id.tv_Camera)
tv_Camera.setOnClickListener {
openCamera()
dialog.dismiss()
}
val tv_Cancel = dialog.findViewById<TextView>(R.id.tv_Cancel)
tv_Cancel.setOnClickListener {
dialog.dismiss()
}
val window = dialog.window
window?.setGravity(Gravity.BOTTOM)
dialog.show()
}
打开相册选择图片:
private fun openGallery() {
PictureSelector.create(this)
.openGallery(PictureMimeType.ofImage())
.imageEngine(PictureSelectorGlideUtil.createGlideEngine())
.selectionMode(PictureConfig.SINGLE)
.isCamera(true)
.isEnableCrop(true)
.withAspectRatio(1, 1)
.freeStyleCropEnabled(true)
.rotateEnabled(false)
.scaleEnabled(true)
.forResult(object : OnResultCallbackListener<LocalMedia> {
override fun onResult(result: List<LocalMedia>) {
if (result.isNotEmpty()) {
val media = result[0]
val cropPath = media.cutPath
if (cropPath != null) {
val uri = Uri.parse(cropPath)
mViewBind.imageMyHead.setImageURI(uri)
} else {
val uri = Uri.parse(media.path)
mViewBind.imageMyHead.setImageURI(uri)
}
}
}
override fun onCancel() {
}
})
}
打开相机拍照获取图片
private fun openCamera() {
PictureSelector.create(this)
.openCamera(PictureMimeType.ofImage())
.imageEngine(PictureSelectorGlideUtil.createGlideEngine())
.isEnableCrop(true)
.withAspectRatio(1, 1)
.freeStyleCropEnabled(true)
.rotateEnabled(false)
.scaleEnabled(true)
.forResult(object : OnResultCallbackListener<LocalMedia> {
override fun onResult(result: List<LocalMedia>) {
if (result.isNotEmpty()) {
val media = result[0]
val cropPath = media.cutPath
if (cropPath != null) {
val uri = Uri.parse(cropPath)
mViewBind.imageMyHead.setImageURI(uri)
} else {
val uri = Uri.parse(media.path)
mViewBind.imageMyHead.setImageURI(uri)
}
}
}
override fun onCancel() {
}
})
}