Android PictureSelector 从相册、拍照获取图片更改头像

一、导入依赖:

	//glide
    implementation ("com.github.bumptech.glide:glide:4.11.0")
    //PictureSelector图片选择(相册、相机)
    implementation ("com.github.LuckSiege.PictureSelector:picture_library:v2.6.0")

二、创建预览相册工具类

/**
 * 用于PictureSelector预览相册图片列表,可直接复制
 */
public class PictureSelectorGlideUtil implements ImageEngine {

    /**
     * 加载图片
     *
     * @param context
     * @param url
     * @param imageView
     */
    @Override
    public void loadImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
        Glide.with(context)
                .load(url)
                .into(imageView);
    }

    /**
     * 加载网络图片适配长图方案
     * # 注意:此方法只有加载网络图片才会回调
     *
     * @param context
     * @param url
     * @param imageView
     * @param longImageView
     * @param callback      网络图片加载回调监听 {link after version 2.5.1 Please use the #OnImageCompleteCallback#}
     */
    @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);
                            }
                        }
                    }
                });
    }

    /**
     * 加载网络图片适配长图方案
     * # 注意:此方法只有加载网络图片才会回调
     *
     * @param context
     * @param url
     * @param imageView
     * @param longImageView
     * @ 已废弃
     */
    @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);
                            }
                        }
                    }
                });
    }

    /**
     * 加载相册目录
     *
     * @param context   上下文
     * @param url       图片路径
     * @param imageView 承载图片ImageView
     */
    @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);
                    }
                });
    }


    /**
     * 加载gif
     *
     * @param context   上下文
     * @param url       图片路径
     * @param imageView 承载图片ImageView
     */
    @Override
    public void loadAsGifImage(@NonNull Context context, @NonNull String url,
                               @NonNull ImageView imageView) {
        Glide.with(context)
                .asGif()
                .load(url)
                .into(imageView);
    }

    /**
     * 加载图片列表图片
     *
     * @param context   上下文
     * @param url       图片路径
     * @param imageView 承载图片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从底部弹出
        dialog.show()
    }

打开相册选择图片:

private fun openGallery() {
        PictureSelector.create(this)
            .openGallery(PictureMimeType.ofImage())
            .imageEngine(PictureSelectorGlideUtil.createGlideEngine()) // 使用Glide加载图片
            .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()) // 使用Glide加载图片
            .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() {
                    // 取消选择
                }
            })
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值