1.使用camerax的拍照功能,把图片存储到自定义文件中,那也应该有相册功能
新建相册页面的layout和activity
在activity_album.xml中创建RecyclerView来放图片
2.先创建RecyclerView中的每个item的布局,再把这个布局放到RecyclerView的适配器中
在recycler_view_item.xml中
在PhotoRecyclerView中填充item布局
3.要完成相册就需要获取文件的读写权限
在AndroidManifest.xml中
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
注意:Android6后需在代码中动态请求权限
4.在AlbumActivity.kt中获取指定目录下的图片file传入适配器中,AlBUM_NAME为指定包名
//获取拍照文件下的图片集合传到适配器 val albumDir = File(Environment.getExternalStorageDirectory(), ALBUM_NAME) val fileList = albumDir.listFiles() val files = mutableListOf<File>() files.addAll(fileList) val adapter = PhotoRecyclerViewAdapter(files) recycler_view_album.adapter = adapter
注意:这边获取的是file流的列表传入适配器中,所以指定的适配器也应该为file流列表
class PhotoRecyclerViewAdapter(list: MutableList<File>)
5.完成上面就可以看到指定目录下的图片列表了,这边引入PictureSelector来预览图片
在app下的build.gradle导入依赖
implementation 'io.github.lucksiege:pictureselector:v2.7.3-rc05'
注意:确定PictureSelector中的CameraX依赖是否与自己项目中一致,不然会出现CameraX is not configured properly的bug
6.在AlbumActivity.kt中获取RecyclerView中item的监听事件,并创建图片选择器和需要用到的功能
//RecyclerView中item的监听事件 adapter.listener = object : OnItemClickListener<File>() { override fun onClick(view: View, position: Int, data: File?, viewType: Int) { //定义传入图片选择器中的图片集合 val selectList: MutableList<LocalMedia> = ArrayList() //,遍历file列表,把每个file流中的属性set到这个集合中 for (file in fileList){ var localMedia = LocalMedia() localMedia.path = file.path localMedia.duration = 0 localMedia.position = position localMedia.mimeType = "image/png" selectList.add(localMedia) } //图片选择器的创建和功能配置 PictureSelector.create(this@AlbumActivity) .themeStyle(R.style.picture_default_style) // xml设置主题 //.setPictureWindowAnimationStyle(animationStyle)// 自定义页面启动动画 .setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) // 设置相册Activity方向,不设置默认使用系统 .isNotPreviewDownload(true) // 预览图片长按是否可以下载 //.bindCustomPlayVideoCallback(new MyVideoSelectedPlayCallback(getContext()))// 自定义播放回调控制,用户可以使用自己的视频播放界面 .imageEngine(GlideEngine.createGlideEngine()) // 外部传入图片加载引擎,必传项 .openExternalPreview(position, selectList) } }
7.实现效果