Android图片选择器PhotoPicker

前言

维护的一个项目的时候发现,项目使用了一个5年前的库,是通过直接拉源码的并改写的方式来实现的。去GitHub找到了这个库PhotoPicker。作者说项目不维护了,建议大家使用zhihu/Matisse。想着换库可能比直接改要麻烦,我就改了下这个库,上传到GitHub自己用了。

分析一下需要注意的地方

  • Glide版本过老,需要升级。
  • target api修改成29,在androidx下要能正常使用。
  • android 7.0的url适配,需要使用FileProvider,设置authority字段。
  • 有需要上传图片文件的情况,拍照之后请通过文件流保存一下图片。
  • 有些方法和字段过时了:在10.0的机子上,通过 MediaStore.Images.Media.DATA字段获取不到图片的路径,得另辟蹊径;api29之前,拍照过后通常是使用广播的形式通知MediaStore刷新,图库才能显示出图片,在29之后就要用想其他办法了。

使用

工程目录下gradle文件添加jetpack依赖:

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

添加权限AndroidManifest.xml

 	<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />

sample使用了第三方库九宫格,添加依赖如下(本库也支持单选,请根据自己情况而定)

dependencies {
	//此处省略...
	
    //9宫格的图片选择
    implementation 'com.jaeger.ninegridimageview:library:1.1.1'
	
	//本地库依赖
    //implementation project(':photopicker')
    //远程依赖
    implementation 'com.github.PengHaiZhuo:PhotoPicker:1.0.1'
}

使用

    /**
     * 当前选择的图片路径
     */
    private ArrayList<String> imagePathsList = new ArrayList<>();
	/**
     * 允许上传照片最大数量
     */
    private static final int INT_MAXSIZE_IMG = 9;
    
    /**
     * 跳转到图片选择器
     * @param position:预览图片需要传当前图片位置,配合imagePathsList使用
     * @param isPick 是否是添加图片
     */
    private void toPickPhoto(int position,boolean isPick){
        if (isPick) {
            PickImageIntent intent = new PickImageIntent(mContext);
            //设置为多选模式
            intent.setSelectModel(SelectMode.MULTI);
            // 是否拍照
            intent.setIsShowCamera(true);
            //设置最多选择照片数量
            if (imagePathsList.size() > 0 && imagePathsList.size() < (INT_MAXSIZE_IMG + 1)) {
                // 最多选择照片数量
                intent.setSelectedCount(INT_MAXSIZE_IMG + 1 - imagePathsList.size());
            } else {
                intent.setSelectedCount(0);
            }
            /*// 已选中的照片地址,用于回显选中状态
            intent.setSelectedPaths(imagePathsList);*/
            startActivityForResult(intent, REQUEST_CAMERA_CODE);
        } else {
        	//预览图片
            PreViewImageIntent intent = new PreViewImageIntent(mContext);
            intent.setCurrentItem(position);
            intent.setPhotoPaths(imagePathsList);
            startActivityForResult(intent, REQUEST_PREVIEW_CODE);
        }
    }

重写onActivityResult方法,获取选择的照片路径列表

	private static final int REQUEST_CAMERA_CODE = 10;
    private static final int REQUEST_PREVIEW_CODE = 20;
     @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode==RESULT_OK){
            switch (requestCode) {
                case REQUEST_CAMERA_CODE:
                    if (data != null) {
                        ArrayList<String> list = data.getStringArrayListExtra(ImagePickerConstract.EXTRA_RESULT);
                        //todo 显示图片
                    }
                    break;
                case REQUEST_PREVIEW_CODE:
                    if (data != null) {
                        ArrayList<String> ListExtra = data.getStringArrayListExtra(ImagePickerConstract.EXTRA_RESULT);
                        if (imagePathsList != null) {
                            imagePathsList.clear();
                        }
                        imagePathsList.addAll(ListExtra);
                        //todo 预览里可能删除了图片,所以需要更新显示的图片
                    }
                    break;
            }
        }
    }

部分截图

图片选择

可以选择文件夹中文件也可以拍照。
Android图片选择器PhotoPicker_第1张图片

预览

使用了PhotoView控件,可放大缩小查看图片
Android图片选择器PhotoPicker_第2张图片

9宫格

Android图片选择器PhotoPicker_第3张图片

Demo地址

可参照:SampleDemo

你可能感兴趣的:(Android)