android:PictureSelector

https://github.com/LuckSiege/PictureSelector

https://github.com/yechaoa/PictureSelectorDemo

PictureSelector 2.0

一款针对android平台下的图片选择器,支持从相册或拍照选择图片或视频、音频,支持动态权限获取、裁剪(单图or多图裁剪)、压缩、主题自定义配置等功能、适配android 6.0+系统的开源图片选择框架。

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” />

方式一 compile引入

dependencies {
    implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.2.3'
}

项目根目录build.gradle加入

allprojects {
   repositories {
      jcenter()
      maven { url 'https://jitpack.io' }
   }
}
// 进入相册 以下是例子:用不到的api可以不写
 PictureSelector.create(MainActivity.this)
    .openGallery()//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
    .theme()//主题样式(不设置为默认样式) 也可参考demo values/styles下 例如:R.style.picture.white.style
    .maxSelectNum()// 最大图片选择数量 int
    .minSelectNum()// 最小选择数量 int
    .imageSpanCount(4)// 每行显示个数 int
    .selectionMode()// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE
    .previewImage()// 是否可预览图片 true or false
    .previewVideo()// 是否可预览视频 true or false
    .enablePreviewAudio() // 是否可播放音频 true or false
    .isCamera()// 是否显示拍照按钮 true or false
    .imageFormat(PictureMimeType.PNG)// 拍照保存图片格式后缀,默认jpeg
    .isZoomAnim(true)// 图片列表点击 缩放效果 默认true
    .sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效
    .setOutputCameraPath("/CustomPath")// 自定义拍照保存路径,可不填
    .enableCrop()// 是否裁剪 true or false
    .compress()// 是否压缩 true or false
    .glideOverride()// int glide 加载宽高,越小图片列表越流畅,但会影响列表图片浏览的清晰度
    .withAspectRatio()// int 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
    .hideBottomControls()// 是否显示uCrop工具栏,默认不显示 true or false
    .isGif()// 是否显示gif图片 true or false
    .compressSavePath(getPath())//压缩图片保存地址
    .freeStyleCropEnabled()// 裁剪框是否可拖拽 true or false
    .circleDimmedLayer()// 是否圆形裁剪 true or false
    .showCropFrame()// 是否显示裁剪矩形边框 圆形裁剪时建议设为false   true or false
    .showCropGrid()// 是否显示裁剪矩形网格 圆形裁剪时建议设为false    true or false
    .openClickSound()// 是否开启点击声音 true or false
    .selectionMedia()// 是否传入已选图片 List<LocalMedia> list
    .previewEggs()// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) true or false
    .cropCompressQuality()// 裁剪压缩质量 默认90 int
    .minimumCompressSize(100)// 小于100kb的图片不压缩 
    .synOrAsy(true)//同步true或异步false 压缩 默认同步
    .cropWH()// 裁剪宽高比,设置如果大于图片本身宽高则无效 int 
    .rotateEnabled() // 裁剪是否可旋转图片 true or false
    .scaleEnabled()// 裁剪是否可放大缩小图片 true or false
    .videoQuality()// 视频录制质量 0 or 1 int
    .videoMaxSecond(15)// 显示多少秒以内的视频or音频也可适用 int 
        .videoMinSecond(10)// 显示多少秒以内的视频or音频也可适用 int 
    .recordVideoSecond()//视频秒数录制 默认60s int
    .isDragFrame(false)// 是否可拖动裁剪框(固定)
    .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code     

启动相册并拍照

PictureSelector.create(MainActivity.this)
.openGallery(PictureMimeType.ofImage())
.forResult(PictureConfig.CHOOSE_REQUEST);

单独启动拍照或视频 根据PictureMimeType自动识别

PictureSelector.create(MainActivity.this)
.openCamera(PictureMimeType.ofImage())
.forResult(PictureConfig.CHOOSE_REQUEST);

预览图片

// 预览图片 可自定长按保存路径
*注意 .themeStyle(themeId);不可少,否则闪退…

PictureSelector.create(MainActivity.this).themeStyle(themeId).openExternalPreview(position,
“/custom_file”, selectList);
PictureSelector.create(MainActivity.this).themeStyle(themeId).openExternalPreview(position,
selectList);

预览视频

PictureSelector.create(MainActivity.this).externalPictureVideo(video_path);

