一款强大的文件选择器-PrimPicker

微信公众号:Android研究院 关注可了解更多的Android知识,专注于移动领域,不知代码还有人生的哲学。 问题或建议,请公众号留言; 如果你觉得文章对你有帮助,欢迎赞赏[1]

PrimPicker

PrimPicker GitHub

PrimPicker is What ?

PrimPicker is a load local image and video selector for Android。

You Can :

  • select images include JPG PNG GIF BMP WEBP
  • select videos include MP4 3GP MPEG AVI
  • you impl image loaders
  • it in Activity or Fragment
  • More to commission find out yourself

select

perview

picker

evice-2018-06-12-104844.png

device-2018-06-12-104907.png

evice-2018-06-12-104805.png

!device-2018-06-12-110014 [320i].gif

How Do I Use ?

Gradle:

repositories {
    jcenter()
}

dependencies {
    compile 'com.prim.lib:prim-picker:1.0.4'
}

Permission:

android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.CAMERA

如果运行Android 6.0+ 需要动态申请权限

Coding: 首先需要设置图片加载器,此处自己实现 ImageEngine 接口,好处:本库不用再导入图片加载库了,防止项目中图片加载库冲突或多个图片加载库

需要注意的是: 加载缩略图设置图片类型为centerCrop(); 加载预览图设置图片类型为fitCenter();

class ImageLoader : ImageEngine {
        override fun loadImageThumbnail(context: Context?, resize: Int, placeholder: Drawable?, view: ImageView?, uri: Uri?) {
            Glide.with(context).load(uri).asBitmap().placeholder(placeholder).override(resize, resize).centerCrop().into(view)
        }

        override fun loadImage(context: Context?, resizeX: Int, resizeY: Int, placeholder: Drawable?, view: ImageView?, uri: Uri?) {
            Glide.with(context).load(uri).asBitmap().placeholder(placeholder).override(resizeX, resizeY).fitCenter().into(view)
        }

        override fun loadGifThumbnail(context: Context?, resize: Int, placeholder: Drawable?, view: ImageView?, uri: Uri?) {
            Glide.with(context).load(uri).asGif().placeholder(placeholder).override(resize, resize).centerCrop().into(view)
        }

