Skip to content

Commit f870557

Browse files
committed
✨ 移除第三方图片选择库 lPhotoPicker & 去除 support 包 & 移除 enableJetifier 配置
- 移除 lPhotoPicker 依赖库及其相关配置,使用 Photo Picker API 替换 - 统一使用新的扩展函数 registerForPickMultipleImages 简化图片选择器注册和调用 - 更新 ucrop 库适配 16k - 升级 smartRefreshLayout 版本去掉 support 包,移除 enableJetifier 配置
1 parent 2dfef30 commit f870557

15 files changed

Lines changed: 232 additions & 241 deletions

File tree

build-logic/manager/src/main/kotlin/manager.app-android.gradle.kts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@ android {
1515
targetSdk = libsEx.versions.`android-targetSdk`.toInt()
1616
versionCode = Config.versionCode
1717
versionName = Config.versionName
18-
// 添加以下两句代码,这是 LPhotoPicker 需要设置的东西
19-
renderscriptTargetApi = libsEx.versions.`android-targetSdk`.toInt() //版本号请与compileSdkVersion保持一致
20-
renderscriptSupportModeEnabled = true
2118
}
2219
buildTypes {
2320
release {

cyxbs-components/config/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ kotlin {
1919
implementation(libs.material)
2020
implementation(libs.dialog) // 因为要设置 MaterialDialog 主题所以依赖
2121
implementation(libs.rxjava)
22-
implementation(libs.lPhotoPicker)
2322
}
2423
}
2524
}

cyxbs-components/config/src/androidMain/res/values/styles.xml

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -37,36 +37,6 @@
3737
<item name="cornerSize">50%</item>
3838
</style>
3939