结果回调

  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case PictureConfig.CHOOSE_REQUEST:
                    // 图片、视频、音频选择结果回调
                    List<LocalMedia> selectList = PictureSelector.obtainMultipleResult(data);
                    // 例如 LocalMedia 里面返回三种path
                    // 1.media.getPath(); 为原图path
                    // 2.media.getCutPath();为裁剪后path,需判断media.isCut();是否为true  注意:音视频除外
                    // 3.media.getCompressPath();为压缩后path,需判断media.isCompressed();是否为true  注意:音视频除外
                    // 如果裁剪并压缩了,以取压缩路径为准,因为是先裁剪后压缩的
                    adapter.setList(selectList);
                    adapter.notifyDataSetChanged();
                    break;
            }
        }
    }
常见错误

重要:PictureSelector.create();调用此方法时,在activity中传activity.this,在fragment中请传fragment.this,
影响回调到哪个地方的onActivityResult()。 问题一: rxjava冲突:在app build.gradle下添加
packagingOptions { exclude ‘META-INF/rxjava.properties’ }
问题二: java.lang.NullPointerException: Attempt to invoke virtual
method ‘android.content.res.XmlResourceParser
android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager,
java.lang.String)’ on a null object reference * 注意
从v2.1.3版本中,将不需要配制以下内容 application下添加如下节点: provider
android:name=”android.support.v4.content.FileProvider”
android:authorities=”${applicationId}.provider”
android:exported=”false”
android:grantUriPermissions=”true”>
meta-data
android:name=”android.support.FILE_PROVIDER_PATHS”
android:resource=”@xml/file_paths” />

注意:如已添加其他sdk或项目中已使用过provider节点,
请参考我的博客的解决方案

问题三: 经测试在小米部分低端机中,Fragment调用PictureSelector 2.0 拍照有时内存不足会暂时回收activity,
导致其fragment会重新创建 建议在fragment所依赖的activity加上如下代码: if (savedInstanceState
== null) {
// 添加显示第一个fragment
fragment = new PhotoFragment();
getSupportFragmentManager().beginTransaction().add(R.id.tab_content,
fragment,
PictureConfig.FC_TAG).show(fragment)
.commit();
} else {
fragment = (PhotoFragment) getSupportFragmentManager()
.findFragmentByTag(PictureConfig.FC_TAG); } 这里就是如果是被回收时,则不重新创建 通过tag取出fragment的实例。

问题四: glide冲突 由于PictureSelector 2.0引入的是最新的glide
4.5.0,所以将项目中老版本的glide删除,并且将报错代码换成如下写法: RequestOptions options = new RequestOptions(); options.placeholder(R.drawable.image);
Glide.with(context).load(url).apply(options).into(imageView);

PictureSelector 是一个功能强大的 Android 图片选择器库,它提供了丰富的功能和灵活的配置选项,方便开发者在应用中实现图片选择、拍照、裁剪等操作。 使用 PictureSelector 可以简化开发过程,以下是使用 PictureSelector 的基本步骤: 1. 导入库文件:在项目的 build.gradle 文件中添加依赖关系,引入 PictureSelector 库。 ```groovy dependencies { implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.5.9' } ``` 2. 在 AndroidManifest.xml 文件中添加必要的权限声明,例如读取存储权限和相机权限。 3. 在你的代码中调用 PictureSelector 的 API 来实现图片选择和相关操作。例如,可以在点击事件中调用以下方法来打开图片选择器: ```java PictureSelector.create(Activity.this) .openGallery(PictureMimeType.ofAll()) .maxSelectNum(9) .minSelectNum(1) .imageSpanCount(4) .forResult(PictureConfig.CHOOSE_REQUEST); ``` 4. 处理选择结果:在 onActivityResult 方法中处理选择结果,获取选中的图片路径或者进行其他操作。 ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && requestCode == PictureConfig.CHOOSE_REQUEST) { List<LocalMedia> selectedImages = PictureSelector.obtainMultipleResult(data); // 处理选中的图片路径 for (LocalMedia media : selectedImages) { String imagePath = media.getPath(); // 进行其他操作,如显示图片、上传等 } } } ``` 除了基本的图片选择功能,PictureSelector 还提供了许多其他的配置选项,如压缩图片、裁剪图片、主题样式定制等,可以根据具体需求进行配置和使用。 注意:在使用 PictureSelector 之前,请确保已经阅读并遵守其相关文档和许可协议,以确保合法使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值