        override fun loadGifImage(context: Context?, resizeX: Int, resizeY: Int, placeholder: Drawable?, view: ImageView?, uri: Uri?) {
            Glide.with(context).load(uri).asGif().placeholder(placeholder).override(resizeX, resizeY).into(view)
        }

    }
 /**
     * 设置图片加载器,此处自己实现 ImageEngine 接口,
     * 好处:本库不用再导入图片加载库了,防止项目中图片加载库冲突或多个图片加载库
     *
     * @param imageLoader
     *         图片加载器
     *
     * @return PreviewBuilder
     */
    public PreviewBuilder setImageLoader(ImageEngine imageLoader) {
        this.selectSpec.imageLoader = imageLoader;
        return this;
    }
 ```
select file(选择文件)
      PrimPicker
            .with(this)
            .choose(MimeType.ofImage())
            .setSpanCount(3)
            .setMaxSelected(9)
            .setImageLoader(ImageLoader())
            .setShowSingleMediaType(true)
            .setCapture(true)
            .setDefaultItems(list)
            .lastGo(1001)
get select file date(获取选择文件的数据)

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == 1001 && resultCode == Activity.RESULT_OK) { list = PrimPicker.obtainItemsResult(data) pathlist = PrimPicker.obtainPathResult(data) } }

Get Uri or Path or MediaItem

/** 获取返回值 uri */ public static ArrayListobtainUriResult(Intent data) { return data.getParcelableArrayListExtra(EXTRA_RESULT_SELECTION); }

/** 获取返回值 string path */
public static ArrayList<String> obtainPathResult(Intent data) {
    return data.getStringArrayListExtra(EXTRA_RESULT_SELECTION_PATH);
}

/** 获取返回值 boolean 是否压缩 如压缩需自己处理,本库没有实现该功能 */
public static boolean obtainCompressResult(Intent data) {
    return data.getBooleanExtra(EXTRA_RESULT_COMPRESS, false);
}

/** 获取返回值 MediaItem 追加文件或预览文件时使用 */
public static ArrayList<MediaItem> obtainItemsResult(Intent data) {
    return data.getParcelableArrayListExtra(EXTRA_RESULT_ITEMS);
}
Add File(追加文件)

setDefaultItems(list) 选择文件得到的返回数据List<MediaItem> list 你可以对文件删除部分,想追加新的文件,将对list操作后的数据传入
     PrimPicker
            .with(this)
            .choose(MimeType.ofImage())
            .setSpanCount(3)
            .setMaxSelected(9)
            .setImageLoader(ImageLoader())
            .setShowSingleMediaType(true)
            .setCapture(true)
            .setDefaultItems(list)
            .lastGo(1001)
PerView File(对选择返回后的文件预览)
        PrimPicker
                .with(this)
                .preview(MimeType.ofImage())
                .setImageLoader(ImageLoader())
                .setPreviewItems(list)
                .lastGo(1001)
More API(更多API)

/** * 设置是否可以拍照和录像 * * @param capture * true 会在第一个显示view false 不显示 * * @return SelectBuilder */ public SelectBuilder setCapture(boolean capture) { selectSpec.capture = capture; return this; }

/**
 * 设置是否压缩视频和图片,压缩需要自己实现,此库没有实现该功能
 *
 * @param compress
 *         true 压缩 false 不压缩
 *
 * @return SelectBuilder
 */
public SelectBuilder setCompress(boolean compress) {
    selectSpec.compress = compress;
    return this;
}

/**
 * 设置所选视频的最大时长
 *
 * @param duration
 *         毫秒
 *
 * @return SelectBuilder
 */
public SelectBuilder setSelectVideoMaxDurationS(long duration) {
    selectSpec.selectVideoMaxDuration = duration;
    return this;
}

/**
 * 设置所选视频文件的最大的大小
 *
 * @param size
 *         KB
 *
 * @return SelectBuilder
 */
public SelectBuilder setSelectVideoMaxSizeKB(long size) {
    selectSpec.selectVideoMaxSizeKB = size;
    return this;
}

/**
 * 设置所选视频文件的最大的大小
 *
 * @param size
 *         M
 *
 * @return SelectBuilder
 */
public SelectBuilder setSelectVideoMaxSizeM(long size) {
    selectSpec.selectVideoMaxSizeM = size;
    return this;
}

/**
 * 设置预览界面可否进行选择和取消选择文件的操作,并与选择页面同步
 *
 * @param allow
 *         true 允许 false 不允许
 *
 * @return SelectBuilder
 */
public SelectBuilder setPerAllowSelect(boolean allow) {
    selectSpec.isPerAllowSelect = allow;
    return this;
}

/**
 * 设置点击item 预览点击的item 其他的无法预览
 * 注意此方法和{@link #setClickItemPerOrSelect(boolean) {@link #setPerViewEnable(boolean)}}
 * 两个方法相关setClickItemPerOrSelect setPerViewEnable 都为true时此方法生效,否则此方法不生效
 *
 * @param single
 *         true 只预览点击的item false 点击item如果可以进入预览页 则可以预览所有文件
 *
 * @return SelectBuilder
 */
public SelectBuilder setPerClickShowSingle(boolean single) {
    selectSpec.isPerClickShowSingle = single;
    return this;
}

/**
 * 在之前的数据基础上追加数据
 * 此数据是从选择文件中返回的数据{@link PrimPicker}.obtainItemsResult()
 * 本库没有存储此数据,主要是如果外部对文件数据删除,库中无法修改数据.
 * 所以从选择文件得到的数据,你可以做任何操作,然后将这些数据传入即可.
 *
 * @param mediaItems
 *         之前选择的数据
 *
 * @return SelectBuilder
 */
public SelectBuilder setDefaultItems(ArrayList<MediaItem> mediaItems) {
    selectSpec.mediaItems = mediaItems;
    return this;
}

/**
 * 设置选择器是否具备预览功能,默认开启预览功能
 *
 * @param enable
 *         true 开启预览功能 false 不开启预览功能
 *
 * @return SelectBuilder
 */
public SelectBuilder setPerViewEnable(boolean enable) {
    selectSpec.isPerViewEnable = enable;
    return this;
}

/**
 * 设置点击item 是预览还是选中
 *
 * @param enable
 *         true 点击item预览item ; FALSE 点击item选中item
 *
 * @return
 */
public SelectBuilder setClickItemPerOrSelect(boolean enable) {
    selectSpec.isClickItemPerOrSelect = enable;
    return this;
}

```

Thanks

Matisse source code.

原文发布于微信公众号 - Android研究院(androidlinksu)

原文发表时间:2018-09-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏计算机编程

Android 7.0+ popwindow的适配

说明:网络上大多数都是用的global的方法导致很多情况下全面屏显示不好,底部虚拟按键位置空出,所以正确的方法应该用WindowVisibalDisplay。

1353
来自专栏Android Note

一次代码,建立多次

1513
来自专栏刘望舒

Android包管理机制之PackageInstaller安装APK

在本系列上一篇文章Android包管理机制(一)PackageInstaller的初始化中我们学习了PackageInstaller是如何初始化的,这一篇文章我...

1363
来自专栏向治洪

Android Remote Views

听名字就可以看出,remote views是一种远程view,感觉有点像远程service,其实remote views是view的一个结构,他可以在其他的进程...

1937
来自专栏Android先生

Android App优化之提升你的App启动速度之实例挑战

以之前写的Github App:https://github.com/mingjunli/GithubApp为例.

1063
来自专栏cloudskyme

大话企业级android读书笔记(二)

Android的四大组件 android的管理员:Activity 用户想在屏幕上做什么,怎么处理用户做出不同的操作都由该Activity来管理和调度。 所有有...

3215
来自专栏Android开发指南

7.xmpp版即时聊天

4606
来自专栏androidBlog

WebView的使用及实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

641
来自专栏向治洪

android 网络通信框架volly

1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection...

1945
来自专栏jianhuicode

如何使用融云地图,文件等插件--融云 Android SDK 2.8.0+ Extension 开发文档

转载自融云 Android SDK 2.8.0+ Extension 开发文档 融云 SDK 2.8.0 后对 会话界面输入区域、+号扩展区域、语音消息、Emo...

31810

扫码关注云+社区