40-
<style name="ConfigLPhotoTheme" parent="LPhotoTheme">
41-
<!--页面通用属性(图片选择、图片预览共用)-->
42-
<item name="l_pp_toolBar_height">56dp</item>
43-
<item name="l_pp_toolBar_backIcon">@drawable/config_ic_back</item><!--返回按钮资源-->
44-
<item name="l_pp_toolBar_title_size">16sp</item><!--toolBar上字体大小-->
45-
<item name="l_pp_bottomBar_height">50dp</item><!--底栏的高度-->
46-
<!--图片选择页面属性-->
47-
<item name="l_pp_status_bar_color">@color/config_photo_select_status_color
48-
</item><!--状态栏颜色-->
49-
<item name="l_pp_toolBar_background">@color/config_photo_select_status_color
50-
</item><!--toolBar颜色-->
51-
<item name="l_pp_picker_activity_bg">@color/config_window_background
52-
</item><!--activity背景颜色-->
53-
<item name="l_pp_toolBar_title_color">@color/config_level_two_font_color
54-
</item><!--(图片选择页面)顶部toolBar字体颜色-->
55-
<item name="l_pp_picker_bottomBar_background">@color/config_window_background
56-
</item><!--底栏的颜色,如果需要毛玻璃效果,颜色加上透明度-->
57-
<item name="l_pp_picker_bottomBar_enabled_text_color">#333333</item><!--底部按钮启用时的颜色-->
58-
59-
<!--图片分割线宽度-->
60-
61-
<!--圆形选择框样式(图片选择、图片预览共用,有特别说明的除外)-->
62-
<item name="l_pp_checkBox_color_tick" format="color">#00FF7F</item><!--勾勾颜色-->
63-
<item name="l_pp_checkBox_duration" format="integer">100</item><!--动画时间-->
64-
<item name="l_pp_checkBox_color_checked" format="color">@color/colorPrimary
65-
</item><!--选择后的背景色-->
66-
<item name="l_pp_checkBox_stroke_width" format="dimension">2dp</item><!--(仅预览页面)圆圈边框宽度-->
67-
<item name="l_pp_checkBox_tick_width" format="dimension">2dp</item><!--勾勾的线条宽度-->
68-
</style>
69-
7040
<style name="ConfigBottomSheetDialogTheme" parent="Theme.Design.BottomSheetDialog" tools:ignore="ResourceName">
7141
<!--dialog是否有边框-->
7242
<item name="android:windowFrame">@null</item>
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
package com.cyxbs.components.utils.extensions
2+
3+
import android.net.Uri
4+
import androidx.activity.result.ActivityResultLauncher
5+
import androidx.activity.result.PickVisualMediaRequest
6+
import androidx.activity.result.contract.ActivityResultContracts
7+
import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageOnly
8+
import androidx.fragment.app.Fragment
9+
import androidx.fragment.app.FragmentActivity
10+
11+
/**
12+
* Android 图片选择器工具类
13+
*
14+
* 使用 Android 官方的 Photo Picker API,无需申请存储权限
15+
* - Android 13+ (API 33+): 使用系统级 Photo Picker
16+
* - Android 13-: 自动降级为传统文件选择器
17+
*
18+
* @author GuoXiangrui
19+
* @time 2026/5/17
20+
*/
21+
22+
23+
/*
24+
* 如果你需要在多平台上使用图片选择器,则可以参考 map 模块中的 UploadPhotoDialog
25+
* 使用多平台文件选择库 FileKit https://github.com/vinceglb/FileKit
26+
*
27+
*
28+
* */
29+
30+
// ==================== Activity 扩展函数 ====================
31+
32+
/**
33+
* 注册多选图片的 ActivityResultLauncher
34+
*
35+
* @param maxImages 最大可选择图片数量,默认 9 张
36+
* @return ActivityResultLauncher<List<Uri>> 用于启动图片选择器
37+
*
38+
* 使用示例:
39+
* ```kotlin
40+
* private val pickImagesLauncher = registerForPickMultipleImages(5) { uris ->
41+
* // 处理选中的图片 URI 列表
42+
* if (uris.isNotEmpty()) {
43+
* handleSelectedImages(uris)
44+
* }
45+
* }
46+
*
47+
* // 启动选择器
48+
* pickImagesLauncher.launchPickImages()
49+
* ```
50+
*/
51+
fun FragmentActivity.registerForPickMultipleImages(
52+
maxImages: Int = 9,
53+
onResult: (List<Uri>) -> Unit
54+
): ActivityResultLauncher<PickVisualMediaRequest> {
55+
return registerForActivityResult(
56+
ActivityResultContracts.PickMultipleVisualMedia(maxImages)
57+
) { uris ->
58+
onResult(uris)
59+
}
60+
}
61+
62+
/**
63+
* 注册单选图片的 ActivityResultLauncher
64+
*
65+
* @return ActivityResultLauncher<Uri?> 用于启动图片选择器
66+
*
67+
* 使用示例:
68+
* ```kotlin
69+
* private val pickImageLauncher = registerForPickSingleImage { uri ->
70+
* // 处理选中的图片 URI
71+
* uri?.let {
72+
* handleSelectedImage(it)
73+
* }
74+
* }
75+
*
76+
* // 启动选择器
77+
* pickImageLauncher.launchPickImages()
78+
* ```
79+
*/
80+
fun FragmentActivity.registerForPickSingleImage(
81+
onResult: (Uri?) -> Unit
82+
): ActivityResultLauncher<PickVisualMediaRequest> {
83+
return registerForActivityResult(
84+
ActivityResultContracts.PickVisualMedia()
85+
) { uri ->
86+
onResult(uri)
87+
}
88+
}
89+
90+
// ==================== Fragment 扩展函数 ====================
91+
92+
/**
93+
* Fragment 中注册多选图片的 ActivityResultLauncher
94+
*
95+
* @param maxImages 最大可选择图片数量,默认 9 张
96+
* @return ActivityResultLauncher<List<Uri>> 用于启动图片选择器
97+
*/
98+
fun Fragment.registerForPickMultipleImages(
99+
maxImages: Int = 9,
100+
onResult: (List<Uri>) -> Unit
101+
): ActivityResultLauncher<PickVisualMediaRequest> {
102+
return registerForActivityResult(
103+
ActivityResultContracts.PickMultipleVisualMedia(maxImages)
104+
) { uris ->
105+
onResult(uris)
106+
}
107+
}
108+
109+
/**
110+
* Fragment 中注册单选图片的 ActivityResultLauncher
111+
*
112+
* @return ActivityResultLauncher<Uri?> 用于启动图片选择器
113+
*/
114+
fun Fragment.registerForPickSingleImage(
115+
onResult: (Uri?) -> Unit
116+
): ActivityResultLauncher<PickVisualMediaRequest> {
117+
return registerForActivityResult(
118+
ActivityResultContracts.PickVisualMedia()
119+
) { uri ->
120+
onResult(uri)
121+
}
122+
}
123+
124+
// ==================== 便捷启动函数 ====================
125+
126+
/**
127+
* 启动多选图片选择器(仅图片)
128+
*
129+
* 使用示例:
130+
* ```kotlin
131+
* pickImagesLauncher.launchPickImages()
132+
* ```
133+
*/
134+
fun ActivityResultLauncher<PickVisualMediaRequest>.launchPickImages() {
135+
this.launch(PickVisualMediaRequest(ImageOnly))
136+
}
137+
138+
/**
139+
* 启动多选图片选择器(图片和视频)
140+
*
141+
* 使用示例:
142+
* ```kotlin
143+
* pickMediaLauncher.launchPickImagesAndVideos()
144+
* ```
145+
*/
146+
fun ActivityResultLauncher<PickVisualMediaRequest>.launchPickImagesAndVideos() {
147+
this.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageAndVideo))
148+
}
149+
150+
/**
151+
* 启动多选图片选择器(仅视频)
152+
*
153+
* 使用示例:
154+
* ```kotlin
155+
* pickVideosLauncher.launchPickVideos()
156+
* ```
157+
*/
158+
fun ActivityResultLauncher<PickVisualMediaRequest>.launchPickVideos() {
159+
this.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.VideoOnly))
160+
}
161+
162+
/**
163+
* 启动多选图片选择器(指定 MIME 类型)
164+
*
165+
* @param mimeType MIME 类型,例如 "image/gif"
166+
*
167+
* 使用示例:
168+
* ```kotlin
169+
* pickGifLauncher.launchPickByMimeType("image/gif")
170+
* ```
171+
*/
172+
fun ActivityResultLauncher<PickVisualMediaRequest>.launchPickByMimeType(mimeType: String) {
173+
this.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.SingleMimeType(mimeType)))
174+
}

cyxbs-pages/map/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ kotlin {
2323
implementation(projects.libCommon) // TODO common 模块不再使用,新模块请依赖 base 和 utils 模块
2424
implementation(libs.bundles.projectBase)
2525
implementation(libs.bundles.views)
26-
implementation(libs.lPhotoPicker)
2726
implementation(libs.glide)
2827
// https://github.com/davemorrissey/subsampling-scale-image-view?tab=readme-ov-file
2928
// 地图加载需要的大图浏览控件

cyxbs-pages/map/src/androidMain/kotlin/com/cyxbs/pages/map/ui/activity/MapActivity.kt

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.cyxbs.pages.map.ui.activity
22

33
import android.app.Activity
44
import android.content.Context
5-
import android.content.Intent
65
import android.database.Cursor
76
import android.net.Uri
87
import android.os.Bundle
@@ -14,6 +13,8 @@ import androidx.lifecycle.Observer
1413
import com.cyxbs.components.base.ui.BaseActivity
1514
import com.cyxbs.components.config.route.COURSE_POS_TO_MAP
1615
import com.cyxbs.components.config.route.DISCOVER_MAP
16+
import com.cyxbs.components.utils.extensions.launchPickImages
17+
import com.cyxbs.components.utils.extensions.registerForPickMultipleImages
1718
import com.cyxbs.pages.map.R
1819
import com.cyxbs.pages.map.model.DataSet
1920
import com.cyxbs.pages.map.ui.fragment.AllPictureFragment
@@ -24,7 +25,6 @@ import com.cyxbs.pages.map.viewmodel.MapViewModel
2425
import com.cyxbs.pages.map.widget.GlideProgressDialog
2526
import com.cyxbs.pages.map.widget.ProgressDialog
2627
import com.g985892345.provider.api.annotation.KClassProvider
27-
import top.limuyang2.photolibrary.LPhotoHelper
2828

2929
/**
3030
* 单activity模式,所有fragment在此activity下,能拿到同一个viewModel实例
@@ -38,6 +38,23 @@ class MapActivity : BaseActivity() {
3838

3939
private val viewModel by viewModels<MapViewModel>()
4040

41+
/**
42+
* 注册新的图片选择器(最多9张)
43+
*/
44+
private val pickImagesLauncher = registerForPickMultipleImages(9) { uris ->
45+
if (uris.isNotEmpty()) {
46+
// 将 URI 转换为路径
47+
val pictureListPath = ArrayList<String>()
48+
uris.forEach { uri ->
49+
pictureListPath.add(uri.getAbsolutePath(this))
50+
}
51+
52+
// 上传图片
53+
ProgressDialog.show(this, getString(R.string.map_upload_picture_running), getString(R.string.map_please_a_moment_text), false)
54+
viewModel.uploadPicture(pictureListPath, this)
55+
}
56+
}
57+
4158
private val fragmentManager = supportFragmentManager
4259
private var mainFragment = MainFragment()
4360
private var favoriteEditFragment = FavoriteEditFragment()
@@ -60,6 +77,11 @@ class MapActivity : BaseActivity() {
6077
viewModel.searchShowState.observe {
6178
onBackPressedCallback.isEnabled = it
6279
}
80+
81+
// 监听图片选择事件
82+
viewModel.triggerImagePicker.observe(this) {
83+
pickImagesLauncher.launchPickImages()
84+
}
6385

6486
val openString = intent.getStringExtra(COURSE_POS_TO_MAP)
6587
/**
@@ -147,33 +169,6 @@ class MapActivity : BaseActivity() {
147169
GlideProgressDialog.hide()
148170
}
149171

150-
151-
override fun onActivityResult(
152-
requestCode: Int,
153-
resultCode: Int,
154-
data: Intent?
155-
) {
156-
super.onActivityResult(requestCode, resultCode, data)
157-
if (requestCode == MapViewModel.PICTURE_SELECT && resultCode == Activity.RESULT_OK) {
158-
/**
159-
* 从图片选择框选择照片后
160-
*/
161-
val pictureList = ArrayList((LPhotoHelper.getSelectedPhotos(data)).map {
162-
it.toString()
163-
})
164-
//上面获得的是UriString,转换下
165-
val pictureListPath = ArrayList<String>()
166-
pictureList.forEach { pictureListPath.add(Uri.parse(it).getAbsolutePath(this)) }
167-
168-
/**
169-
* 上传图片
170-
* 只需把路径列表pictureList传入,context传入即可
171-
*/
172-
ProgressDialog.show(this, getString(R.string.map_upload_picture_running), getString(R.string.map_please_a_moment_text), false)
173-
viewModel.uploadPicture(pictureListPath, this)
174-
}
175-
}
176-
177172
private fun Uri.getAbsolutePath(context: Context): String{
178173
val selectedImage = this
179174
val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)

0 commit comments

Comments
 (0)